其实是一个 无边框窗体,写成的表单类....但是外表看起来和普通的FORM完全一样.
呵呵. 最可惜的是,现在还没找到,在工具栏上放菜单的办法......哭....
下面是运行时候的图片..

我喜欢程序,更喜欢程序有个PL的界面....
但是网上似乎找不到详细的,关于此方面的教程或源码.
重绘时改用了双缓冲,在窗体上有动画的时候,重绘不会出现闪烁的现象了.
献丑一下,把源码贴出来,大家一起交流....
下面是引用,以及,声明的部分##########################################
using System; using System.ComponentModel; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Runtime.InteropServices; namespace XpFormOfApc { /// <summary> /// Form1 的摘要说明。 /// </summary> public class XpForm : System.Windows.Forms.Form { public delegate void SysHandler(object sender,System.EventArgs e); public event SysHandler SysDoubleClick;
//############API设置窗口STYLE############# private const int GWL_STYLE = (-16); private const int WS_SYSMENU = 0x80000; private const int WS_SIZEBOX = 0x40000; private const int WS_MAXIMIZEBOX = 0x10000; private const int WS_MINIMIZEBOX=0x20000; [System.Runtime.InteropServices.DllImport("user32", EntryPoint="SetWindowLong")] private static extern int SetWindowLongA(int hwnd, int nIndex, int dwNewLong); //###########普通组件定义################# private System.ComponentModel.IContainer components; private System.Windows.Forms.ImageList imglist; private System.Windows.Forms.ImageList syslist; //###############组件属性################## //---系统按钮--- private bool Sys_Close_Visible=true; private bool Sys_Max_Visible=true; private bool Sys_Res_Visible=false; private bool Sys_Min_Visible=true; private bool Sys_Down_Visible=false; private bool Sys_Up_Visible=true; private bool Sys_Tray_Visible=true; private bool IsShowInTray=false; private int FormIconWidth=16; private int FormIconHeight=16; private const int ONE=23; //按钮宽21+2间隔 private int[,] SysCmd=new int[9,7]{ {1,0,7,0,6,21,21}, {1,1,8,0,6,21,21}, {0,2,9,0,6,21,21}, {1,3,10,0,6,21,21}, {0,4,11,0,6,21,21}, {1,5,12,0,6,21,21}, {1,6,13,0,6,21,21}, {10,5,12,0,0,21,21}, {11,5,12,32,0,0,30} }; //10-FORM_ICON 11-FORM_TITLE //---表单图标--托盘图标--- private NotifyIcon ni=new NotifyIcon(); private Icon TrayIcon; private ContextMenu TrayContextMenu; private string[] TrayToolTip; private string TempTrayToolTip; //public event SysOnDoubleClick (System.EventArgs e); //托盘图标双击事件
private Rectangle FormRect;//表单上一状态的RECT 用于Down还原
//允许拖拽标志 - 坐标 private bool CanMove=false; private Point CurPoint=new Point(0,0); private Point CurPoint2=new Point(0,0);
// private int CanUp=0;
//==================================================== [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd,int wMsg,int wParam,int lParam); private const int WM_SYSCOMMAND=0x0112; private const int SC_MOVE=0xF010; private const int HTCAPTION=0x0002; private const int HTRIGHT=0x0011;
################ 下面是代码 ###############
public XpForm() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); //this.SetBounds(4,30,this.Width-8,this.Height-34); // // TOD 在 InitializeComponent 调用后添加任何构造函数代码 // }
/// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }
#region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(XpForm)); this.imglist = new System.Windows.Forms.ImageList(this.components); this.syslist = new System.Windows.Forms.ImageList(this.components); // // imglist // this.imglist.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; this.imglist.ImageSize = new System.Drawing.Size(50, 50); this.imglist.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imglist.ImageStream"))); this.imglist.TransparentColor = System.Drawing.Color.Black; // // syslist // this.syslist.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; this.syslist.ImageSize = new System.Drawing.Size(21, 21); this.syslist.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("syslist.ImageStream"))); this.syslist.TransparentColor = System.Drawing.Color.Transparent; // // XpForm // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(280, 136); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "XpForm"; this.Text = "APC心灵空间";
} #endregion
/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //XpForm xf=new XpForm(); //xf.SysDoubleClick+=new SysHandler(xf.ni_DoubleClick); Application.Run(new XpForm());
}
//######################### 自 定 函 数 ############################## private void RePaint(bool ClearAll) { Graphics g=this.CreateGraphics(); if(ClearAll==true){g.Clear(Color.FromArgb(242,242,242));} //画XP边框 g.DrawImage(imglist.Images[1],0,0,this.Width+50,30); //横幅 g.DrawImage(imglist.Images[0],0,0,6,30); //左角 g.DrawImage(imglist.Images[2],this.Width-6,0,6,30); //右角 g.DrawImage(imglist.Images[5],0,this.Height-4,this.Width+50,4);//下边 g.DrawImage(imglist.Images[3],0,7,4,this.Height); //左边 g.DrawImage(imglist.Images[4],this.Width-4,7,4,this.Height);//右边 //画图标 g.DrawImage((Image)this.Icon.ToBitmap(),new Rectangle(8,6,FormIconWidth,FormIconHeight)); //画标题 g.DrawString(this.Text,new Font("宋体",9,FontStyle.Bold),new SolidBrush(Color.White),32,10); //计算..画按钮 InitSysCmd(); int SysIndex=1; for(int i=0;i<=6;i++) { //if(SysVisible[i]==1) if(SysCmd[i,0]==1) { g.DrawImage(syslist.Images[i],this.Width-ONE*SysIndex-6,6,21,21); SysCmd[i,3]=this.Width-ONE*SysIndex-6; //记录各SysCmd的Rect.X SysCmd[8,5]=this.Width-ONE*SysIndex-6; //标题栏拖拽的长度 SysIndex+=1; } }
g.Dispose(); } private void RePaint() { Bitmap b=new Bitmap(this.Width,this.Height); Graphics bmp=Graphics.FromImage((Image)b); //Bitmap c=new Bitmap(100,100,this.CreateGraphics()); //g.Clear(this.BackColor); //画XP边框 bmp.DrawImage(imglist.Images[1],0,0,this.Width+50,30); //横幅 bmp.DrawImage(imglist.Images[0],0,0,6,30); //左角 bmp.DrawImage(imglist.Images[2],this.Width-6,0,6,30); //右角 bmp.DrawImage(imglist.Images[5],0,this.Height-4,this.Width+50,4);//下边 bmp.DrawImage(imglist.Images[3],0,7,4,this.Height); //左边 bmp.DrawImage(imglist.Images[4],this.Width-4,7,4,this.Height);//右边 //画图标 bmp.DrawImage((Image)this.Icon.ToBitmap(),new Rectangle(8,6,FormIconWidth,FormIconHeight)); //画标题 bmp.DrawString(this.Text,new Font("宋体",9,FontStyle.Bold),new SolidBrush(Color.White),32,10); //计算..画按钮 InitSysCmd(); int SysIndex=1; for(int i=0;i<=6;i++) { //if(SysVisible[i]==1) if(SysCmd[i,0]==1) { bmp.DrawImage(syslist.Images[i],this.Width-ONE*SysIndex-6,6,21,21); SysCmd[i,3]=this.Width-ONE*SysIndex-6; //记录各SysCmd的Rect.X SysCmd[8,5]=this.Width-ONE*SysIndex-6; //标题栏拖拽的长度 SysIndex+=1; } } Graphics g=this.CreateGraphics(); g.DrawImage(b,0,0); bmp.Dispose(); g.Dispose(); }
private void ReCreateRegion() { Rectangle r=Screen.GetWorkingArea(this); Point[] p=new Point[]{ new Point(0,6), new Point(1,4), new Point(4,1), new Point(6,0), new Point(this.Width-6,0), new Point(this.Width-4,1), new Point(this.Width-1,4), new Point(this.Width-1,5), new Point(this.Width,this.Height), new Point(0,this.Height)}; byte[] b=new byte[]{ (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line}; System.Drawing.Drawing2D.GraphicsPath path=new GraphicsPath(p,b); this.Region=new Region(path);
} private void InitSysCmd() { if(Sys_Close_Visible==true){SysCmd[0,0]=1;} else{SysCmd[0,0]=0;} if(Sys_Max_Visible==true){SysCmd[1,0]=1;} else{SysCmd[1,0]=0;} if(Sys_Res_Visible==true){SysCmd[2,0]=1;} else{SysCmd[2,0]=0;} if(Sys_Min_Visible==true){SysCmd[3,0]=1;} else{SysCmd[3,0]=0;} if(Sys_Up_Visible==true){SysCmd[5,0]=1;} else{SysCmd[5,0]=0;} if(Sys_Down_Visible==true){SysCmd[4,0]=1;} else{SysCmd[4,0]=0;} if(Sys_Tray_Visible==true){SysCmd[6,0]=1;} else{SysCmd[6,0]=0;} } private void DoClick(int i) { switch(i) { case 0://关闭 this.Close(); break; case 1://最大化 this.WindowState=FormWindowState.Maximized; break; case 2://还原 this.WindowState=FormWindowState.Normal; break; case 3://最小化 this.WindowState=FormWindowState.Minimized; break; case 4://放下 this.Top=FormRect.Y; this.Left=FormRect.X; this.Width=FormRect.Width; this.Height=FormRect.Height; Sys_Down_Visible=false; Sys_Up_Visible=true; //this.RePaint(); break; case 5://收起 FormRect=new Rectangle(this.Left,this.Top,this.Width,this.Height); this.Height=30; this.Top=0; Sys_Up_Visible=false; Sys_Down_Visible=true; this.RePaint(); break; case 6://缩入托盘 ni.Text=TempTrayToolTip; ni.Icon=TrayIcon; ni.ContextMenu=TrayContextMenu; this.WindowState=FormWindowState.Minimized; this.ShowInTaskbar=false; this.Visible=false; ni.Visible=true; break; }
} private void ni_DoubleClick(object sender,System.EventArgs e) { OnSysDoubleClick(e); if(ShowInTray==true) { ni.Visible=true; } } void OnSysDoubleClick(System.EventArgs e) { if(this.Visible==true) { this.WindowState=FormWindowState.Minimized; this.ShowInTaskbar=false; this.Visible=false; ni.Visible=true; } else { int mStyle=WS_SYSMENU; if(Sys_Max_Visible==true){mStyle=mStyle|WS_MAXIMIZEBOX;} if(Sys_Min_Visible==true){mStyle=mStyle|WS_MINIMIZEBOX;}
if(ShowInTray==false){ni.Visible=false;}
this.ShowInTaskbar=true; this.WindowState=FormWindowState.Minimized; int a=SetWindowLongA(this.Handle.ToInt32(),GWL_STYLE,mStyle); this.Visible=true; this.WindowState=FormWindowState.Normal; } }
#region __重 载 事 件___ //######################### 重 载 事 件 ############################### protected override void OnLoad(System.EventArgs e) { int mStyle=WS_SYSMENU; if(Sys_Max_Visible==true){mStyle=mStyle|WS_MAXIMIZEBOX;} if(Sys_Min_Visible==true){mStyle=mStyle|WS_MINIMIZEBOX;} int a=SetWindowLongA(this.Handle.ToInt32(),GWL_STYLE,mStyle); if(IsShowInTray==true){ni.Icon=TrayIcon;ni.ContextMenu=TrayContextMenu;ni.Text=TempTrayToolTip;ni.Visible=true;} this.ni.DoubleClick+=new System.EventHandler(this.ni_DoubleClick); this.SetStyle(ControlStyles.DoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.ContainerControl,true); } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { //base.OnPaint(e); this.RePaint(); base.OnPaint(e); //ee=e; } protected override void OnResize(System.EventArgs e) { Rectangle r=Screen.GetWorkingArea(this); this.MaximumSize=new Size(r.Width,r.Height); if(this.WindowState==FormWindowState.Maximized) { if(Sys_Max_Visible==true) { Sys_Max_Visible=false; Sys_Res_Visible=true; } if(Sys_Up_Visible==true) { Sys_Up_Visible=false; CanUp=1; } } if(this.WindowState==FormWindowState.Normal) { if(Sys_Res_Visible==true) { Sys_Max_Visible=true; Sys_Res_Visible=false; } if(CanUp==1) { Sys_Up_Visible=true; CanUp=0; } } this.RePaint(); //this.OnPaint(ee); ReCreateRegion(); this.Refresh(); } protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) { if(CanMove==true) { //this.Cursor=Cursors.SizeAll; //this.Top=Cursor.Position.Y-CurPoint.Y; //this.Left=Cursor.Position.X-CurPoint.X; if(CurPoint.X>SysCmd[8,3] && CurPoint.X<SysCmd[8,5] && CurPoint.Y<30 && (Sys_Res_Visible!=true )) { ReleaseCapture(); SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION, 0); } }
Graphics g=this.CreateGraphics(); for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { if(e.X>SysCmd[i,3] && e.X<SysCmd[i,3]+21 && e.Y>6 && e.Y<27) {g.DrawImage(syslist.Images[SysCmd[i,2]],SysCmd[i,3],6,21,21);} else{g.DrawImage(syslist.Images[SysCmd[i,1]],SysCmd[i,3],6,21,21);} } } g.Dispose();
CurPoint2.X=Cursor.Position.X-this.Left; CurPoint2.Y=Cursor.Position.Y-this.Top; } protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { if(e.Button==MouseButtons.Left && e.X>SysCmd[8,3] && e.X<SysCmd[8,5] && e.Y<30) { CanMove=true; } CurPoint.X=e.X; CurPoint.Y=e.Y; }
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e) { //if(e.Button==MouseButtons.Left && e.X>SysCmd[8,3] && e.X<SysCmd[8,5] && e.Y<30) //{ CanMove=false; this.Cursor=Cursors.Default; //} }
protected override void OnClick(System.EventArgs e) { for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { if(CurPoint.X>SysCmd[i,3] && CurPoint.X<SysCmd[i,3]+21 && CurPoint.Y>6 && CurPoint.Y<27) {DoClick(i);} else{} } } } protected override void OnDoubleClick(System.EventArgs e) { if(CurPoint.X>SysCmd[8,3] && CurPoint.X<SysCmd[8,5] && CurPoint.Y<30 && (Sys_Max_Visible==true||Sys_Res_Visible==true )) { if(this.WindowState==FormWindowState.Maximized) { this.WindowState=FormWindowState.Normal; } else { this.WindowState=FormWindowState.Maximized; } this.Cursor=Cursors.Default; } }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { ni.Visible=false; ni.Dispose(); }
protected override void OnTextChanged(System.EventArgs e) {this.RePaint(false);}
//protected override void OnLayout(System.Windows.Forms.LayoutEventArgs e) //{ //mmd,在这里一加事件,居然从TRAY里恢复窗口的时候,不从画子控件了..郁闷 //this.XpPanel.Location=new Point(4,30); //this.XpPanel.Size=new Size(this.Width-8,this.Height-34); //this.XpPanel.SendToBack(); //foreach(Control c in this.Controls) //{ //c.Parent=this.XpPanel; //} //}
//protected override void OnControlAdded(System.Windows.Forms.ControlEventArgs ce) //{ /* 这也不是什么根本的办法,,,,,自己用还中.... try { if(ce.Control.Parent==this && ce.Control.Name!=this.Name && ce.Control.Name!=this.XpPanel.Name) { ce.Control.Parent=this.XpPanel; } } catch{} */ //}
/* protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x0084 && CurPoint2.Y<=30 ) //WM_NCHITTEST { m.Result= (IntPtr)2; // HTCLIENT this.Text=this.CurPoint2.Y.ToString(); return; } }*/ //protected override void OnActivated(System.EventArgs e) //{
//} //#################################################################### #endregion
#region 自 定 义 属 性 //####################### 自 定 义 属 性 ############################# [ Category("XpForm属性"), Description("获取或设置窗体的关闭按钮是否可见.") ] public bool Sys_Close_IsVisible { get{return Sys_Close_Visible;} set { Sys_Close_Visible=value; InitSysCmd(); int SysIndex=0; for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { SysIndex+=1; } } this.Invalidate(new Rectangle(this.Width-6-ONE*SysIndex,6,6+ONE*SysIndex,21)); } } [ Category("XpForm属性"), Description("获取或设置窗体的最大化按钮是否可见.") ] public bool Sys_Max_IsVisible { get{return Sys_Max_Visible;} set { Sys_Max_Visible=value; InitSysCmd(); int SysIndex=0; for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { SysIndex+=1; } } this.Invalidate(new Rectangle(this.Width-6-ONE*SysIndex,6,6+ONE*SysIndex,21)); } } [ Category("XpForm属性"), Description("获取或设置窗体的最小化按钮是否可见.") ] public bool Sys_Min_IsVisible { get{return Sys_Min_Visible;} set { Sys_Min_Visible=value; InitSysCmd(); int SysIndex=0; for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { SysIndex+=1; } } this.Invalidate(new Rectangle(this.Width-6-ONE*SysIndex,6,6+ONE*SysIndex,21)); } } [ Category("XpForm属性"), Description("获取或设置窗体的收起(向上)按钮是否可见.") ] public bool Sys_Up_IsVisible { get{return Sys_Up_Visible;} set { Sys_Up_Visible=value; InitSysCmd(); int SysIndex=0; for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { SysIndex+=1; } } this.Invalidate(new Rectangle(this.Width-6-ONE*SysIndex,6,6+ONE*SysIndex,21)); } } [ Category("XpForm属性"), Description("获取或设置窗体的缩入托盘按钮是否可见.") ] public bool Sys_Tray_IsVisible { get{return Sys_Tray_Visible;} set { Sys_Tray_Visible=value; InitSysCmd(); int SysIndex=0; for(int i=0;i<=6;i++) { if(SysCmd[i,0]==1) { SysIndex+=1; } } this.Invalidate(new Rectangle(this.Width-6-ONE*SysIndex,6,6+ONE*SysIndex,21)); } } [ Category("XpForm属性"), Description("获取或设置窗体在托盘区显示的图标.") ] public Icon Sys_Icon { get{return TrayIcon;} set{TrayIcon=value;ni.Icon=TrayIcon;} } [ Category("XpForm属性"), Description("获取或设置窗体在托盘区的上下文菜单.") ] public ContextMenu Sys_ContextMenu { get{return TrayContextMenu;} set{TrayContextMenu=value;ni.ContextMenu=TrayContextMenu;} } [ Category("XpForm属性"), Description("获取或设置当鼠标停留在托盘区图标上时的提示文字.") ] public string Sys_ToolTip { get{return TempTrayToolTip;} set{TempTrayToolTip=value;TrayToolTip=TempTrayToolTip.Split("\n".ToCharArray(),0);ni.Text=value;} } [ Category("XpForm属性"), Description("多行编辑控件中的文本行,作为字符串值的数组.(用于设置多行ToolTip)") ] public string[] Sys_ToolTip_Lines { get{return TrayToolTip;} set { string[] a=value; //TrayToolTip=value[0]; TempTrayToolTip=""; for(int i=0;i<=a.Length-1;i++) { TempTrayToolTip=TempTrayToolTip+a.GetValue(i).ToString(); if(i<a.Length-1) { TempTrayToolTip=TempTrayToolTip+"\n"; } } ni.Text=TempTrayToolTip; TrayToolTip=value; } } [ Category("XpForm属性"), Description("获取或设置窗体刚启动时是否在托盘区显示.(需要先设置Sys_Icon属性.)") ] public bool ShowInTray { get{return IsShowInTray;} set { IsShowInTray=value; if(!this.DesignMode) { ni.Icon=TrayIcon; ni.ContextMenu=TrayContextMenu; ni.Text=TempTrayToolTip; ni.Visible=value; } } } [ Category("XpForm属性"), Description("窗体图标的宽.)") ] public int FormIcon_Width { get{return FormIconWidth;} set { if(value>=FormIconWidth) { FormIconWidth=value; this.Invalidate(new Rectangle(8,6,value,FormIconHeight)); } else { int temp=FormIconWidth; FormIconWidth=value; this.Invalidate(new Rectangle(8,6,value,temp)); } } } [ Category("XpForm属性"), Description("窗体图标的高.)") ] public int FormIcon_Height { get{return FormIconHeight;} set { if(value>=FormIconHeight) { FormIconHeight=value; this.Invalidate(new Rectangle(8,6,FormIconWidth,value)); } else { int temp=FormIconHeight; FormIconHeight=value; this.Invalidate(new Rectangle(8,6,temp,value)); } } } //#################################################################### #endregion } }
我把相关的部分,,都用几行来隔开了...
主要就是,自定义函数部分... 重载事件.部分.....自定义属性部分......
希望能对大家有所帮助.
我的QQ. 23559055 
|