修改窗体非客户区大小更改窗体标题栏高度

想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区

从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息
在这个消息里,你可以进行窗体,控件,非客户区的自绘
好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE
有关于 WM_NCCALCSIZE 消息,可以去www.panshsoft.com我的网站查询

下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的

  1. /********************************************************************
  2. '**【函数名:】OnNcCalcSize
  3. '**【参数:】wParam,lParam窗口附加参数
  4. '**【返回值:】
  5. '**【作者:】艾俊
  6. '**【日期:】
  7. '**【全局变量:】
  8. '**【功能描述:】改变窗体非客户区大小
  9. '********************************************************************/
  10. LRESULTCDrawFrmWnd::OnNcCalcSize(WPARAMwParam,LPARAMlParam)
  11. {
  12. LONGret=USE_DEFAULT_WND_PROC;
  13. RECTOldrect;
  14. NCCALCSIZE_PARAMSFAR*lpncsp=NULL;
  15. if((BOOL)wParam)
  16. {
  17. lpncsp=(NCCALCSIZE_PARAMSFAR*)lParam;
  18. if(NULL==lpncsp)
  19. returnUSE_DEFAULT_WND_PROC;
  20. memcpy(&Oldrect,&lpncsp->rgrc[0],sizeof(Oldrect));//保存rgrc[0]的值
  21. //m_WndOldProc原窗体口处理过程的指针
  22. //m_hWnd需要修改控件或窗体的句柄
  23. //先让默认的函数处理一下
  24. ret=::CallWindowProc(m_WndOldProc,m_hWnd,WM_NCCALCSIZE,wParam,lParam);
  25. memcpy(&lpncsp->rgrc[0],&Oldrect,sizeof(Oldrect));
  26. //设置非客户区,为窗体或控件,上,下,左,右,都加上10象素的非客户区
  27. //其中下,右,是用减的,减就是加
  28. lpncsp->rgrc[0].top+=10;
  29. lpncsp->rgrc[0].bottom-=10;
  30. lpncsp->rgrc[0].left+=10;
  31. lpncsp->rgrc[0].right-=10;
  32. memcpy(&lpncsp->rgrc[1],&lpncsp->rgrc[0],sizeof(lpncsp->rgrc[0]));
  33. ret=WVR_VALIDRECTS;//
  34. }
  35. returnret;//让CallWindowProc处理
  36. }

这样一来,控件或窗体,非客户区就在原来的基础上加10象素啦,然后,操作系统就会响应WM_NCPAINT消息,你就可以重绘啦

NCCALCSIZE_PARAMS 结构体

NCCALCSIZE_PARAMS

NCCALCSIZE_PARAMS结构包含了应用程序在处理WM_NCCALCSIZE消息时可用的信息,以计算窗口客户区的大小、位置,以及有效内容。

typedef struct _NCCALCSIZE_PARAMS {
RECT rgrc[3];
PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

成员
·rgrc
矩形数组。
第一个矩形包含窗口在移动或改变大小后的新坐标,也就是说,它是建议的新窗口坐标。
第二个矩形包含了窗口在移动或改变大小前的坐标。
第三个包含了窗口移动或改变大小前的客户区坐标。
如果该窗口是子窗口,这些坐标相对于父窗口的客户区。如果窗口是顶层窗口,坐标相对于屏幕原点。

·lppos
指向WINDOWPOS结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。

分享到:

上一篇:image字段或二进制字段的读写

下一篇:vc调试出现One or morebreakpoints cannot be set and have been disabled

文章来源:http://blog.csdn.net/yingzheng1983/article/details/5864478

想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区

从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息
在这个消息里,你可以进行窗体,控件,非客户区的自绘
好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE
有关于 WM_NCCALCSIZE 消息,可以去www.panshsoft.com我的网站查询

下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的

  1. /********************************************************************
  2. '**【函数名:】OnNcCalcSize
  3. '**【参数:】wParam,lParam窗口附加参数
  4. '**【返回值:】
  5. '**【作者:】艾俊
  6. '**【日期:】
  7. '**【全局变量:】
  8. '**【功能描述:】改变窗体非客户区大小
  9. '********************************************************************/
  10. LRESULTCDrawFrmWnd::OnNcCalcSize(WPARAMwParam,LPARAMlParam)
  11. {
  12. LONGret=USE_DEFAULT_WND_PROC;
  13. RECTOldrect;
  14. NCCALCSIZE_PARAMSFAR*lpncsp=NULL;
  15. if((BOOL)wParam)
  16. {
  17. lpncsp=(NCCALCSIZE_PARAMSFAR*)lParam;
  18. if(NULL==lpncsp)
  19. returnUSE_DEFAULT_WND_PROC;
  20. memcpy(&Oldrect,&lpncsp->rgrc[0],sizeof(Oldrect));//保存rgrc[0]的值
  21. //m_WndOldProc原窗体口处理过程的指针
  22. //m_hWnd需要修改控件或窗体的句柄
  23. //先让默认的函数处理一下
  24. ret=::CallWindowProc(m_WndOldProc,m_hWnd,WM_NCCALCSIZE,wParam,lParam);
  25. memcpy(&lpncsp->rgrc[0],&Oldrect,sizeof(Oldrect));
  26. //设置非客户区,为窗体或控件,上,下,左,右,都加上10象素的非客户区
  27. //其中下,右,是用减的,减就是加
  28. lpncsp->rgrc[0].top+=10;
  29. lpncsp->rgrc[0].bottom-=10;
  30. lpncsp->rgrc[0].left+=10;
  31. lpncsp->rgrc[0].right-=10;
  32. memcpy(&lpncsp->rgrc[1],&lpncsp->rgrc[0],sizeof(lpncsp->rgrc[0]));
  33. ret=WVR_VALIDRECTS;//
  34. }
  35. returnret;//让CallWindowProc处理
  36. }

这样一来,控件或窗体,非客户区就在原来的基础上加10象素啦,然后,操作系统就会响应WM_NCPAINT消息,你就可以重绘啦

NCCALCSIZE_PARAMS 结构体

NCCALCSIZE_PARAMS

NCCALCSIZE_PARAMS结构包含了应用程序在处理WM_NCCALCSIZE消息时可用的信息,以计算窗口客户区的大小、位置,以及有效内容。

typedef struct _NCCALCSIZE_PARAMS {
RECT rgrc[3];
PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

成员
·rgrc
矩形数组。
第一个矩形包含窗口在移动或改变大小后的新坐标,也就是说,它是建议的新窗口坐标。
第二个矩形包含了窗口在移动或改变大小前的坐标。
第三个包含了窗口移动或改变大小前的客户区坐标。
如果该窗口是子窗口,这些坐标相对于父窗口的客户区。如果窗口是顶层窗口,坐标相对于屏幕原点。

·lppos
指向WINDOWPOS结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。

时间: 2024-11-24 20:37:08

修改窗体非客户区大小更改窗体标题栏高度的相关文章

VC 窗体非客户区的绘制

VC 窗体非客户区的绘制 OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) . void CSkinAndLangDlg::OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) { HDC WindowDC = ::GetWindowDC(m_hWnd); // //取得整个窗体矩形 RECT WindowRect; GetWindowRect(&WindowRect); Offset

VC 窗体非客户区的绘制 OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam)

