单选按钮的自绘实现
2010-07-11 17:13
351 查看
于6月30写完单选按钮代码,记录如下,可自己在create后通过
void LoadNoSelBmp(UINT IdNoCheck);//未点击时的图片
void LoadSelBmp(UINT IdCheck)//点击时的图片
加载各种图片,GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2)来自定义单选按钮的群组也就是IDC_RADIO1到IDC_RADIO2为一组单选按钮
实现方法:
要实现自绘,可以重载Create,加上
dwStyle &= ~(0xF); // remove styles with conflict with group box
dwStyle |= BS_AUTORADIOBUTTON; // add group box style
dwStyle |= BS_OWNERDRAW ;
要保证一组中只有一项是SetCheck(1),可以用遍历方法:
// 这里的目的是把同组内所有radiobutton设置为unCheck
// 首先得到check标志
m_bChecked = (wParam != 0);
if(m_bChecked)
{
CPtrList list;
list.AddTail((void*)m_hWnd);
// 得到父窗口句柄
HWND hWndParent = GetParent()->GetSafeHwnd();
// 得到控件窗口句柄
HWND hWnd = GetSafeHwnd();
while(hWnd)
{
// 得到同组内的空间的窗口句柄
hWnd = ::GetNextDlgGroupItem(hWndParent, hWnd, 0);
CWnd* pWnd = CWnd::FromHandle(hWnd);
if(pWnd)
{
// 得到控件资源ID
int nID = pWnd->GetDlgCtrlID();
}
// 在list中查找这个句柄是否被查询到过(这里就只有第一个Group的控件)
POSITION pos = list.Find((void*)hWnd);
if(pos)
{
// 如果找到了这个句柄,那就代表搜索到头了
hWnd = NULL;
}
if(hWnd)
{
// 没有搜索完一组,那么就把当前的句柄添加到list中去(目的是为了不让同一控件被发送两次消息)
list.AddTail((void*)hWnd);
// 对这个控件发送unChecked的消息
::PostMessage(hWnd, WM_UNCHECKED, 0, 0);
}
}
m_radioState = RADIOSTATE_SELECT;
m_tRadioState = m_radioState;
}
else
{
// 设置当前为checked
m_radioState = RADIOSTATE_UNSELECT;
m_tRadioState = m_radioState;
}
InvalidateRect(NULL);
return 0;
3.自绘在DrawItem中实现,这里动态加载传入的图片ID
要动态加载不同的图片,一定要先Detach(),最后再DelectObject
CDC dc;
CRect rc;
dc.Attach(lpDIS->hDC);
rc = lpDIS->rcItem;
m_bmpCheck.Detach();
m_bmpNoCheck.Detach();
m_bmpCheck.LoadBitmapEx(m_IdCheck);
m_bmpNoCheck.LoadBitmapEx(m_IdNoCheck)
void LoadNoSelBmp(UINT IdNoCheck);//未点击时的图片
void LoadSelBmp(UINT IdCheck)//点击时的图片
加载各种图片,GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2)来自定义单选按钮的群组也就是IDC_RADIO1到IDC_RADIO2为一组单选按钮
实现方法:
要实现自绘,可以重载Create,加上
dwStyle &= ~(0xF); // remove styles with conflict with group box
dwStyle |= BS_AUTORADIOBUTTON; // add group box style
dwStyle |= BS_OWNERDRAW ;
要保证一组中只有一项是SetCheck(1),可以用遍历方法:
// 这里的目的是把同组内所有radiobutton设置为unCheck
// 首先得到check标志
m_bChecked = (wParam != 0);
if(m_bChecked)
{
CPtrList list;
list.AddTail((void*)m_hWnd);
// 得到父窗口句柄
HWND hWndParent = GetParent()->GetSafeHwnd();
// 得到控件窗口句柄
HWND hWnd = GetSafeHwnd();
while(hWnd)
{
// 得到同组内的空间的窗口句柄
hWnd = ::GetNextDlgGroupItem(hWndParent, hWnd, 0);
CWnd* pWnd = CWnd::FromHandle(hWnd);
if(pWnd)
{
// 得到控件资源ID
int nID = pWnd->GetDlgCtrlID();
}
// 在list中查找这个句柄是否被查询到过(这里就只有第一个Group的控件)
POSITION pos = list.Find((void*)hWnd);
if(pos)
{
// 如果找到了这个句柄,那就代表搜索到头了
hWnd = NULL;
}
if(hWnd)
{
// 没有搜索完一组,那么就把当前的句柄添加到list中去(目的是为了不让同一控件被发送两次消息)
list.AddTail((void*)hWnd);
// 对这个控件发送unChecked的消息
::PostMessage(hWnd, WM_UNCHECKED, 0, 0);
}
}
m_radioState = RADIOSTATE_SELECT;
m_tRadioState = m_radioState;
}
else
{
// 设置当前为checked
m_radioState = RADIOSTATE_UNSELECT;
m_tRadioState = m_radioState;
}
InvalidateRect(NULL);
return 0;
3.自绘在DrawItem中实现,这里动态加载传入的图片ID
要动态加载不同的图片,一定要先Detach(),最后再DelectObject
CDC dc;
CRect rc;
dc.Attach(lpDIS->hDC);
rc = lpDIS->rcItem;
m_bmpCheck.Detach();
m_bmpNoCheck.Detach();
m_bmpCheck.LoadBitmapEx(m_IdCheck);
m_bmpNoCheck.LoadBitmapEx(m_IdNoCheck)
相关文章推荐
- 1.VC(ui)-单选按钮的自绘实现
- vc 一组单选按钮互斥的具体实现!!以及mfc内部如何实现具体的分组!!
- 自绘按钮的实现
- 自绘按钮的实现
- 自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)
- Silverlight中利用ListBox特性实现单选按钮组RadioButtonList和复选按钮组CheckBoxList的功能
- C# WinForm下DataGridView单选按钮列和支持三种选择状态的复选框列的实现
- datalist里的单选按钮实现单选(IE,FF适用)
- VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)
- MFC自绘按钮的实现
- 单选按钮的实现
- MFC下按钮自绘的实现(三)
- javascript实现复选框实现单选按钮功能
- 自绘实现半透明水晶按钮-一位大神的nx作品
- 用Struts实现动态单选按钮
- 一个自绘按钮和无标题栏程序的实现
- 自绘按钮的实现
- VC++ WIN32 sdk实现按钮自绘详解.
- 自绘实现半透明水晶按钮
- 自绘按钮的实现