如何改变winForm(C#)标题栏的颜色?

chenzhirun 2007-03-01 10:13:38
winForm的标题栏一直是蓝色的,如何改变成其它颜色了?查了很多资料也没查到!那位指导一下阿。万分感谢了
...全文
14931 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不懂...
eb5mj 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

转贴一个:

C# WinForm 中在窗口标题栏上加按钮

【摘 要】Windows API中的HDC可以通过Graphics.FromHdc()转换为(创建出)System.Drawing.Graphics,然后就可以用.NET Framework (GID+??)提供的绘图功能方便地进行画图了。

在窗口标题栏上加按钮本来不是什么新鲜事了,我在VC+……
[/Quote]

为啥我这看不到效果呢?
xia20108 2012-03-27
  • 打赏
  • 举报
回复
学习了 收藏
s253425456 2011-05-23
  • 打赏
  • 举报
回复
mark
xiaotiange 2010-08-26
  • 打赏
  • 举报
回复
mark
hzg382550472 2010-08-20
  • 打赏
  • 举报
回复
mark
gsmlove 2008-12-23
  • 打赏
  • 举报
回复
mark
cdygf 2008-09-05
  • 打赏
  • 举报
回复
mark
wangzhonglv 2008-07-25
  • 打赏
  • 举报
回复
标题栏失去焦点不变灰色..还是不会啊..哪位大虾...发下代码..
jingang123gz 2008-07-23
  • 打赏
  • 举报
回复

用C#实现在客户区拖动窗体

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
//首先必须了解Windows的消息传递机制,当有鼠标活动消息时,
//系统发送WM_NCHITTEST 消息给窗体作为判断消息发生地的根据。
//假如你点击的是标题栏,窗体收到的消息值就是 HTCAPTION ,
//同样地,若接受到的消息是 HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区。


protected override void WndProc(ref Message m)
{
//当重载窗体的 WndProc 方法时,可以截获 WM_NCHITTEST 消息并改些该消息,
//当判断鼠标事件发生在客户区时,改写改消息,发送 HTCAPTION 给窗体,
//这样,窗体收到的消息就时 HTCAPTION ,在客户区通过鼠标来拖动窗体就如同通过标题栏来拖动一样。
//注意:当你重载 WndProc 并改写鼠标事件后,整个窗体的鼠标事件也就随之改变了。


switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
return;
// break;
}
base.WndProc(ref m);
}
北京的雾霾天 2007-03-06
  • 打赏
  • 举报
回复
放控件可以,但是你最好不要把控件当成标题栏.

你看我的frmMove 类了吗?运行一下试试.
chenzhirun 2007-03-06
  • 打赏
  • 举报
回复
平民百姓,你好:
标题拦要用来显示一个标题,一个最小化和关闭按钮,如果没有控件如何实现标题拦的功能了?
我用一个panel,里面包含文字,最小化,关闭按钮做了个标题拦,设置其Dock状态为top,标题拦的颜色也可以自由改变,但是在panel下面的地方动鼠标可以移动窗体,在panel区域动鼠标却不能移动窗体,如果反过来就好了。我尝试改动下面的语句也不行
if (m.Result == panel1.Handle)
{
m.Result = HTCAPTION;//模拟标题栏,移动或双击可以最大或最小化窗体
}
麻烦你看看这样能实现吗?你上一贴说的方法留出窗体上面的部分,如果要实现标题拦的功能还得放控件啊。谢谢。:)希望能和你交个朋友。我的msn:chenzhirun@hotmail.com
北京的雾霾天 2007-03-06
  • 打赏
  • 举报
回复
做为标题栏的部分一定不能有任何控件,要是窗体部分.
比如在窗体上部留出TitleHeight的高度,这个高度下面才能有其它的控件,比如菜单,Panel,Button等其它控件.
你可以把窗体的Form.Padding 属性来实现控件Dock状态下留出上面的部分.
chenzhirun 2007-03-06
  • 打赏
  • 举报
回复
平民百姓:你好,你的这个方法这个问题是怎么解决的?
internal static IntPtr HTCLIENT = (IntPtr)0x1;//工作区
internal static IntPtr HTCAPTION = (IntPtr)0x2; //标题栏
我的标题拦是用一个 panel,里面包含文字,最小化,关闭按钮,我这个标题拦怎么和你定义的这个标题拦关联了?工作区也存在这个问题,麻烦你给看看
rainyubin 2007-03-06
  • 打赏
  • 举报
回复
mark
chenzhirun 2007-03-06
  • 打赏
  • 举报
回复
平民百姓,你好.
你的frmMove 类我运行过了,只是放控件就不行了。按你上一贴的方法,设置窗体的Form.Padding 属性,然后手绘文字代替label显示文字就解决问题了。谢谢啊,真的很感谢你。

网上还是好人多,有困难时总有人象平民百姓这样的热心人。以后我也要多发贴,尽自己能里帮助别人。
北京的雾霾天 2007-03-05
  • 打赏
  • 举报
回复
有多余代码,再发一个楼主可以试试看:
public partial class frmMove : Form
{
public frmMove()
{
InitializeComponent();
}
internal static int WM_NCHITTEST = 0x84; //移动鼠标,按住或释放鼠标时发生的系统消息
internal static IntPtr HTCLIENT = (IntPtr)0x1;//工作区
internal static IntPtr HTCAPTION = (IntPtr)0x2; //标题栏
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCHITTEST)
{
base.WndProc(ref m);
if (m.Result == HTCLIENT)
{
m.Result = HTCAPTION;//模拟标题栏,移动或双击可以最大或最小化窗体
}
}
else
{
base.WndProc(ref m);
}
}
}
北京的雾霾天 2007-03-05
  • 打赏
  • 举报
