如何重绘窗体的标题栏(nonclient)? 是的,WM_NCPAINT消息中不会给你REGION。 你必须取得整个窗口的HDC并且自己保证全画在非用户区。画非用户区是很麻烦的, 基本上只能在WM_NCCALCSIZE和WM_NCPAINT中作文章。很多人都认为微软故意把它搞得这么麻烦。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果获取的WM_NCPAINT消息的wParam不是1的话,是可以获得REGION的,可是大多数都是1.用无标题栏的窗口,那些个边框也都没有了,也不会响应改变大小的事件,这些也都要处理。 哪位帮看一下,为什么画不出标题栏? (PanitNonClientArea(Graphics, RectangleF)是没问题的,可以正常画到Bitmap、Panel上。)protected override void WndProc(ref Message m){ Graphics g; RectangleF rectf; Point pt; switch (m.Msg) { case WMConsts.WM_NCPAINT : IntPtr hrgn = m.WParam; if ( hrgn != (IntPtr)1 ) { Region rgn = Region.FromHrgn(hrgn); g = CreateGraphics(); rectf = rgn.GetBounds(g); PaintNonClientArea(g, rectf); } else { g = CreateGraphics(); rectf = new RectangleF(0,-23, Width, 23); PaintNonClientArea(g, rectf); g.Dispose(); } //base.WndProc(ref m); break; default : base.WndProc (ref m); break; }} CreateGraphics返回的hDC是窗口用户区的。你必须用GetWindowDC:[DllImport("User32.dll", CharSet=CharSet.Auto)]public static extern IntPtr GetWindowDC(IntPtr hWnd);...IntPtr hDC = GetWindowDC(m.HWnd);Graphics g = Graphics.FromHdc(hDC); http://www.chinadeer.com/multicolor_title_bar.aspx 请问weifenluo(weifenluo), 为什么 Graphics g = Graphics.FromHWnd(m.HWnd)获得的Graphics 与 IntPtr hDC = GetWindowDC(m.HWnd); Graphics g = Graphics.FromHdc(hDC);获得的会不同呢? liduke(天下有雪): 为什么不用c#中自带的画标题的方法来画呢没看到过有呵,C#中自带的画标题的方法是什么? 画标题栏时,除了要处理WM_NCPAINT消息以外,还需要处理哪些消息?我发现一按最小化最大化关闭按钮,它们默认的样子就又出来了。 ? 我有个想法大家看看是否行得通,有关字符串压缩的! 初学语言一道疑难 怎么样给循环生成的按钮每一项添加不同的text 求一个winform中的方法 网上下了个源码,可是没有csproj文件,怎么办? C#调用标准C++ 求助啊!!高手救命啊!!-寻求一解决方法 c#操作excel 要运行c#编的程序,需要安装哪些东西? 如何在datagrid左边有一个数字自动编号 帮忙看一下。如何列遍cache? 很简单的statusbar显示问题!!
用无标题栏的窗口,那些个边框也都没有了,也不会响应改变大小的事件,这些也都要处理。
{
Graphics g;
RectangleF rectf; Point pt; switch (m.Msg)
{
case WMConsts.WM_NCPAINT :
IntPtr hrgn = m.WParam;
if ( hrgn != (IntPtr)1 )
{
Region rgn = Region.FromHrgn(hrgn);
g = CreateGraphics();
rectf = rgn.GetBounds(g);
PaintNonClientArea(g, rectf);
}
else
{
g = CreateGraphics();
rectf = new RectangleF(0,-23, Width, 23);
PaintNonClientArea(g, rectf);
g.Dispose();
}
//base.WndProc(ref m);
break; default :
base.WndProc (ref m);
break;
}
}
public static extern IntPtr GetWindowDC(IntPtr hWnd);
...
IntPtr hDC = GetWindowDC(m.HWnd);
Graphics g = Graphics.FromHdc(hDC);
Graphics g = Graphics.FromHdc(hDC);获得的会不同呢?
为什么不用c#中自带的画标题的方法来画呢没看到过有呵,C#中自带的画标题的方法是什么?
我发现一按最小化最大化关闭按钮,它们默认的样子就又出来了。