广告
淘宝内部优惠券
当前位置: 开发异常方案库» VC/MFC » SDK编程模式,如何修改标题栏颜色

SDK编程模式,如何修改标题栏颜色

开发异常方案库  收集整理于:2020-05-09 11:42:00  浏览:66次
我采用SDK API的编程模式,想要修改标题栏的颜色,没法修改; 处理WM_NCPAINT 消息,标题栏区域自定义刷新颜色,发现缺省标题栏区域不能被自定义颜色覆盖;

------网友观点--------------------
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {    ...     switch (message)     {         ......         case WM_NCPAINT:             {                                 DefWindowProc(hWnd, message, wParam, lParam);                  HDC hdcWindowDC = ::GetWindowDC(hWnd);                  ::FillRect (hdcWindowDC,.......h);  ...填充标题栏区域颜色无效???                  ::ReleaseDC (hWnd, hdcWindowDC);             break;          .....     } } 问题:标题栏区域的颜色填充无效,缺省函数DefWindowProc里绘制了标题,无法被后面的绘制覆盖,为什么?

------网友观点--------------------
	case WM_NCPAINT:
		ret=DefWindowProc(hwnd, message, wParam, lParam);
//
		GetWindowRect(hwnd,&rc);
		OffsetRect(&rc,-rc.left,-rc.top);
		InflateRect(&rc,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER));
//
		rc.bottom=GetSystemMetrics(SM_CYCAPTION);
		hdc = ::GetWindowDC(hwnd);
		::FillRect (hdc,&rc, (HBRUSH) (COLOR_ACTIVECAPTION+1));//  ...填充标题栏区域颜色无效???
		::ReleaseDC (hwnd, hdc);
	return ret;

------网友观点--------------------
引用 2 楼 schlafenhamster 的回复:
	case WM_NCPAINT:
		ret=DefWindowProc(hwnd, message, wParam, lParam);
//
		GetWindowRect(hwnd,&rc);
		OffsetRect(&rc,-rc.left,-rc.top);
		InflateRect(&rc,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER));
//
		rc.bottom=GetSystemMetrics(SM_CYCAPTION);
		hdc = ::GetWindowDC(hwnd);
		::FillRect (hdc,&rc, (HBRUSH) (COLOR_ACTIVECAPTION+1));//  ...填充标题栏区域颜色无效???
		::ReleaseDC (hwnd, hdc);
	return ret;
效果如下: 标题栏的颜色仍然是系统默认标题栏样式和颜色,我的需求是修改标题栏区域的颜色,如何实现?

------网友观点--------------------
引用 2 楼 schlafenhamster 的回复:
	case WM_NCPAINT:
		ret=DefWindowProc(hwnd, message, wParam, lParam);
//
		GetWindowRect(hwnd,&rc);
		OffsetRect(&rc,-rc.left,-rc.top);
		InflateRect(&rc,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER));
//
		rc.bottom=GetSystemMetrics(SM_CYCAPTION);
		hdc = ::GetWindowDC(hwnd);
		::FillRect (hdc,&rc, (HBRUSH) (COLOR_ACTIVECAPTION+1));//  ...填充标题栏区域颜色无效???
		::ReleaseDC (hwnd, hdc);
	return ret;
按你的代码,运行效果如下 标题栏的颜色没有被修改,没有实现需求。

------网友观点--------------------
推荐 使用无边框窗口,在客户区自绘实现

------网友观点--------------------
我对window 的非客户区绘图机制感到不解, HDC hdc = ::GetWindowDC(hwnd);         ..........         ..........这里编写绘图代码,凡是在窗口默认标题区域范围的绘图均无效,就是说,窗口绘图句柄 hdc竟然对标题栏区域无效,         ..........根据GetWindowDC的MSDN解释,其绘图句柄 hdc应该是全窗口范围内的HDC绘图句柄 ,这让我感到迷惑不解。  ::ReleaseDC (hwnd, hdc); 哪位大神能说明一下原因,求解!