回复
就像你说的,把默认的标题隐藏起来自己做一个最好,关于窗体的拖动,可以参考下如下的代码:
public partial class frmMove : Form
{
public frmMove()
{
InitializeComponent();
}
internal static int WM_NCHITTEST = 0x84; //移动鼠标,按住或释放鼠标时发生的系统消息
internal static IntPtr HTCLIENT = (IntPtr)0x1;//工作区
internal static IntPtr HTCAPTION = (IntPtr)0x2; //标题栏
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCHITTEST)
{
base.WndProc(ref m);
if (m.Result == HTCLIENT)
{
m.HWnd = this.Handle;

System.Drawing.Rectangle rect = this.RectangleToScreen(this.ClientRectangle);
Point C_Pos = Cursor.Position;
m.Result = HTCAPTION;//模拟标题栏,移动或双击可以最大或最小化窗体
}
}
else
{
base.WndProc(ref m);
}
}
}
chenzhirun 2007-03-05
  • 打赏
  • 举报
回复
咸鱼的解决办法很好,基本解决了问题,不过还有一点:标题拦右边的最大化,最小化按钮的颜色没有跟着改变过来,窗体刚运行时新颜色把这几个按钮都盖住了,移动窗体时就显示出来了,但颜色还是老颜色。如能让这几个按钮和标题拦的颜色同步且窗体一出来就显示出来就完美了。还有一个解决思路是隐藏窗体自身的标题拦,自己做一个标题拦,颜色,按钮都可以很好的显示,但是鼠标点在这个标题拦却无法拖动窗体,谁要是把这个问题解决了那就更完美了。
兔子-顾问 2007-03-02
  • 打赏
  • 举报
回复
好贴。收藏
加载更多回复(10)
自定义winform 窗口标题栏 主要代码 public partial class ZForm : Form { private bool moving = false; private Point oldMousePosition; public new FormBorderStyle FormBorderStyle { get { return base.FormBorderStyle; } set { if (value != FormBorderStyle.Sizable && value != FormBorderStyle.SizableToolWindow) { titlepanel.Controls.Remove(button2); } base.FormBorderStyle = value; } } #region 隐藏父类的属性,使其不可见 [Browsable(false)] public new string Text { get { return titlelabel.Text; } set { } } [Browsable(false)] public new bool ControlBox { get { return false; } set { base.ControlBox = false; } } #endregion [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题")] public string Title { get { return titlelabel.Text; } set { titlelabel.Text = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题字体样式")] public Font TitleFont { get { return titlelabel.Font; } set { titlelabel.Font = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题字体颜色")] public Color TitleColor { get { return titlelabel.ForeColor; } set { titlelabel.ForeColor = value; } } [Browsable(true)] [EditorBrowsable(EditorBrowsableState.Always)] [Description("窗体标题栏背景色")] public Color TitleBarBackColor { get { return titlepanel.BackColor; } set { titlepanel.BackColor = value; } } public new bool MaximizeBox { get { return titlepanel.Contains(button2); } set { if (!value) { titlepanel.Controls.Remove(button2); } else if (!titlepanel.Contains(button2)) { titlepanel.Controls.Add(button2); } } } public new bool MinimizeBox { get { return titlepanel.Contains(button3); } set { if (!value) { titlepanel.Controls.Remove(button3); } else if (!titlepanel.Contains(button3)) { titlepanel.Controls.Add(button3); } } } private void ResetTitlePanel() { base.ControlBox = false; base.Text = null; SetToolTip(button1, "关闭"); button2.Size = button1.Size; SetToolTip(button2, "最大化或还原"); button3.Size = button1.Size; SetToolTip(button3, "最小化"); } private void SetToolTip(Control ctrl, string tip) { new ToolTip().SetToolTip(ctrl, tip); } public ZForm() { InitializeComponent(); ResetTitlePanel(); } private void Titlebutton_Click(object sender, EventArgs e) { Button btn = (Button)sender; switch (btn.Tag.ToString()) { case "close": { this.Close(); break; } case "max": { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; } else { this.WindowState = FormWindowState.Maximized; } break; } case "min": { if (this.WindowState != FormWindowState.Minimized) { this.WindowState = FormWindowState.Minimized; } break; } } } private void Titlepanel_MouseDown(object sender, MouseEventArgs e) { if (this.WindowState == FormWindowState.Maximized) { return; } //Titlepanel.Cursor = Cursors.NoMove2D; oldMousePosition = e.Location; moving = true; } private void Titlepanel_MouseUp(object sender, MouseEventArgs e) { //Titlepanel.Cursor = Cursors.Default; moving = false; } private void Titlepanel_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && moving) { Point newPosition = new Point(e.Location.X - oldMousePosition.X, e.Location.Y - oldMousePosition.Y); this.Location += new Size(newPosition); } } private void Titlepanel_DoubleClick(object sender, EventArgs e) { if (titlepanel.Contains(button2)) { button2.PerformClick(); } } private void titlepanel_ControlRemoved(object sender, ControlEventArgs e) { switch (e.Control.Name) { case "button2": { if (titlepanel.Contains(button3)) { button3.Left = button1.Left - button1.Width; } break; } } } private void titlepanel_ControlAdded(object sender, ControlEventArgs e) { switch (e.Control.Name) { case "button2": { if (titlepanel.Contains(button3)) { button3.Left = button2.Left - button2.Width; } break; } case "button3": { if (titlepanel.Contains(button2)) { button3.Left = button2.Left - button2.Width; } break; } } } }

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