void CSkinAndLangDlg::OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) { HDC WindowDC = ::GetWindowDC(m_hWnd); // //取得整个窗体矩形 RECT WindowRect; GetWindowRect(&WindowRect); OffsetRect(&WindowRect, -WindowRect.left, - WindowRect.top); // //取得客户区矩

界面-求助:mfc非客户区自绘请求高手指点,不知道该怎么做

问题描述 求助:mfc非客户区自绘请求高手指点,不知道该怎么做 50C 想美化一下界面,查资料说要重绘非客户区,看的晕头转向,麻烦高手给指点一下思路,最好有代码可以参考一下 解决方案 WM_NCPAINT这个就是重绘飞客户区的消息,响应在这个消息在里面绘图就好了. 解决方案二: http://blog.csdn.net/faihtua/article/details/8082264 解决方案三: 参考:VC 轻松实现非客户区按钮http://blog.csdn.net/testcs_dn/art

轻松实现非客户区按钮

一.简介 有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示: 为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理.如下是几个主要的非客户区消息: WM_NCHITTEST WM_NCACTIVATE WM_NCPAINT

VC 轻松实现非客户区按钮

源代码下载 一.简介 有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示: 为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理.如下是几个主要的非客户区消息: WM_NCHITTEST WM_NCACTIVATE WM_NCPAINT 二.使用 2.1 首先我们需要引用两个类的头文件 #include"NCButtonManager.h&qu

如何按非客户区移动窗体

看到一介绍如何按非客户区移动窗体,既重载WM_NCHITTEST,返回HTCAPTION.但我认为有一点不妥就是没有了鼠标右键功能.这里我介绍一种方法,即可已在客户区移动窗体又可以实现鼠标右键功能. 1.新建一工程DLG.采用默认设置. 2.添加消息处理函数: void CDlgDlg::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,poin

wpf 能不能直接在非客户区绘图

问题描述 如题,非客户区,除了Hook,能不能通过drawvisual绘制?还有,现在我用了Hook,用c++写的,用了双缓冲,BitBlt直接拷贝的,但是调整窗体大小时会闪烁,换成gdiplus会好很多,调整过于平凡也会偶尔闪烁.还有没有别的解决办法? 解决方案 解决方案二:非客户区难不成不是值的标题栏?边框?

c++-MFC非客户区的刷新及防闪烁问题

问题描述 MFC非客户区的刷新及防闪烁问题 弄重绘标题栏的时候遇到了问题.. 按钮贴图什么的都好了.但是在标题栏写"菜单"项的时候遇到了刷新的问题. "菜单"项我是用pDC->DrawText()写上去的("菜单"是两个字而不是按钮啥的). 希望的效果是实时追踪鼠标的位置,若鼠标指在"菜单"所在矩形区域时就把俩字变色显示 于是我就先把之前写的字覆盖掉再重新写 但是这样就出现闪烁了.. 各位有没有好办法解决一下.. 解决方

用C#实现在客户区拖动窗体

当你设计一个应用程序时,或许你希望用户能够通过客户区来拖动窗体,比如:当窗体没有标题栏或创建的是不规则的窗体时,就只有通过客户区来拖动窗体了. 一个发生在我们身边很好的例子就是Microsoft Windows Media Player.Media Player有项功能是根据用户的爱好可以随意换掉外观(换肤),这个时候标题栏就隐藏了,但是你能够通过客户区来拖动窗体. 好了,言归正传,开始我们的旅程吧 首先必须了解Windows的消息传递机制,当有鼠标活动消息时,系统发送WM_NCHITTEST