一个Xp风格的表单类(一)

其实是一个 无边框窗体,写成的表单类....但是外表看起来和普通的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
{
///

1<summary>   
2/// Form1 的摘要说明。   
3/// </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 调用后添加任何构造函数代码
//
}

///

1<summary>   
2/// 清理所有正在使用的资源。   
3/// </summary>

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
///

1<summary>   
2/// 设计器支持所需的方法 - 不要使用代码编辑器修改   
3/// 此方法的内容。   
4/// </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

///

1<summary>   
2/// 应用程序的主入口点。   
3/// </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-ONESysIndex-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-ONESysIndex-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

 1<syscmd[8,5] &&="" (sys_res_visible!="true" ))="" 0);="" curpoint.y<30="" for(int="" g="this.CreateGraphics();" graphics="" i="0;i&lt;=6;i++)" if(e.x="" if(syscmd[i,0]="1)" releasecapture();="" sendmessage(this.handle,wm_syscommand,sc_move+htcaption,="" {="" }="">SysCmd[i,3] &amp;&amp; e.X<syscmd[i,3]+21 &&="" e.y="">6 &amp;&amp; e.Y&lt;27)   
 2{g.DrawImage(syslist.Images[SysCmd[i,2]],SysCmd[i,3],6,21,21);}   
 3else{g.DrawImage(syslist.Images[SysCmd[i,1]],SysCmd[i,3],6,21,21);}   
 4}   
 5}   
 6g.Dispose(); 
 7
 8CurPoint2.X=Cursor.Position.X-this.Left;   
 9CurPoint2.Y=Cursor.Position.Y-this.Top;   
10}   
11protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)   
12{   
13if(e.Button==MouseButtons.Left &amp;&amp; e.X&gt;SysCmd[8,3] &amp;&amp; e.X<syscmd[8,5] &&="" canmove="true;" curpoint.x="e.X;" curpoint.y="e.Y;" e)="" e.x="" e.y<30)="" if(e.button="MouseButtons.Left" onmouseup(system.windows.forms.mouseeventargs="" override="" protected="" void="" {="" }="">SysCmd[8,3] &amp;&amp; e.X<syscmd[8,5] &&="" canmove="false;" e)="" e.y<30)="" for(int="" i="0;i&lt;=6;i++)" if(curpoint.x="" if(syscmd[i,0]="1)" onclick(system.eventargs="" override="" protected="" this.cursor="Cursors.Default;" void="" {="" }="">SysCmd[i,3] &amp;&amp; CurPoint.X<syscmd[i,3]+21 &&="" curpoint.y="">6 &amp;&amp; CurPoint.Y&lt;27)   
14{DoClick(i);}   
15else{}   
16}   
17}   
18}   
19protected override void OnDoubleClick(System.EventArgs e)   
20{   
21if(CurPoint.X&gt;SysCmd[8,3] &amp;&amp; CurPoint.X<syscmd[8,5] #######################="" #############################="" ####################################################################="" #endregion="" #region="" &&="" (m.msg="0x0084" (sys_max_visible="true||Sys_Res_Visible==true" )="" ))="" *="" ;="" [="" ]="" a="value;" base.wndproc(ref="" bool="" c="" c.parent="this.XpPanel;" catch{}="" category("xpform属性"),="" ce)="" ce.control.name!="this.XpPanel.Name)" ce.control.parent="this.XpPanel;" contextmenu="" curpoint.y<30="" curpoint2.y<="30" description("多行编辑控件中的文本行,作为字符串值的数组.(用于设置多行tooltip)")="" description("窗体图标的宽.)")="" description("获取或设置当鼠标停留在托盘区图标上时的提示文字.")="" description("获取或设置窗体刚启动时是否在托盘区显示.(需要先设置sys_icon属性.)")="" description("获取或设置窗体在托盘区显示的图标.")="" description("获取或设置窗体在托盘区的上下文菜单.")="" description("获取或设置窗体的关闭按钮是否可见.")="" description("获取或设置窗体的收起(向上)按钮是否可见.")="" description("获取或设置窗体的最大化按钮是否可见.")="" description("获取或设置窗体的最小化按钮是否可见.")="" description("获取或设置窗体的缩入托盘按钮是否可见.")="" e)="" else="" for(int="" foreach(control="" formicon_width="" formiconwidth;}="" get{return="" htclient="" i="0;i&lt;=a.Length-1;i++)" icon="" if="" if(!this.designmode)="" if(ce.control.parent="this" if(i<a.length-1)="" if(syscmd[i,0]="1)" if(this.windowstate="FormWindowState.Maximized)" if(value="" in="" initsyscmd();="" int="" isshowintray="value;" isshowintray;}="" m)="" m);="" m.result="(IntPtr)2;" message="" mmd,在这里一加事件,居然从tray里恢复窗口的时候,不从画子控件了..郁闷="" ni.contextmenu="TrayContextMenu;" ni.dispose();="" ni.icon="TrayIcon;" ni.text="TempTrayToolTip;" ni.visible="value;" onactivated(system.eventargs="" onclosing(system.componentmodel.canceleventargs="" oncontroladded(system.windows.forms.controleventargs="" onlayout(system.windows.forms.layouteventargs="" ontextchanged(system.eventargs="" override="" point(4,30);="" protected="" public="" rectangle(this.width-6-one*sysindex,6,6+one*sysindex,21));="" return;="" set="" set{temptraytooltip='value;TrayToolTip=TempTrayToolTip.Split("\n".ToCharArray(),0);ni.Text=value;}' set{traycontextmenu="value;ni.ContextMenu=TrayContextMenu;}" set{trayicon="value;ni.Icon=TrayIcon;}" showintray="" size(this.width-8,this.height-34);="" string="" string[]="" sys_close_isvisible="" sys_close_visible="value;" sys_close_visible;}="" sys_contextmenu="" sys_icon="" sys_max_isvisible="" sys_max_visible="value;" sys_max_visible;}="" sys_min_isvisible="" sys_min_visible="value;" sys_min_visible;}="" sys_tooltip="" sys_tooltip_lines="" sys_tray_isvisible="" sys_tray_visible="value;" sys_tray_visible;}="" sys_up_isvisible="" sys_up_visible="value;" sys_up_visible;}="" sysindex="0;" sysindex+="1;" temptraytooltip='TempTrayToolTip+"\n";' temptraytooltip;}="" this.controls)="" this.cursor="Cursors.Default;" this.invalidate(new="" this.text="this.CurPoint2.Y.ToString();" this.windowstate="FormWindowState.Maximized;" this.xppanel.location="new" this.xppanel.sendtoback();="" this.xppanel.size="new" traycontextmenu;}="" trayicon;}="" traytooltip="value;" traytooltip;}="" try="" void="" wm_nchittest="" wndproc(ref="" {="" {this.repaint(false);}="" }="" }*="" 义="" 定="" 属="" 性="" 自="" 这也不是什么根本的办法,,,,,自己用还中....="">=FormIconWidth)   
22{   
23FormIconWidth=value;   
24this.Invalidate(new Rectangle(8,6,value,FormIconHeight));   
25}   
26else   
27{   
28int temp=FormIconWidth;   
29FormIconWidth=value;   
30this.Invalidate(new Rectangle(8,6,value,temp));   
31}   
32}   
33}   
34[   
35Category("XpForm属性"),   
36Description("窗体图标的高.)")   
37]   
38public int FormIcon_Height   
39{   
40get{return FormIconHeight;}   
41set   
42{   
43if(value&gt;=FormIconHeight)   
44{   
45FormIconHeight=value;   
46this.Invalidate(new Rectangle(8,6,FormIconWidth,value));   
47}   
48else   
49{   
50int temp=FormIconHeight;   
51FormIconHeight=value;   
52this.Invalidate(new Rectangle(8,6,temp,value));   
53}   
54}   
55}   
56//####################################################################   
57#endregion   
58}   
59} 
60
61我把相关的部分,,都用几行来隔开了... 
62
63主要就是,自定义函数部分... 重载事件.部分.....自定义属性部分...... 
64
65希望能对大家有所帮助. 
66
67我的QQ. 23559055</syscmd[8,5]></syscmd[i,3]+21></syscmd[8,5]></syscmd[8,5]></syscmd[i,3]+21></syscmd[8,5]>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus