`
testcs_dn
  • 浏览: 113831 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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

分享到:
评论

相关推荐

    VB去除标题栏+改变大小+移动窗体

    首先,**去除标题栏**是通过修改窗体的`BorderStyle`属性实现的。默认情况下,窗体的`BorderStyle`属性为`FixedSingle`,这会显示标准的标题栏和边框。要移除标题栏,我们可以将其设置为`None`,代码如下: ```vb ...

    设置Win Form窗体标题栏的文本

    总的来说,设置Win Form窗体标题栏的文本是Windows应用程序开发中的基础操作,通过`Form`类的`Text`属性可以轻松完成。了解这个基本概念后,你可以继续深入学习Win Forms中的其他控件和事件,构建更复杂的用户界面。...

    C#修改标题栏和边框颜色

    它不需要将`FormBorderStyle`设为`None`,而是利用Windows API(应用程序接口)来处理特定的消息,例如`WM_NCPAINT`消息,这是用来处理非客户区(非窗口内容部分,如边框和标题栏)的绘制。 以下是一些关键步骤: ...

    没有标题栏却可以改变大小的窗体

    然而,在某些特殊设计或定制用户界面的需求下,可能需要去除窗体的标题栏,同时保留窗口可调整大小的功能。本文将详细解释如何实现这样一个“没有标题栏却可以改变大小”的窗体。 首先,我们需要创建一个无标题栏的...

    VB 独特的窗体标题栏

    在VB(Visual Basic)编程环境中,窗体标题栏是一个重要的组成部分,它显示了应用程序的名称,通常也允许用户通过拖动来移动窗体位置。在VB中,开发者可以通过自定义代码来实现窗体标题栏的独特功能,从而提高用户...

    C#无标题栏但可以改变大小的窗体

    在C#编程中,创建一个没有标题栏但仍然可以改变大小的窗体是一个常见的需求,特别是在设计自定义用户界面时。这种窗体通常用于提供更简洁的视觉效果或实现特定的交互模式。以下是对这个主题的详细解释: 1. **窗体...

    VB实现无标题栏靠拖动窗体移动窗体源码

    然而,没有标题栏的窗口通常无法通过标准的方式进行移动,因为用户通常依赖标题栏来拖动窗体。为了解决这个问题,我们可以自定义代码,使用户能够通过点击并拖动窗体的任何部分来移动它。下面我们将详细讨论如何实现...

    c#如何拖动无标题栏窗体

    总的来说,创建一个无标题栏且可拖动的窗体,主要涉及修改窗体的边框样式以及添加鼠标事件处理程序。通过这种方式,我们可以自由定制窗体的外观和交互方式,满足各种特殊的设计需求。在进行此类自定义操作时,一定要...

    C#源码,无标题栏窗体

    默认情况下,每个窗体都有标题栏,但通过编程方式,我们可以轻松地修改这一特性。 创建一个无标题栏的窗体,主要涉及到设置窗体的`FormBorderStyle`和`ControlBox`属性。`FormBorderStyle`属性决定了窗体的边框类型...

    C#168设置窗体标题栏显示的文本 源代码

    在Windows Forms中,`Form`类是用于创建窗口的基础类,而`Text`属性则用于设置窗体标题栏的文本。以下是一个简单的示例,展示了如何在窗体加载时设置标题: ```csharp using System; using System.Windows.Forms; ...

    设置程序窗体标题栏的文本

    在编程领域,窗体标题栏是用户界面的重要组成部分,它通常显示应用程序的名称或当前活动的标题。在Visual C++ 2008 .NET环境下,我们可以通过编程方式来设置程序窗体标题栏的文本,这有助于提升用户体验,提供清晰的...

    Delphi无标题栏窗体拖动的方法 源码例子.rar

    在Delphi编程中,创建一个没有默认标题栏的窗体并实现自定义拖动和缩放功能是一项常见的需求,这可以使得应用程序具有更加个性化的外观和交互体验。本示例提供的"Delphi无标题栏窗体拖动的方法 源码例子.rar"正是...

    MFC CDialogEx 自绘非客户区(自绘边框、标题栏和系统按钮) v0.2

    MFC对于初学者来说用到的最多CDialog \CDialogEx CFrameWnd CMainFrame等窗口,如何想做的有个性,跟随自己的意愿去实现整个界面,一般有两种方案: 1、有边框模式下的重绘边框 2、无边框模式下的自绘边框 本人更...

    C#镂空窗体及无标题栏窗体拖动效果

    * 首先将窗体的边框样式修改为None,让窗体没有标题栏 * 实现这个效果使用了三个事件:鼠标按下、鼠标弹起、鼠标移动 * 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动 * 鼠标移动时根据鼠标的...

    c#窗体颜色更改_c#窗体颜色更改_

    本文将深入探讨如何在C#中更改窗体的颜色。 首先,我们需要了解窗体的基本属性。在C# WinForms中,窗体的颜色主要通过`BackColor`属性来设置。`BackColor`属性决定了窗体的背景颜色。你可以直接在代码编辑器中或者...

    闪烁VB窗体标题栏

    大家都知道,当一个窗体从活动状态变为非活动状态时,有时该窗体的标题栏会闪烁,以提醒用户切换到该窗体进行操作。 那么,我们如何让自己的VB程序窗口也像Windows的其他程序一样可以闪烁自己的标题栏呢?本资源...

    VB 更改标题栏颜色,透明窗体

    我们需要关注`WM_NCPAINT`消息,这个消息是在非客户区(如标题栏)需要绘制时发送的。 3. 在`WndProc`方法中,当接收到`WM_NCPAINT`消息时,我们可以使用GDI+或者GDI函数来绘制我们想要的颜色。 下面是一个简单的...

    Delphi_Vista透明窗体(标题栏)效果.

    在Delphi编程环境中,创建Vista风格的透明窗体(标题栏)效果是一项常见的需求,尤其是在设计现代化用户界面时。这种效果使得应用程序看起来更加美观,符合Windows Vista及更高版本操作系统的设计风格。本教程将深入...

    vb 禁止窗体移动和改变大小

    默认情况下,用户可以通过标题栏拖动窗体来移动它,并可以抓取窗体边角来调整大小。要禁止这些行为,我们需要修改这些属性。 1. **禁止窗体移动**: 禁止窗体移动通常通过设置`FormBorderStyle`属性为`FixedDialog...

    DELPHI重绘非客户区改变窗口外观

    在Delphi编程中,"重绘非客户区改变窗口外观"是一个高级技术,它允许开发者超越标准窗口样式的限制,自定义窗体的外观,包括标题栏、边框等非客户区部分。这个主题通常涉及到Windows API调用,以及GDI(图形设备接口...

Global site tag (gtag.js) - Google Analytics