欢迎光临
我们一直在努力

一个Xp风格的表单类(一)-.NET教程,报表/图形/Office

建站超值云服务器,限时71元/月

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

}

}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 一个Xp风格的表单类(一)-.NET教程,报表/图形/Office
分享到: 更多 (0)

相关推荐

  • 暂无文章