32.1 对话框背景设置

方法一

BOOL CClDlg::OnEraseBkgnd(CDC* pDC)
{CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, RGB(200, 255, 255));return TRUE;
}

方法二:WM_CTRLCOLOR消息

  • 按类型
  • 按句柄
  • 按控件ID
HBRUSH CMFCApplication1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);TRACE("nID = %d\n",pWnd ->GetDlgCtrlID());if (this->GetSafeHwnd() == pWnd->GetSafeHwnd()){static CBrush br(RGB(200, 255, 255));return br;}if (pWnd->GetDlgCtrlID() == IDC_VSBAR){pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkMode(TRANSPARENT);return (HBRUSH)GetStockObject(HOLLOW_BRUSH);}//if (CTLCOLOR_DLG == nCtlColor)//{// static CBrush br(RGB(200, 255, 255));// return br;//}if (CTLCOLOR_STATIC == nCtlColor){pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkMode(TRANSPARENT);return (HBRUSH)GetStockObject(HOLLOW_BRUSH);}if (CTLCOLOR_EDIT == nCtlColor){pDC->SetTextColor(RGB(255, 255, 0));pDC->SetBkMode(TRANSPARENT);static CBrush br(RGB(0, 0, 0));return br;}if (CTLCOLOR_LISTBOX == nCtlColor){pDC->SetTextColor(RGB(0, 255, 0));pDC->SetBkMode(TRANSPARENT);static CBrush br(RGB(0, 0, 0));return br;}return hbr;
}
#define CTLCOLOR_MSGBOX         0
#define CTLCOLOR_EDIT           1
#define CTLCOLOR_LISTBOX        2
#define CTLCOLOR_BTN            3
#define CTLCOLOR_DLG            4
#define CTLCOLOR_SCROLLBAR      5
#define CTLCOLOR_STATIC         6
#define CTLCOLOR_MAX            7

32.2 按钮自绘

①设置按钮Owner draw属性,从CButton类派生
②给按钮关联变量
③加载图标
④重载虚函数

// Overridables (for owner draw only)virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

支持自绘技术的控件类型包括:

ODT_BUTTON Owner-drawn button

ODT_COMBOBOX Owner-drawn combo box

ODT_LISTBOX Owner-drawn list box

ODT_MENU Owner-drawn menu

ODT_LISTVIEW List view control

ODT_STATIC Owner-drawn static control

ODT_TAB Tab control

//   CDC * pDC = CDC::FromHandle(lpDIS->hDC);void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{CDC dc;dc.Attach(lpDIS->hDC);CRect rect(lpDIS->rcItem);dc.SelectStockObject(WHITE_BRUSH);dc.Rectangle(&lpDIS->rcItem);if (lpDIS->itemState & ODS_SELECTED)rect.OffsetRect(1,1);int x = rect.left+(rect.Height() - 32) / 2,y=x;dc.DrawIcon(x, y, m_hIcon);CString szText;GetWindowText(szText);rect.left += 40 + x;dc.DrawText(szText, rect, DT_VCENTER | DT_SINGLELINE);//::DrawIconEx() //缩放图标
//  dc.SelectObject(pOldBrush);dc.Detach();
}
CIconBtn m_ok;
CIconBtn m_cancel;
CIconBtn m_btn1;m_ok.SetIcon(theApp.LoadIcon(IDI_OK));
m_cancel.SetIcon(theApp.LoadIcon(IDI_CANCEL));void SetIcon(HICON hIcon)
{m_hIcon = hIcon;
}

32.2 按钮自绘防闪烁

CMemoryDC类进行缓冲去闪烁

CMemoryDC m_dc;void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{CDC dc;dc.Attach(lpDIS->hDC);CRect rect(lpDIS->rcItem);if(!m_dc.GetSafeHdc())m_dc.Create(rect.Width(), rect.Height(),&dc);m_dc.SelectObject(dc.GetCurrentFont());m_dc.SelectStockObject(WHITE_BRUSH);m_dc.Rectangle(&lpDIS->rcItem);if (lpDIS->itemState & ODS_SELECTED)rect.OffsetRect(1,1);int x = rect.left+(rect.Height() - 32) / 2,y=x;m_dc.DrawIcon(x, y, m_hIcon);CString szText;GetWindowText(szText);rect.left += 40 + x;m_dc.DrawText(szText, rect, DT_VCENTER | DT_SINGLELINE);dc.BitBlt(0, 0, lpDIS->rcItem.right, lpDIS->rcItem.bottom, &m_dc, 0, 0, SRCCOPY);//::DrawIconEx()
//  dc.SelectObject(pOldBrush);dc.Detach();
}

32.3 三态按钮

