初学可能描述不太清楚,主要是想做一个类似QQ主面板的窗体。于是重写了WndProc方法以实现自定义窗体,先做了HitTest()方法使得窗口可以自由拖动及改变大小。由于消掉了标题栏得自己做,同理修改WM_NCPAINT及WM_NCACTIVEATE
两个系统消息后将WindowDC转换为Graphics使用Framwork提供的绘图功能画出了最大化、最小化、关闭三个按钮。问题来
了,做到这里启动窗体后看不到按钮存在。双击窗体最大化后才会出现,没有设置过背景图片,背景色默认。按钮的代码
段放进来了求高手解决。
[align=left]protected override void WndProc(ref Message m)
{
//标题栏按钮的消息判定
switch (m.Msg)
{
case 0x0086://WM_NCACTIVEATE
goto case 0x0085;
case 0x0085://WM_NCPAINT
{
IntPtr hdc = GetWindowDC(m.HWnd);
//将WindowDC转换为.net的graphics以便使用framework所提供的绘图功能
Graphics gs = Graphics.FromHdc(hdc);
gs.FillRectangle(new LinearGradientBrush(m_rect, Color.Pink, Color.Purple,//画按钮
LinearGradientMode.BackwardDiagonal), m_rect); StringFormat strfmt = new StringFormat(); strfmt.Alignment = StringAlignment.Center;
strfmt.LineAlignment = StringAlignment.Center; gs.DrawString("X", this.parent.Font, Brushes.Black, m_rect, strfmt);//关闭按钮文本及颜色设置
gs.Dispose();
ReleaseDC(m.HWnd, hdc);
break;
}
case 0x00a1:
Point mousepoint = new Point((int)m.LParam);
mousepoint.Offset(-this.parent.Left, -this.parent.Top);
if (m_rect.Contains(mousepoint))
{
this.parent.Close();
}
break;
} //点击测试的消息判定
if (m.Msg == 0x0084)
{
m.Result = (IntPtr)HitTest();
return;
} base.WndProc(ref m);
}
两个系统消息后将WindowDC转换为Graphics使用Framwork提供的绘图功能画出了最大化、最小化、关闭三个按钮。问题来
了,做到这里启动窗体后看不到按钮存在。双击窗体最大化后才会出现,没有设置过背景图片,背景色默认。按钮的代码
段放进来了求高手解决。
[align=left]protected override void WndProc(ref Message m)
{
//标题栏按钮的消息判定
switch (m.Msg)
{
case 0x0086://WM_NCACTIVEATE
goto case 0x0085;
case 0x0085://WM_NCPAINT
{
IntPtr hdc = GetWindowDC(m.HWnd);
//将WindowDC转换为.net的graphics以便使用framework所提供的绘图功能
Graphics gs = Graphics.FromHdc(hdc);
gs.FillRectangle(new LinearGradientBrush(m_rect, Color.Pink, Color.Purple,//画按钮
LinearGradientMode.BackwardDiagonal), m_rect); StringFormat strfmt = new StringFormat(); strfmt.Alignment = StringAlignment.Center;
strfmt.LineAlignment = StringAlignment.Center; gs.DrawString("X", this.parent.Font, Brushes.Black, m_rect, strfmt);//关闭按钮文本及颜色设置
gs.Dispose();
ReleaseDC(m.HWnd, hdc);
break;
}
case 0x00a1:
Point mousepoint = new Point((int)m.LParam);
mousepoint.Offset(-this.parent.Left, -this.parent.Top);
if (m_rect.Contains(mousepoint))
{
this.parent.Close();
}
break;
} //点击测试的消息判定
if (m.Msg == 0x0084)
{
m.Result = (IntPtr)HitTest();
return;
} base.WndProc(ref m);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货