自绘之系统风格,DrawFrameControl & DrawThemeBackground 应用

[开源]自绘之系统风格,DrawFrameControl & DrawThemeBackground 应用

楼层直达
 
只看楼主更多操作 楼主   发表于: 2011-08-20
虽说绘制系统默认风格的控件有些多此一举,但是有时候还是有些用处的。比如下面这个自定义控件的标题栏背景就运用到了 Rebar 的背景,系统主题再变化也能和其他控件能够相协调。



DrawFrameControl 和 DrawThemeBackground 是两个比较奇特的 API,前者在 Win2000 的时候就有了,而后者则需要 WinXP 及以上版本的支持。另外,后者需要开启系统主题(不能为经典主题)。简单而言,DrawFrameControl 绘制的控件是经典主题风格的,如果设置了系统主题,则可以用 DrawThemeBackground 绘制出当前系统主题风格的控件。在这里我以绘制系统标准按钮为例(当然我没有事先判断 DrawThemeBackground 是否存在,可能 Win2000 及以下版本的系统上没有办法运行,大家可以修改一下;另外 PAINTSTRUCT 结构体没有声明完整,若需要请修改)

开启系统主题时:


没有开启系统主题或经典主题时:


源码奉上,欢迎大家改进或交流意见:
DrawButton.e (12 K) 下载次数:526

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MFC中,可以通过自定义绘制标题栏的方式来实现自绘关闭按钮。 首先,需要在窗口类的OnNcCreate函数中添加以下代码,以使窗口支持非客户区的绘制: ```cpp LRESULT CMyWnd::OnNcCreate(LPCREATESTRUCT lpCreateStruct) { LRESULT lRes = CWnd::OnNcCreate(lpCreateStruct); DWORD style = ::GetWindowLongPtr(m_hWnd, GWL_STYLE); ::SetWindowLongPtr(m_hWnd, GWL_STYLE, style | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN); DWORD exStyle = ::GetWindowLongPtr(m_hWnd, GWL_EXSTYLE); ::SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_CLIENTEDGE); return lRes; } ``` 接下来,在窗口类的OnNcPaint函数中自绘标题栏。首先调用父类的OnNcPaint函数绘制默认的标题栏,然后自己绘制关闭按钮: ```cpp void CMyWnd::OnNcPaint() { CWnd::OnNcPaint(); CWindowDC dc(this); CRect rect; GetClientRect(rect); CRect titleRect; GetWindowRect(titleRect); titleRect.bottom = titleRect.top + rect.top; ScreenToClient(titleRect); // 自绘关闭按钮 CRect closeRect; int btnSize = GetSystemMetrics(SM_CYSMICON); closeRect.left = titleRect.right - btnSize - 5; closeRect.top = titleRect.top + (rect.top - btnSize) / 2; closeRect.right = closeRect.left + btnSize; closeRect.bottom = closeRect.top + btnSize; dc.DrawFrameControl(closeRect, DFC_CAPTION, DFCS_CAPTIONCLOSE | (GetActiveWindow() == this ? DFCS_PUSHED : 0)); } ``` 以上代码中,计算了自绘关闭按钮的位置和大小,并调用DrawFrameControl函数来绘制关闭按钮,DFC_CAPTION表示绘制标题栏的按钮,DFCS_CAPTIONCLOSE表示绘制关闭按钮,DFCS_PUSHED表示按钮处于按下状态。 最后,在窗口类的OnNcLButtonDown函数中处理关闭按钮的点击事件: ```cpp void CMyWnd::OnNcLButtonDown(UINT nHitTest, CPoint point) { if (nHitTest == HTCLOSE || nHitTest == HTCAPTION) { CRect rect; GetClientRect(rect); CRect titleRect; GetWindowRect(titleRect); titleRect.bottom = titleRect.top + rect.top; ScreenToClient(titleRect); int btnSize = GetSystemMetrics(SM_CYSMICON); CRect closeRect(titleRect.right - btnSize - 5, titleRect.top + (rect.top - btnSize) / 2, titleRect.right - 5, titleRect.top + (rect.top + btnSize) / 2); if (closeRect.PtInRect(point)) { PostMessage(WM_SYSCOMMAND, SC_CLOSE); return; } } CWnd::OnNcLButtonDown(nHitTest, point); } ``` 以上代码中,根据鼠标点击位置判断是否点击了关闭按钮,如果是,则发送关闭消息给窗口。 通过以上步骤,就可以在MFC中实现自绘关闭按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值