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

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

从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 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结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。

#region 改变窗口样式         #if !DEBUG         [DllImport ("User32.dll")]         private static extern IntPtr GetWindowDC(IntPtr hwnd);         [DllImport ("User32.dll")]         private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);         protected override void WndProc(ref Message m)         ...{                      base.WndProc(ref m);                          switch(m.Msg)                          ...{                     case 0x86://WM_NCACTIVATE                         goto case 0x85;                     case 0x85://WM_NCPAINT                     ...{                                                             IntPtr hDC = GetWindowDC(m.HWnd);                              //把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了                         Graphics gs = Graphics.FromHdc(hDC);                         处理色彩#region 处理色彩                         int ibox = 1;                         if (this.MaximizeBox) ibox ++;                         if (this.MinimizeBox) ibox ++;                         //得到相关背景图片                         Image imgpm = Image.FromFile( Application.StartupPath+ @"Main.bmp");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值