m_ok.SetIcon(theApp.LoadIcon(IDI_OK));
m_cancel.SetIcon(theApp.LoadIcon(IDI_CANCEL));
m_close.SetBitmaps(IDB_CLOSE1, IDB_CLOSE3, IDB_CLOSE2);CMemoryDC m_dcNormal;
CMemoryDC m_dcSelect;
CMemoryDC m_dcTrack;
BOOL m_bTrack;
void CBitmapBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{CDC* pDC = CDC::FromHandle(lpDIS->hDC);CRect rect(lpDIS ->rcItem);if (rect.Width() != m_dcNormal.GetWidth()|| rect.Height() != m_dcNormal.GetHeight()){SetWindowPos(NULL, 0, 0, m_dcNormal.GetWidth(), m_dcNormal.GetHeight(), SWP_NOMOVE | SWP_NOZORDER);GetClientRect(rect);}if (lpDIS->itemState & ODS_SELECTED)pDC->BitBlt(0, 0, m_dcSelect.GetWidth(), m_dcSelect.GetHeight(), &m_dcSelect, 0, 0, SRCCOPY);else{if (m_dcTrack&& m_bTrack)pDC->BitBlt(0, 0, m_dcTrack.GetWidth(), m_dcTrack.GetHeight(), &m_dcTrack, 0, 0, SRCCOPY);elsepDC->BitBlt(0, 0, m_dcNormal.GetWidth(), m_dcNormal.GetHeight(), &m_dcNormal, 0, 0, SRCCOPY);}
}void CBitmapBtn::SetBitmaps(UINT nNormal, UINT nSelect, UINT nTrack)
{ASSERT(m_dcNormal.LoadBitmap(nNormal));BITMAP bm;m_dcSelect.LoadBitmap(nSelect);if (-1 == nTrack)return;m_dcTrack.LoadBitmap(nTrack);
}void CBitmapBtn::OnMouseMove(UINT nFlags, CPoint point)
{CRect rect;GetClientRect(rect);BOOL bTrack = FALSE;if (rect.PtInRect(point)){bTrack = TRUE;if (GetCapture() != this)this->SetCapture();}elseReleaseCapture();if (bTrack != m_bTrack){m_bTrack = bTrack;if(m_bTrack)TRACE("Enter\n");elseTRACE("Leave\n");Invalidate(FALSE);}CButton::OnMouseMove(nFlags, point);
}

【MFC系列-第32天】控件自绘技术相关推荐

  1. 【MFC系列-第33天】链接控件自绘技术

    33.1 常用的字体复制 方法一 CFont* pFont = pDC->GetCurrentFont(); LOGFONT lf; pFont->GetLogFont(&lf); ...

  2. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...

  3. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

    用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/5 ...

  4. MFC设置对话框背景色及控件颜色

    MFC设置对话框背景色及控件颜色 一.使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { ...

  5. MFC中使用TAB Control控件

    2019独角兽企业重金招聘Python工程师标准>>> MFC中使用TAB Control控件 MFC中使用TAB Control控件(转) 假如我现在有个SDI程序,View是Fo ...

  6. 64位win7/win8/win10系统注册32位控件(.OCX)

    64位win7/win8/win10系统注册32位控件(.OCX) win7/win8/win10问题所在: 64位系统一般都是可以安装32位程序的,只是需要执行 C:\Windows\SysWOW6 ...

  7. 【cocosStdio系列】之UI控件下

    [cocosStdio系列]之UI控件下       大家好,我是Lampard       今天与大家通过一个demo了解cocos给我们提供的各个UI控件 reference:<cocos2 ...

  8. 循序渐进实现仿QQ界面(三):界面调色与控件自绘

    本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科去 ...

  9. vc循序渐进实现仿QQ界面(三):界面调色与控件自绘

    本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科 ...

最新文章

  1. Haproxy+Keepalived实现网站双主高可用-理论篇
  2. 【Git】如何撤销改动
  3. 伪类 伪元素 如何区分
  4. torch_geometric笔记:nn. graclus (图点分类)
  5. 2020-11-21(线性扫描反汇编算法和递归下降扫描反汇编算法)
  6. Java ist reverse_charist.js响应
  7. codeforces 1100E-Andrew and Taxi
  8. 电脑技巧:电脑常用快捷键大全,值得收藏!
  9. flash.net.filereference php,as3与php 上传单个图片demo
  10. 还对Angel平台一知半解?腾讯专家为你指点迷津!
  11. C程序设计语言现代方法14:预处理器
  12. CentOS源码安装消息队列ActiveMQ
  13. Android 启动模拟器是出现 Failed to allocate memory 8 错误提示的原因及解决办法
  14. 微信小程序接入腾讯云IM即时通讯(发送消息开发步骤)
  15. 关于int型最大值最小值的思考
  16. 激活数字营销新引擎,亚马逊云科技为企业带来数字化营销新体验
  17. Truffle 初始化项目 truffle init
  18. IT行业的最新走向!
  19. IPV6天窗问题,以及解决方法简述
  20. vue3+ts读取excel文件数据

热门文章

  1. 使用番石榴的5个理由
  2. 使用Flying-Saucer生成PDF中的条形码
  3. 在Java应用程序中使用密码学
  4. 在Java Web应用程序中阻止CSRF
  5. OSGi简介–模块化Java
  6. 10个常用python标准库_【循序渐进学Python】11.常用标准库
  7. c语言 将url图片存到本地_python爬虫:爬取男生喜欢的图片
  8. cpu占用100_Java项目服务器cpu占用100%解决办法
  9. matlab的7.3版本是什么_王者荣耀:玩不好元歌的3大原因,无论什么版本,元歌起码T1.5_电竞...
  10. xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区