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

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

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

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

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


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

原文地址:http://www.panshy.com/article/Sort_Desktop/UI/88.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF窗体标题栏美化可以通过自定义样式和模板来实现。下面是一个简单的步骤指导: 1. 首先,打开Visual Studio,创建一个新的WPF应用程序项目。 2. 在项目中的MainWindow.xaml文件中,找到标题栏的样式代码。可以通过Expression Blend的导航窗口找到这段代码。 3. 复制原始样式并将其粘贴到资源域中。代码的位置应在<Window.Resources>标记之间。 4. 这时,可以对标题栏样式进行编辑和修改,以满足美化的要求。可以修改背景色、字体、按钮等属性。 5. 添加一个新的命名空间 xmlns:local="clr-namespace:System.Windows.Shell;assembly=PresentationFramework",以便使用WindowChrome类和WindowChrome属性。 6. 在MainWindow.xaml中找到窗体布局代码,并添加WindowChrome属性。 <WindowChrome.WindowChrome> <local:WindowChrome CaptionHeight="30" ResizeBorderThickness="5" GlassFrameThickness="0"/> </WindowChrome.WindowChrome> 这个代码片段中的CaptionHeight属性定义了标题栏高度,ResizeBorderThickness属性定义了窗体边框的宽度,GlassFrameThickness属性定义了窗体的边框。 7. 可以调整这些属性的值来适应窗体的美化需求。 8. 在代码域中的Window_Loaded事件处理器中添加以下代码,以便实现窗体移动功能。 private void Window_Loaded(object sender, RoutedEventArgs e) { WindowChrome.SetWindowChrome(this, new WindowChrome() { CaptionHeight = 30 }); } 9. 保存并运行项目,即可看到自定义的WPF窗体标题栏。 注意:在进行WPF窗体标题栏美化时,建议使用Expression Blend等可视化工具,以便更好地调整视觉效果。此外,可以参考其他开源项目或第三方库来获取更多的样式和模板,以实现更高级的美化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值