1.VC(ui)-单选按钮的自绘实现

本文介绍了一种通过自绘方式实现单选按钮的方法,包括如何加载不同状态的图片、设置单选按钮组以及在DrawItem中实现自绘效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用方式:

void LoadNoSelBmp(UINT IdNoCheck);//未点击时的图片
void LoadSelBmp(UINT IdCheck)//点击时的图片

加载各种图片后,GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO2)来自定义单选按钮的群组也就是IDC_RADIO1到IDC_RADIO2为一组单选按钮

代码实现:
1.要实现自绘,可以通过重载Create函数加上自绘属性,加上

dwStyle &= ~(0xF);  // remove styles with conflict with group box
 dwStyle ¦= BS_AUTORADIOBUTTON; // add group box style
 dwStyle ¦= BS_OWNERDRAW ;
2.要保证一组中只有一项是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)




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值