修改窗体非客户区大小更改窗体标题栏高度
2013-06-06 14:33
183 查看
http://blog.csdn.net/testcs_dn/article/details/7644410
想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区
从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息
在这个消息里,你可以进行窗体,控件,非客户区的自绘
好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE
有关于 WM_NCCALCSIZE 消息,可以去www.panshsoft.com 我的网站查询
下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的
/********************************************************************
'**【函 数 名:】OnNcCalcSize
'**【参 数:】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));//保存rgrc[0]的值
//m_WndOldProc 原窗体口处理过程的指针
//m_hWnd 需要修改控件或窗体的句柄
//先让默认的函数处理一下
ret = ::CallWindowProc(m_WndOldProc, m_hWnd, WM_NCCALCSIZE, wParam, lParam);
memcpy(&lpncsp->rgrc[0], &Oldrect , sizeof(Oldrect));
//设置非客户区,为窗体或控件,上,下,左,右,都加上10象素的非客户区
//其中 下,右,是用减的,减就是加
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;//让CallWindowProc处理
}
这样一来,控件或窗体,非客户区就在原来的基础上加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结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。
想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区
从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息
在这个消息里,你可以进行窗体,控件,非客户区的自绘
好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE
有关于 WM_NCCALCSIZE 消息,可以去www.panshsoft.com 我的网站查询
下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的
/********************************************************************
'**【函 数 名:】OnNcCalcSize
'**【参 数:】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));//保存rgrc[0]的值
//m_WndOldProc 原窗体口处理过程的指针
//m_hWnd 需要修改控件或窗体的句柄
//先让默认的函数处理一下
ret = ::CallWindowProc(m_WndOldProc, m_hWnd, WM_NCCALCSIZE, wParam, lParam);
memcpy(&lpncsp->rgrc[0], &Oldrect , sizeof(Oldrect));
//设置非客户区,为窗体或控件,上,下,左,右,都加上10象素的非客户区
//其中 下,右,是用减的,减就是加
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;//让CallWindowProc处理
}
这样一来,控件或窗体,非客户区就在原来的基础上加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结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。
相关文章推荐
- 修改窗体非客户区大小更改窗体标题栏高度
- 修改窗体非客户区大小更改窗体标题栏高度
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- [Win32]只允许最大化最小化窗口,禁止双击标题栏、拖动窗体、点击复原按钮来改变窗口大小
- 界面编程:VC实现自绘窗体标题栏非客户区
- 修改窗体客户区区域
- Winform 防止双击标题栏改变窗体大小 、移动窗体
- 修改系统TabBar高度、文字大小和位置
- 屏幕分辨率及获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限(修改表空间大小)
- c#禁止通过拖动,双击标题栏改变窗体大小
- Bootstrop Table窗口大小改变时修改Table高度
- [Qt]不带标题栏(FramelessWindowHint)的窗体移动及调整大小
- VC 实现 自绘 窗体 标题栏 非客户区
- Android编程实现获取标题栏、状态栏的高度、屏幕大小及模拟Home键的方法
- [Qt]不带标题栏(FramelessWindowHint)的窗体移动及调整大小
- VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区
- VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区(VER.2013-11-06)
- c#如何更改windows窗体自带地标题栏?注意不是躲藏而是更改——
- VC++学习笔记对对话框窗体大小的修改