想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区
从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的
文本框的边框,滚动条区域都是非客户区
为什么要修改非客户区呢??
原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息
在这个消息里,你可以进行窗体,控件,非客户区的自绘
好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSIZE
有关于 WM_NCCALCSIZE 消息,可以去www.panshsoft.com我的网站查询
下在是代码,函数已经获取到 wParam lParam 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的
-
LRESULTCDrawFrmWnd::OnNcCalcSize(WPARAMwParam,LPARAMlParam)
- {
-
LONGret=USE_DEFAULT_WND_PROC;
- RECTOldrect;
-
- NCCALCSIZE_PARAMSFAR*lpncsp=NULL;
-
if((BOOL)wParam)
- {
- lpncsp=(NCCALCSIZE_PARAMSFAR*)lParam;
-
-
if(NULL==lpncsp)
-
returnUSE_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;
- }
-
-
returnret;
- }
这样一来,控件或窗体,非客户区就在原来的基础上加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 参数的值,示例,是我网站上,换肤产品中的代码,是通过子类化调用的
-
LRESULTCDrawFrmWnd::OnNcCalcSize(WPARAMwParam,LPARAMlParam)
- {
-
LONGret=USE_DEFAULT_WND_PROC;
- RECTOldrect;
-
- NCCALCSIZE_PARAMSFAR*lpncsp=NULL;
-
if((BOOL)wParam)
- {
- lpncsp=(NCCALCSIZE_PARAMSFAR*)lParam;
-
-
if(NULL==lpncsp)
-
returnUSE_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;
- }
-
-
returnret;
- }
这样一来,控件或窗体,非客户区就在原来的基础上加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结构的指针。该结构包含了对窗口进行移动或改变大小的操作时指定的大小和位置。
分享到:
相关推荐
首先,**去除标题栏**是通过修改窗体的`BorderStyle`属性实现的。默认情况下,窗体的`BorderStyle`属性为`FixedSingle`,这会显示标准的标题栏和边框。要移除标题栏,我们可以将其设置为`None`,代码如下: ```vb ...
总的来说,设置Win Form窗体标题栏的文本是Windows应用程序开发中的基础操作,通过`Form`类的`Text`属性可以轻松完成。了解这个基本概念后,你可以继续深入学习Win Forms中的其他控件和事件,构建更复杂的用户界面。...
然而,在某些特殊设计或定制用户界面的需求下,可能需要去除窗体的标题栏,同时保留窗口可调整大小的功能。本文将详细解释如何实现这样一个“没有标题栏却可以改变大小”的窗体。 首先,我们需要创建一个无标题栏的...
在VB(Visual Basic)编程环境中,窗体标题栏是一个重要的组成部分,它显示了应用程序的名称,通常也允许用户通过拖动来移动窗体位置。在VB中,开发者可以通过自定义代码来实现窗体标题栏的独特功能,从而提高用户...
它不需要将`FormBorderStyle`设为`None`,而是利用Windows API(应用程序接口)来处理特定的消息,例如`WM_NCPAINT`消息,这是用来处理非客户区(非窗口内容部分,如边框和标题栏)的绘制。 以下是一些关键步骤: ...
在C#编程中,创建一个没有标题栏但仍然可以改变大小的窗体是一个常见的需求,特别是在设计自定义用户界面时。这种窗体通常用于提供更简洁的视觉效果或实现特定的交互模式。以下是对这个主题的详细解释: 1. **窗体...
然而,没有标题栏的窗口通常无法通过标准的方式进行移动,因为用户通常依赖标题栏来拖动窗体。为了解决这个问题,我们可以自定义代码,使用户能够通过点击并拖动窗体的任何部分来移动它。下面我们将详细讨论如何实现...
总的来说,创建一个无标题栏且可拖动的窗体,主要涉及修改窗体的边框样式以及添加鼠标事件处理程序。通过这种方式,我们可以自由定制窗体的外观和交互方式,满足各种特殊的设计需求。在进行此类自定义操作时,一定要...
默认情况下,每个窗体都有标题栏,但通过编程方式,我们可以轻松地修改这一特性。 创建一个无标题栏的窗体,主要涉及到设置窗体的`FormBorderStyle`和`ControlBox`属性。`FormBorderStyle`属性决定了窗体的边框类型...
在Windows Forms中,`Form`类是用于创建窗口的基础类,而`Text`属性则用于设置窗体标题栏的文本。以下是一个简单的示例,展示了如何在窗体加载时设置标题: ```csharp using System; using System.Windows.Forms; ...
在编程领域,窗体标题栏是用户界面的重要组成部分,它通常显示应用程序的名称或当前活动的标题。在Visual C++ 2008 .NET环境下,我们可以通过编程方式来设置程序窗体标题栏的文本,这有助于提升用户体验,提供清晰的...
在Delphi编程中,创建一个没有默认标题栏的窗体并实现自定义拖动和缩放功能是一项常见的需求,这可以使得应用程序具有更加个性化的外观和交互体验。本示例提供的"Delphi无标题栏窗体拖动的方法 源码例子.rar"正是...
MFC对于初学者来说用到的最多CDialog \CDialogEx CFrameWnd CMainFrame等窗口,如何想做的有个性,跟随自己的意愿去实现整个界面,一般有两种方案: 1、有边框模式下的重绘边框 2、无边框模式下的自绘边框 本人更...
* 首先将窗体的边框样式修改为None,让窗体没有标题栏 * 实现这个效果使用了三个事件:鼠标按下、鼠标弹起、鼠标移动 * 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动 * 鼠标移动时根据鼠标的...
本文将深入探讨如何在C#中更改窗体的颜色。 首先,我们需要了解窗体的基本属性。在C# WinForms中,窗体的颜色主要通过`BackColor`属性来设置。`BackColor`属性决定了窗体的背景颜色。你可以直接在代码编辑器中或者...
大家都知道,当一个窗体从活动状态变为非活动状态时,有时该窗体的标题栏会闪烁,以提醒用户切换到该窗体进行操作。 那么,我们如何让自己的VB程序窗口也像Windows的其他程序一样可以闪烁自己的标题栏呢?本资源...
我们需要关注`WM_NCPAINT`消息,这个消息是在非客户区(如标题栏)需要绘制时发送的。 3. 在`WndProc`方法中,当接收到`WM_NCPAINT`消息时,我们可以使用GDI+或者GDI函数来绘制我们想要的颜色。 下面是一个简单的...
在Delphi编程环境中,创建Vista风格的透明窗体(标题栏)效果是一项常见的需求,尤其是在设计现代化用户界面时。这种效果使得应用程序看起来更加美观,符合Windows Vista及更高版本操作系统的设计风格。本教程将深入...
在Delphi编程中,"重绘非客户区改变窗口外观"是一个高级技术,它允许开发者超越标准窗口样式的限制,自定义窗体的外观,包括标题栏、边框等非客户区部分。这个主题通常涉及到Windows API调用,以及GDI(图形设备接口...
默认情况下,用户可以通过标题栏拖动窗体来移动它,并可以抓取窗体边角来调整大小。要禁止这些行为,我们需要修改这些属性。 1. **禁止窗体移动**: 禁止窗体移动通常通过设置`FormBorderStyle`属性为`FixedDialog...