标题栏自绘//WM_ACTIVE消息要如何处理????

mirroatl143 2012-12-23 02:57:55




5,处理WM_NCACTIVE消息。

   在这个时候,系统会画非客户区,我们处理这一消息,不让其画,然后调用我们画非客户区的方法画上我们的图形。

当改变窗口大小、移动窗口到屏幕边界时,都会产生一个 WM_NCPAINT 消息,要求NC区域重绘。
但是当右键点击任务栏时,会弹出菜单,同时窗口的标题栏会变色,此时不会产生 WM_NCPAINT来重绘,而是产生一个 WM_NCACTIVE消息,系统会去重绘。

所以,做界面皮肤时,处理WM_NCPAINT的同时,还要处理WM_NCACTIVE。否则,右键任务栏时,系统会画出默认的边框。

return (!(BOOL)wParam) ;



6,处理WM_ACTIVE消息//也是return (!(BOOL)wParam) ;????

当我们点我们的窗体时,会激发active消息,在这个消息中,默认是会画非客户区的。我们也要用我们自己的画笔画上去。
...全文
216 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckkyjtqlt 2012-12-25
  • 打赏
  • 举报
回复
case WM_NCACTIVATE: 是在哪里处理? 你直接响应OnNcActive(),OnAcvive();然后再其里面再调用onncpaint()试试 资料不全 不知道怎么帮
zhllxt 2012-12-24
  • 打赏
  • 举报
回复
Win7下我没有测试过,我估计是Win7下触发了某些消息,在那些消息里系统又自己画了标题栏,你可以测试一下,怎么测试呢? 你看我的代码中有这样的函数:{static int i = 0;TCHAR buf[64] = { 0 };_stprintf(buf,_T("WM_SIZE %d %d\r\n"),wParam,i++);OutputDebugString( buf );}你把这个代码修改一下成这样:{static int i = 0;TCHAR buf[64] = { 0 };_stprintf(buf,_T("message: 0x%04x %d\r\n"),uMsg,i++);OutputDebugString( buf );}把这个代码放在如下的位置:

LRESULT CALLBACK WindowProcDialog( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
	LRESULT lResult = 0;
	PMetroUIData pMetroUIData = (PMetroUIData)GetProp( hWnd,_T("MetroUI_Prop") );
{static int i = 0;TCHAR buf[64] = { 0 };_stprintf(buf,_T("message: 0x%04x %d\r\n"),uMsg,i++);OutputDebugString( buf );}
然后启动程序,开始调试,在Win7下拖动边框改变大小 ,再看VS2008下面的输出一栏里输出了哪些信息,根据信息中的值再去WinUser.h中去找,看看各个值对应的是哪个消息,然后猜测过滤具体是哪些个标题栏类的消息导致的,然后重载那些消息,一个个的试,找出具体是哪个消息,接下来就可以重载那一个消息,在该消息处理里重绘标题栏即可。
mirroatl143 2012-12-24
  • 打赏
  • 举报
回复
不需要加上这个WM_ACTIVE消息???同工程目录下静态库与调用程序都有,exe与lib也在一个目录下呢 静态库打断点无果
引用 3 楼 zhllxt 的回复:
Win7下我没有测试过,我估计是Win7下触发了某些消息,在那些消息里系统又自己画了标题栏,你可以测试一下,怎么测试呢? 你看我的代码中有这样的函数:{static int i = 0;TCHAR buf[64] = { 0 };_stprintf(buf,_T("WM_SIZE %d %d\r\n"),wParam,i++);OutputDebugString( buf );}你把这个代码修改……
傻X 2012-12-24
  • 打赏
  • 举报
回复
放置一个bool型全局变量做为标记 我的想法是你在WM_ACTIVATE里面控制该变量。 然后根据标记来控制NCPAINT里面画的内容。 在WM_KILLFOCUS里面控制BOOL型标记。也要重绘
mirroatl143 2012-12-23
  • 打赏
  • 举报
回复
在xp下调正大小不会出现系统的,在w7下回出现,难到w7下没有触发下面消息处理?? case WM_NCACTIVATE: // 调用 lResult = ::CallWindowProc( pMetroUIData->oldWndProc,hWnd,uMsg,wParam,lParam ); 后发现lResult值总是为1,那么直接return 1;但不调用原来的窗口过程,就不会在刷新时出现系统标题栏 // 注意这里是不能返回0的 否则会出现弹出的子对话框不是MODAL状态的现象。 //lResult = ::CallWindowProc( pMetroUIData->oldWndProc,hWnd,uMsg,wParam,lParam ); {static int i = 0;TCHAR buf[64] = { 0 };_stprintf(buf,_T("WM_NCACTIVATE %d %d\r\n"),lResult,i++);OutputDebugString( buf );} //OnNcPaint( hWnd,1 ); return 1L;
引用 1 楼 hurryboylqs 的回复:
刷新下自绘操作
hurryboylqs 2012-12-23
  • 打赏
  • 举报
回复
刷新下自绘操作

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