想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区
从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的 文本框的边框,滚动条区域都是非客户区 为什么要修改非客户区呢?? 原因是为了自绘,让边框好看一些,比如要更改窗体标题栏高度,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息 在这个消息里,你可以进行窗体,控件,非客户区的自绘 好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE 有关于 WM_NCCALCSIZE 消息,可以去www. 我的网站查询
下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的
-
-
-
-
-
-
-
-
-
- LRESULT CDrawFrmWnd::OnNcCalcSize(WPARAM wParam, LPARAM lParam)
- {
- LONG ret = USE_DEFAULT_WND_PROC;
- RECT Oldrect;
-
- NCCALCSIZE_PARAMS FAR* lpncsp = NULL;
-
-
- if ((BOOL)wParam)
- {
- lpncsp = (NCCALCSIZE_PARAMS FAR*)lParam;
-
- if(NULL == lpncsp)
- return USE_DEFAULT_WND_PROC;
-
- memcpy(&Oldrect, &lpncsp -> rgrc[0], sizeof(Oldrect));
-
-
-
-
- ret = ::CallWindowProc(m_WndOldProc, m_hWnd, WM_NCCALCSIZE, wParam, lParam);
-
-
- memcpy(&lpncsp->rgrc[0], &Oldrect , sizeof(Oldrect));
-
-
-
- lpncsp->rgrc[0].top += 10;
- lpncsp->rgrc[0].bottom -= 10;
- lpncsp->rgrc[0].left += 10;
- lpncsp->rgrc[0].right -= 10;
-
- memcpy(&lpncsp->rgrc[1], &lpncsp->rgrc[0], sizeof(lpncsp->rgrc[0]));
-
- ret = WVR_VALIDRECTS;
- }
-
- return ret;
- }
这样一来,控件或窗体,非客户区就在原来的基础上加10象素啦,然后,操作系统就会响应WM_NCPAINT消息,你就可以重绘啦。
(###)
|