您的位置:首页 > 其它

【原创】如何实现无标题栏窗体的点击任务栏最小化功能

2011-06-22 16:49 609 查看

问题的解决

有时候实现一些自定义样式的窗体时,我们会将FormBorderStyle设置为None,这时候发现点击任务栏的窗口,窗口不会自己最小化了,其实给窗体重载一个属性可以解决这个问题

///<summary> ///重载该属性实现点击任务栏可以最小化窗体 ///</summary> protectedoverrideCreateParamsCreateParams { get { constintMINIMIZEBOX=0x00020000; CreateParamspara=base.CreateParams; para.Style=para.Style|MINIMIZEBOX; returnpara; } }

实现原理

1、先上一段通过反编译System.Windows.Form.dll里面的代码,这段代码可以在Form类里面找到

protectedoverrideCreateParamsCreateParams { [SecurityPermission(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)] get { CreateParamscreateParams=base.CreateParams; if(base.IsHandleCreated&&((base.WindowStyle&0x8000000)!=0)) { createParams.Style|=0x8000000; } elseif(this.TopLevel) { createParams.Style&=-134217729; } if(this.TopLevel&&(this.formState[FormStateLayered]!=0)) { createParams.ExStyle|=0x80000; } IWin32Windowwindow=(IWin32Window)base.Properties.GetObject(PropDialogOwner); if(window!=null) { createParams.Parent=Control.GetSafeHandle(window); } this.FillInCreateParamsBorderStyles(createParams); this.FillInCreateParamsWindowState(createParams); this.FillInCreateParamsBorderIcons(createParams); if(this.formState[FormStateTaskBar]!=0) { createParams.ExStyle|=0x40000; } FormBorderStyleformBorderStyle=this.FormBorderStyle; if(!this.ShowIcon&&(((formBorderStyle==FormBorderStyle.Sizable)||(formBorderStyle==FormBorderStyle.Fixed3D))||(formBorderStyle==FormBorderStyle.FixedSingle))) { createParams.ExStyle|=1; } if(this.IsMdiChild) { if(base.Visible&&((this.WindowState==FormWindowState.Maximized)||(this.WindowState==FormWindowState.Normal))) { Formform=(Form)base.Properties.GetObject(PropFormMdiParent); FormactiveMdiChildInternal=form.ActiveMdiChildInternal; if((activeMdiChildInternal!=null)&&(activeMdiChildInternal.WindowState==FormWindowState.Maximized)) { createParams.Style|=0x1000000; this.formState[FormStateWindowState]=2; base.SetState(0x10000,true); } } if(this.formState[FormStateMdiChildMax]!=0) { createParams.Style|=0x1000000; } createParams.ExStyle|=0x40; } if(this.TopLevel||this.IsMdiChild) { this.FillInCreateParamsStartPosition(createParams); if((createParams.Style&0x10000000)!=0) { this.formState[FormStateShowWindowOnCreate]=1; createParams.Style&=-268435457; } else { this.formState[FormStateShowWindowOnCreate]=0; } } if(this.IsRestrictedWindow) { createParams.Caption=this.RestrictedWindowText(createParams.Caption); } if((this.RightToLeft==RightToLeft.Yes)&&this.RightToLeftLayout) { createParams.ExStyle|=0x500000; createParams.ExStyle&=-28673; } returncreateParams; } }可以看到,这里面窗体类通过重载这个属性,判断自身一些样式设置,返回一个参数,这个参数描述了窗体本身的很多样式信息。显然如果在自己的窗体中重载这个属性,然后在基类原来实现的基础上,再增加一个允许最小化的属性,应该就能解决这个问题。查手册找到最小化事件的数值为0x00020000,于是就有了刚开始的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航