------网友观点--------------------
给你的代码 是 对的,     case WM_NCPAINT:         ret=DefWindowProc(hwnd, message, wParam, lParam);// 让 系统 先绘 // 获取 标题栏 rect         GetWindowRect(hwnd,&rc);         OffsetRect(&rc,-rc.left,-rc.top);         InflateRect(&rc,-GetSystemMetrics(SM_CXBORDER),-GetSystemMetrics(SM_CYBORDER));         rc.bottom=GetSystemMetrics(SM_CYCAPTION); //          hdc = ::GetWindowDC(hwnd);// 取 窗口 整个 的 DC , 不是 客户区 #         ::FillRect (hdc,&rc, (HBRUSH) (COLOR_ACTIVECAPTION+1));//  ...填充标题栏区域颜色无效???         ::ReleaseDC (hwnd, hdc);// GetDC 必须 对应 Release,而 CreateDC 必须 DeleteDC

------网友观点--------------------
标题栏 绘制 麻烦 在 原 def  会 重绘 ,所以 点击 标题栏时 加 case WM_NCACTIVATE: case WM_NCPAINT:

------网友观点--------------------
引用 8 楼 schlafenhamster 的回复:
标题栏 绘制 麻烦 在 原 def  会 重绘 ,所以 点击 标题栏时 加 case WM_NCACTIVATE: case WM_NCPAINT:
经过测试,效果如下: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdcClient; switch (message) { case WM_COMMAND: wmId    = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: // DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_ERASEBKGND: break; case WM_PAINT: hdcClient = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... if (ps.fErase) { RECT rcClientRect; ::GetClientRect (hWnd, &rcClientRect); HBRUSH hbrush = ::CreateSolidBrush (RGB(50, 150, 150)); ::FillRect (hdcClient, &rcClientRect, hbrush); ::DeleteObject (hbrush); } EndPaint(hWnd, &ps); break; case WM_NCPAINT: { // 注销缺省函数的调用 // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam); RECT rcWndRect; ::GetWindowRect (hWnd, &rcWndRect); ::OffsetRect (&rcWndRect, -rcWndRect.left, -rcWndRect.top); ::OffsetRect (&rcWndRect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); rcWndRect.bottom =  GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 8; HDC hdcWindowDC = ::GetWindowDC(hWnd); HBRUSH hbrush = ::CreateSolidBrush (RGB(250, 0, 0)); // 测试表明:如果注销缺省函数的调用,此处标题栏区域填充颜色有效; ::FillRect (hdcWindowDC, &rcWndRect, hbrush); ::DeleteObject (hbrush); ::ReleaseDC (hWnd, hdcWindowDC); // return lRst; } break; case WM_NCACTIVATE: { // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam); RECT rcWndRect; ::GetWindowRect (hWnd, &rcWndRect); ::OffsetRect (&rcWndRect, -rcWndRect.left, -rcWndRect.top); ::OffsetRect (&rcWndRect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); rcWndRect.bottom = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 8; HDC hdcWindowDC = ::GetWindowDC(hWnd); HBRUSH hbrush = ::CreateSolidBrush (RGB(250, 0, 0)); // 测试表明:如果注销缺省函数的调用,此处标题栏区域填充颜色有效; ::FillRect (hdcWindowDC, &rcWndRect, hbrush); ::DeleteObject (hbrush); ::ReleaseDC (hWnd, hdcWindowDC); // return lRst; } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }

------网友观点--------------------
引用 8 楼 schlafenhamster 的回复:
标题栏 绘制 麻烦 在 原 def  会 重绘 ,所以 点击 标题栏时 加 case WM_NCACTIVATE: case WM_NCPAINT:
经过测试,效果如下: 当处理WM_NCPAINT 消息和 WM_NCACTIVATE消息调用缺省函数绘制默认标题,后面自定义标题区的绘制无效!???? LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdcClient; switch (message) { case WM_COMMAND: wmId    = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: // DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_ERASEBKGND: break; case WM_PAINT: hdcClient = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... if (ps.fErase) { RECT rcClientRect; ::GetClientRect (hWnd, &rcClientRect); HBRUSH hbrush = ::CreateSolidBrush (RGB(50, 150, 150)); ::FillRect (hdcClient, &rcClientRect, hbrush); ::DeleteObject (hbrush); } EndPaint(hWnd, &ps); break; case WM_NCPAINT: { // 调用缺省函数LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam); RECT rcWndRect; ::GetWindowRect (hWnd, &rcWndRect); ::OffsetRect (&rcWndRect, -rcWndRect.left, -rcWndRect.top); ::OffsetRect (&rcWndRect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); rcWndRect.bottom =  GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 8; HDC hdcWindowDC = ::GetWindowDC(hWnd); HBRUSH hbrush = ::CreateSolidBrush (RGB(250, 0, 0)); // 测试表明:如果注销缺省函数的调用,此处标题栏区域填充颜色有效; ::FillRect (hdcWindowDC, &rcWndRect, hbrush); ::DeleteObject (hbrush); ::ReleaseDC (hWnd, hdcWindowDC); return lRst; } break; case WM_NCACTIVATE: { // 调用缺省函数LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam); RECT rcWndRect; ::GetWindowRect (hWnd, &rcWndRect); ::OffsetRect (&rcWndRect, -rcWndRect.left, -rcWndRect.top); ::OffsetRect (&rcWndRect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER)); rcWndRect.bottom = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 8; HDC hdcWindowDC = ::GetWindowDC(hWnd); HBRUSH hbrush = ::CreateSolidBrush (RGB(250, 0, 0)); // 测试表明:如果注销缺省函数的调用,此处标题栏区域填充颜色有效; ::FillRect (hdcWindowDC, &rcWndRect, hbrush); ::DeleteObject (hbrush); ::ReleaseDC (hWnd, hdcWindowDC); return lRst; } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }

------网友观点--------------------
引用 8 楼 schlafenhamster 的回复:
标题栏 绘制 麻烦 在 原 def  会 重绘 ,所以 点击 标题栏时 加 case WM_NCACTIVATE: case WM_NCPAINT:
测试表明:      当处理WM_NCPAINT 消息和 WM_NCACTIVATE消息  先调用缺省函数绘制默认标题,后面的自定义标题区的绘制无效!在标题区范围,后面自定义标题区绘制尽然无法覆盖前面缺省函数内的绘制,对此不解!????      当处理WM_NCPAINT 消息和 WM_NCACTIVATE消息  注销对缺省函数的调用, 自定义标题区的绘制才有效;

------网友观点--------------------
我也 推荐 使用无边框窗口,在客户区自绘实现 微软的 WM_NCPAINT: 不按 长规

------网友观点--------------------
 不是 所有 响应 都 在 WM_NCPAINT 里,很多时候 它不发送 这个 消息,。自己 就 重绘 了。 按钮 也 有一点 毛病(不经过 Paint) 

------网友观点--------------------
可以参考我之前写的一个 https://download.csdn.net/download/hurryboylqs/6472929

------网友观点--------------------
vc6 上一下代码
	case WM_NCACTIVATE:
	case WM_NCPAINT:
        DefWindowProc(hwnd, message, wParam, lParam);
//
        GetWindowRect(hwnd,&rc);
        OffsetRect(&rc,-rc.left,-rc.top);
        InflateRect(&rc,-GetSystemMetrics(SM_CXEDGE),-GetSystemMetrics(SM_CXEDGE));
		rc.top+=2;
//
        rc.bottom=GetSystemMetrics(SM_CYCAPTION)+4;
        hdc = ::GetWindowDC(hwnd);
        ::FillRect (hdc,&rc, (HBRUSH) (COLOR_BACKGROUND+1));
		SetBkMode(hdc,TRANSPARENT);
		TextOut(hdc,120,10,TEXT("abcd"),4);
        ::ReleaseDC (hwnd, hdc);
    return 1;
结果是

------网友观点--------------------
sorry 图传错了

------网友观点--------------------
引用 16 楼 schlafenhamster 的回复:
sorry 图传错了
我按你的代码测试没有效果,标题区没有任何改变,个人觉得可能跟完整的程序编译环境设置有关系! 我的是WIN10+VS2012 ,普通SDK模式的WIN32程序编译,测试表明缺省函数的标题区覆盖不了,奇怪! 能否上载一下你的完整程序?多谢!

------网友观点--------------------
引用 14 楼 hurryboylqs 的回复:
可以参考我之前写的一个 https://download.csdn.net/download/hurryboylqs/6472929
你的代码是MFC编程模式? 有SDK的代码吗?能否解释一下如何实现?多谢!

------网友观点--------------------
试试        hdc = ::GetWindowDC(NULL);  

------网友观点--------------------
由于需要窗口非客户区原来默认的行为(绘制系统菜单及其他一系列的默认消息)等等,所以处理WM_NCPAINT消息必须调用缺省函数! 如果把标题栏的非客户区高度设置为0,即取消边框,虽然也能实现,但在客户区的一些绘图操作就会产生一些混乱。

------网友观点--------------------
引用 19 楼 schlafenhamster 的回复:
试试        hdc = ::GetWindowDC(NULL);  
这个可以覆盖WM_NCPAINT消息调用缺省函数所绘制的默认标题栏,有个不足,对默认标题栏的覆盖填充自定义颜色不稳定,程序开始运行时,颜色覆盖有时一闪而过、有时有效,并且窗口一移动覆盖自定义颜色就消失了。

------网友观点--------------------
研究一下 GetDCex CDC* pDCex=GetDCEx(&rgnClip,DCX_PARENTCLIP);//ReleaseDC needed CDC *pdc=GetDCEx(0,DCX_WINDOW); //  返回与窗口矩形而不是与客户矩形相对应的设备上下文环境。

------网友观点--------------------
缺省的标题栏是使用系统资源实现的,如果需要改动:需要自己在资源管理器里设计好资源,然后注册到程序资源中,然后在程序启动时装入你自己的资源、而不是缺省的那个,于是就完成了。

------网友观点--------------------
引用 19 楼 schlafenhamster 的回复:
试试        hdc = ::GetWindowDC(NULL);  
case WM_NCCALCSIZE: { if (TRUE == wParam) { LPNCCALCSIZE_PARAMS lpnccs = (NCCALCSIZE_PARAMS *) lParam; // 处理WM_NCPAINT 消息调用缺省函数就会绘制默认标题栏 // lpnccs->rgrc[0].top += 1; // 处理WM_NCPAINT 消息调用缺省函数就不会绘制默认标题栏 lpnccs->rgrc[0].top += 0; } else { RECT * lprc = (RECT *) lParam; // 处理WM_NCPAINT 消息调用缺省函数就会绘制默认标题栏 // lprc->top += 1; // 处理WM_NCPAINT 消息调用缺省函数就不会绘制默认标题栏 lprc->top += 0; }                        return 0L;       }      break; 测试表明,标题栏好象是window给窗口附加了另外一个窗口(标题栏象是一个独立窗口),但调用WindowFromPhysicalPoint函数却查询不到该窗口,对此不解!

------网友观点--------------------
引用 23 楼 schlafenhamster 的回复:
研究一下 GetDCex CDC* pDCex=GetDCEx(&rgnClip,DCX_PARENTCLIP);//ReleaseDC needed CDC *pdc=GetDCEx(0,DCX_WINDOW); //  返回与窗口矩形而不是与客户矩形相对应的设备上下文环境。
测试表明:效果与GetWindowDC(hWnd) 相同

------网友观点--------------------
引用 24 楼 luj_1768 的回复:
缺省的标题栏是使用系统资源实现的,如果需要改动:需要自己在资源管理器里设计好资源,然后注册到程序资源中,然后在程序启动时装入你自己的资源、而不是缺省的那个,于是就完成了。
ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT1)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT1); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } 上面哪一项是对应缺省标题栏资源的?

------网友观点--------------------
引用 18 楼 liron71 的回复:
Quote: 引用 14 楼 hurryboylqs 的回复:
可以参考我之前写的一个 https://download.csdn.net/download/hurryboylqs/6472929
你的代码是MFC编程模式? 有SDK的代码吗?能否解释一下如何实现?多谢!
与MFC无关,类并没有依赖MFC,WM_CREATE的时候调用m_SkinHelper.Attach(m_hWnd);即可

------网友观点--------------------
很多年前 我还很年轻 做的最傻逼的事情就是以为微软的原装才是正统 然后把大把的时间去靠近它

------网友观点--------------------
引用 29 楼 gz_qmc 的回复:
很多年前 我还很年轻 做的最傻逼的事情就是以为微软的原装才是正统 然后把大把的时间去靠近它
后来呢?

------网友观点--------------------
对就是这个样子的 

------网友观点--------------------
引用 30 楼 这不是鸭头 的回复:
Quote: 引用 29 楼 gz_qmc 的回复:
很多年前 我还很年轻 做的最傻逼的事情就是以为微软的原装才是正统 然后把大把的时间去靠近它
后来呢?
后来才知道,微软的程序员都是和自己一样的一群人,有的逻辑思维还不如自己 后来才知道,微软是靠打补钉过日子的 后来才知道,5楼和12楼的哥们儿才是务实的聪明人 后来才知道,因为放不下执念,而忘记了要什么的人占绝大多数 后来才知道,回首处即是灵山

------网友观点--------------------
楼主想要的,其实只是一个漂亮的标题栏,比如 这就不是一个静态图片能完成的,因为还有标签按钮,还有透明效果等等 我给大家讲一个道理吧 其实,世界上本来没有标题栏,微软给了一个定义,我们就以为有了标题栏 而且,很多同学可能以为不用VC框架提供的标题栏就不正统了 如果微软当初定义两个标题栏,一个主标题栏, 一个副标题栏 , 并且缺省情况只显示主标题栏,而隐藏副标题栏 那么, 同学们就能欣然接受隐藏主标题栏,显示幅标题栏,并且会为自己能掌握这种技巧而自豪了 5楼和12楼其实本质上就是自己定义一个幅标题栏 但是因为不是微软定义,是自己定义,就他妈的没有自豪感,而是觉得不正宗 呵呵呵呵!哈哈哈哈!

------网友观点--------------------
引用 32 楼 gz_qmc 的回复:
Quote: 引用 30 楼 这不是鸭头 的回复:
Quote: 引用 29 楼 gz_qmc 的回复:
很多年前 我还很年轻 做的最傻逼的事情就是以为微软的原装才是正统 然后把大把的时间去靠近它
后来呢?
后来才知道,微软的程序员都是和自己一样的一群人,有的逻辑思维还不如自己 后来才知道,微软是靠打补钉过日子的 后来才知道,5楼和12楼的哥们儿才是务实的聪明人 后来才知道,因为放不下执念,而忘记了要什么的人占绝大多数 后来才知道,回首处即是灵山

------网友观点--------------------
微软在UI绘制上API接口上确实没有做太多改进,一个窗口滚动条,标题栏弄的这么复杂

------网友观点--------------------
引用 33 楼 gz_qmc 的回复:
楼主想要的,其实只是一个漂亮的标题栏,比如 这就不是一个静态图片能完成的,因为还有标签按钮,还有透明效果等等 我给大家讲一个道理吧 其实,世界上本来没有标题栏,微软给了一个定义,我们就以为有了标题栏 而且,很多同学可能以为不用VC框架提供的标题栏就不正统了 如果微软当初定义两个标题栏,一个主标题栏, 一个副标题栏 , 并且缺省情况只显示主标题栏,而隐藏副标题栏 那么, 同学们就能欣然接受隐藏主标题栏,显示幅标题栏,并且会为自己能掌握这种技巧而自豪了 5楼和12楼其实本质上就是自己定义一个幅标题栏 但是因为不是微软定义,是自己定义,就他妈的没有自豪感,而是觉得不正宗 呵呵呵呵!哈哈哈哈!
并非简单的只是一个漂亮的标题栏! 为什么考虑调用 缺省函数处理 WM_NCPAINT、WM_NCACTIVATE 消息,因为缺省函数处理这两消息时,函数内部还会发送一些其他消息,主要有0x0093、0x0094、 0x0091、0x0092等消息,或者发送0x0093、0x002C、0x002B..。等消息, window系统API的缺省处理是还会有一些额外预处理,其自然是便于实现高级的功能,如果不调用缺省函数,那么程序只是绘了一下,舍漏了另外一些功能,然这些功能还是需要的。

------网友观点--------------------
我改了个版本,sdk api的,你可以参考: https://download.csdn.net/download/hurryboylqs/12400412

------网友观点--------------------
引用 37 楼 hurryboylqs 的回复:
我改了个版本,sdk api的,你可以参考: https://download.csdn.net/download/hurryboylqs/12400412
感谢你提供的代码! 另有个地方跟你探讨一下,自定义类的两个消息处理: LRESULT CSkinWndHelper::OnNcPaint(WPARAM wParam, LPARAM lParam) {//LRESULT lResult = CallWindowProc(m_oldWndProc,m_hWnd, WM_NCPAINT,wParam,lParam);         // 如果缺省函数保留调用,保留缺省函数内发送的一些消息并处理之,能否完善一下实现方式?         DoNcPaint(); return 0; } LRESULT CSkinWndHelper::OnNcActivate(WPARAM wParam, LPARAM lParam) {//LRESULT  lResult= CallWindowProc(m_oldWndProc,m_hWnd, WM_NCACTIVATE,wParam,lParam);// 如果缺省函数保留调用,保留缺省函数内发送的一些消息并处理之,能否完善一下实现方式?         DoNcPaint(); return TRUE; } 代码里注销了对缺省函数的调用,同前面讨论的SDK方式中,注销缺省函数的调用,是相同的处理(定义类与不定义类,这个形式不同) switch (message) { ...... case WM_NCPAINT: {// 注销缺省函数的调用 // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam);         ....     // return lRst; } break; case WM_NCACTIVATE: {// 注销缺省函数的调用 // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam);         .... // return lRst; } break; ..... } 前面讨论中说明了,当处理WM_NCPAINT 消息和 WM_NCACTIVATE消息,注销对缺省函数的调用,是可以实现自定义标题区的绘制; 然而因为缺省函数处理这两消息时,内部还会发送一些其他消息,便于实现高级的功能,我的需求场景是这些功能还是需要的,故还是需要调用缺省函数处理这两消息。

------网友观点--------------------
引用 38 楼 liron71 的回复:
Quote: 引用 37 楼 hurryboylqs 的回复:
我改了个版本,sdk api的,你可以参考: https://download.csdn.net/download/hurryboylqs/12400412
感谢你提供的代码! 另有个地方跟你探讨一下,自定义类的两个消息处理: LRESULT CSkinWndHelper::OnNcPaint(WPARAM wParam, LPARAM lParam) {//LRESULT lResult = CallWindowProc(m_oldWndProc,m_hWnd, WM_NCPAINT,wParam,lParam);         // 如果缺省函数保留调用,保留缺省函数内发送的一些消息并处理之,能否完善一下实现方式?         DoNcPaint(); return 0; } LRESULT CSkinWndHelper::OnNcActivate(WPARAM wParam, LPARAM lParam) {//LRESULT  lResult= CallWindowProc(m_oldWndProc,m_hWnd, WM_NCACTIVATE,wParam,lParam);// 如果缺省函数保留调用,保留缺省函数内发送的一些消息并处理之,能否完善一下实现方式?         DoNcPaint(); return TRUE; } 代码里注销了对缺省函数的调用,同前面讨论的SDK方式中,注销缺省函数的调用,是相同的处理(定义类与不定义类,这个形式不同) switch (message) { ...... case WM_NCPAINT: {// 注销缺省函数的调用 // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam);         ....     // return lRst; } break; case WM_NCACTIVATE: {// 注销缺省函数的调用 // LRESULT lRst = DefWindowProc(hWnd, message, wParam, lParam);         .... // return lRst; } break; ..... } 前面讨论中说明了,当处理WM_NCPAINT 消息和 WM_NCACTIVATE消息,注销对缺省函数的调用,是可以实现自定义标题区的绘制; 然而因为缺省函数处理这两消息时,内部还会发送一些其他消息,便于实现高级的功能,我的需求场景是这些功能还是需要的,故还是需要调用缺省函数处理这两消息。
不注销默认调用也可以自绘的啊,只是会出现系统默认的标题栏隐现一下,这个可以通过修改传递参数解决 LRESULT CSkinWndHelper::OnNcPaint(WPARAM wParam, LPARAM lParam) { //wParam传递0进去,防止系统绘制默认标题栏 LRESULT lResult = CallWindowProc(m_oldWndProc,m_hWnd, WM_NCPAINT,0,lParam);     DoNcPaint(); return 0; }

------网友观点--------------------

------网友观点--------------------

------网友观点--------------------

------网友观点--------------------

------网友观点--------------------

------网友观点--------------------
发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
软件开发 程序错误 异常 ybaby.netCopyright © 2020-2026  ybaby 版权所有  桂ICP备17004385号-2 网站地图