深圳网站设计+建设首选深圳市,wordpress小工具插件,注册营业执照需要什么资料,专业做seo推广蛙蛙推荐#xff1a;winform入门 摘要#xff1a;现在web应用的发展大大快于桌面应用#xff0c;但桌面应用在某些场合确实也有很大的有事#xff0c;其实.net 2.0在windows form方面做了不少的改进#xff0c;大家也许也零零散散的知道一些#xff0c;本文来综合这些技术…蛙蛙推荐winform入门 摘要现在web应用的发展大大快于桌面应用但桌面应用在某些场合确实也有很大的有事其实.net 2.0在windows form方面做了不少的改进大家也许也零零散散的知道一些本文来综合这些技术点来做一个模仿outlook2003的桌面应用程序框架。
outlook的界面早已深入人心当然有些人打死也不用outlook其实outlook在UI和用户体验多方面的好多考虑是有理论根据的比如手风琴式的按钮条会让用打户使用起来很方便三栏式的布局让人的视觉不用左右来回移动全键盘操作等等方面也许大家天天用没在意这些可当初的设计者一定在用户体验上做了好多考虑和取舍的所以我们这些开发者一般要做的就是模仿。限于篇幅本文只讲到一些基础的东西算是一个入门最终我们会模仿一个outlook界面的大概样子如果更深入学习outlook的界面请参考以下链接 Outlook 2003 Look and Feel
http://windowsclient.net/downloads/folders/applications/entry1338.aspx 【窗体设计】 首先窗体的高宽比例要考虑的不是没有讲究的这里用932和561要整体看起来美观其实这个更具体应用有关的不能一概而论。再次就是窗体的Icon要做一个能体现你的应用的一般为了灵活可以在窗体加载事件里从资源文件里读取图标如下: Icon Icon.FromHandle(Resources.Outlook.GetHicon()); 然后就是标题要修改一下就是Text属性。还有就是有时候界面太大或者太小的时候影响窗体内的显示元素这时候可以用MaximumSize和MinimumSize来设置窗体的最大大小和最小大小。还有的时候我们希望窗体没有最大化和最小化的按钮分别应该设置MinimizeBox和maximizeBox属性甚至有时候我们不想让用户能调整窗体的大小我们可以把FormBorderStyle设置为FixedDialog。如果要想让应用程序一打开就全屏应该设置WindowState属性为Maximized。 好多应用程序关闭后能记住上次用户拖动设置的窗体大小下次打开的时候还是上次的窗口大小这些就需要编程来实现了后面会介绍到关于整个窗体设计就说这么多别的属性大家慢慢看MSDN。 【总体布局】 顶部是菜单栏接着是工具按钮条再下面是主工作区最下面是状态栏其中工作区又分为左右两部分。以此往界面上拖动MenuStrip,ToolStripStatusStrip和一个SplitContainer然后适当调整SplitContainer左右面板的大小就可以了然后把FixPanel设置为左边的面板这样窗体大小改动后左边的面板不会改变。默认SplitContainer放上去运行的时候拖动手柄会显示一条虚线我觉得这是一个bug自动获取焦点了要把TabStop属性设置为false就可以了但是你拖动手柄调整大小后虚线不会自动去掉所以我就在它的鼠标释放的时候把焦点转给了菜单就没虚线了这是我的解决方案大家有别的方案可以告诉我。我的如下 private void splitContainer1_MouseUp(object sender, MouseEventArgs e) { menuStrip1.Focus(); } SplitContainer会自动填充剩余的空间并且没有任何边框。但是不要紧.net 2.0的所有windows控件新增了magrin和padding属性用来设置外空白和内填充和CSS差不多我们可以把左右两个面板设置背景色然后padding设置为1最后在左右两个面板里再分别拖进去两个面板Dock设置为fill背景色设置为Control这样就会显示1像素的边框了这种技巧在网页设计里很常见这里也适用。 【菜单】 菜单排放的顺序依次是 文件编辑视图转到工具操作和帮助这些排列虽然没有硬性规定却是约定俗成的你随便排列会给用户带来不便包括子菜单的排列等。然后菜单项的文本里可以设置alt键的热键比如文件的文本可以设置成“文件(F)”这样用户按住alt键盘和f键就会激活文件菜单。然后菜单的左边可以设置一个表达菜单项意义的图片还可以设置一个全局快捷键比如新建联系人用ctrlshiftC来设置shortcutkeys属性。要想让菜单项的左边显示一个对勾的话需要设置CheckState属性。还有就是如果点击菜单项会弹出对话框的话菜单项的文本后面要加一个省略号如果菜单有子菜单项的话右边显示一个小三角后者是自动的。菜单一般要能用纯键盘操作关于键的设计参考如下链接虽然文章比较早但仍有意义。 键盘用户界面设计指南
http://wz.cnblogs.com/detail/1873/ 关于菜单的基础就是这些。 【工具条】 ToolStrip是个功能很强大的控件可以在上面添加按钮下拉按钮分隔按钮标签文本框组合文本框甚至进度条等。工具条里演示了这个强大的控件不过这里只是单纯的用任务提示栏添加各种子控件就可以了有些应用有多个工具栏比如标准工具栏插入工具栏等等而且还能拖动和隐藏。那是吧ToolStrip放到了ToolStripContainer里了本文暂不演示只是提一下本文只演示最基本的布局和用户体验考虑。ToolStrip的表现力非常强可以参考如下链接管中窥豹一番 使用 Windows Forms 2.0 创建智能应用程序布局
http://msdn.microsoft.com/zh-cn/library/aa730847(VS.80).aspx 【状态栏】 状态栏向用户反馈信息的一个重要的工具很少有程序没有状态栏的。winform 2.0的状态栏比以前版本也强大很多但缺少了分隔栏不过没关系我们在上面添加了label后把右边框显示出来就显示出风格条了这应该设置BorderSides属性。然后我们有时候想让状态栏上有三个元素两边的靠在两边中间的自动填充满这时候要把中间的label的Spring属性设置为True。再有就是我们有时候想把ToolStripDrowdownButton右下角的小三角去掉这通常是为了美观可以把ShowDropDownArrow设置为False。当然这些都是很细小的设置但是如果你不知道的话会郁闷半天的。 【手风琴式的功能按钮条】 这个称呼不是我起的好多人都这么叫这个是本文的重点outlook的功能条看起来很炫其实用ToolStrip控件加上一些自绘就可以模仿出来。 首先在主分割面板的左面板里再放置一个SplitContainer把Horizontal设置为Horizontal这样两个面板就成为上下布局了然后把下面的面板设置为FixPanel这是因为我们这里要放按钮条按钮条的高度我们不希望随着窗口的大小而变动。先在这个面板里放一个ToolStrip为了让按钮从上到下一次排列我们把LayoutStyle 的值改为 VerticalStackWithOverflow为了不显示按钮条的是拖动手柄我们把GripStyle 设置为Hidden为了显示office式的漂亮效果我们把RenderMode设置为Professional,还有就是我们把字体设置为宋体加粗和8号关于字体的设置可以讨论的有很多不同情况用不同的字体这里暂不讨论。为了让按钮条不至于太窄我们把ImageScalingSize设置为24×24默认是16*16的有些小然后把TabStop设置为false,margin和padding都设置为0。 接下来就可以往ToolStrip上添加按钮了首先把magrin设置为0padding设置为2这样按钮上的文字不会挨到按钮的边儿了这样好看一些然后设置图像默认设置的透明图像可能会有白变但把ImageTransparentColor设置为238,238,238就没那个白边了其中的道理我也不明白反正直接设置成Transparent白边去不了。然后把DispayStyle设置为ImageAndTextImageAlign设置为MidleLeltTextAlign设置为MiddleRightTextImageRelation设置为Overlay这部可做可不做如果字体已经是粗体就不用单独设置了否则在按钮上单独设置字体加粗整体效果就出来了。 然后默认的ToolStrip的背景和边框不是很好看outlook的按钮条有渐变色这些就需要用到重绘了大致原理是创建一个自定义的控件继承自ToolStrip然后在OnRendererChanged和构造函数里挂接ToolStrip的背景颜色绘制事件和按钮的背景颜色绘制事件然后在事件处理函数里重新绘制它们的边框和背景填充色这里要用到gdi来做2D的渲染不是本文讲的范围大家可以搜索下相关资料。另外可以参考以下链接来了解如何写出专业化的ToolStrip可以根据用户的操作系统样式来改变菜单条的样式。 演练创建具有专业样式的 ToolStrip 控件 http://msdn.microsoft.com/zh-cn/library/ms233664(VS.80).aspx 代码我也简单贴一下吧均出自OLAF,我做了一些精简很容易理解GDI的一些API如果不理解可以根据其名字来猜测一些含义不影响对本文的理解。 public partial class WawaToolStrip : ToolStrip { protected ToolStripProfessionalRenderer _pr; public WawaToolStrip() { // Check Dock Dock DockStyle.Fill; GripStyle ToolStripGripStyle.Hidden; Margin new Padding( 0 ); CanOverflow false ; AutoSize false ; LayoutStyle ToolStripLayoutStyle.VerticalStackWithOverflow; // 垂直排列按钮 SetRenderer(); } private void SetRenderer() { if ((Renderer is ToolStripProfessionalRenderer) (Renderer ! _pr)) { if (_pr null ) { _pr new ToolStripProfessionalRenderer(); _pr.RoundedEdges false ; // 重绘ToolStrip的背景颜色 _pr.RenderToolStripBackground StackStrip_RenderToolStripBackground; OnSetRenderer(_pr); } Renderer _pr; } } private void StackStrip_RenderToolStripBackground( object sender, ToolStripRenderEventArgs e) { if (_pr ! null ) { // Setup colors from the provided renderer Color start _pr.ColorTable.ToolStripGradientMiddle; Color end _pr.ColorTable.ToolStripGradientEnd; // Size to paint Rectangle bounds new Rectangle(Point.Empty, e.ToolStrip.Size); // Make sure we need to do work if ((bounds.Width 0 ) (bounds.Height 0 )) { using (Brush b new LinearGradientBrush(bounds, start, end, LinearGradientMode.Vertical)) { e.Graphics.FillRectangle(b, bounds); } } // Draw border // e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, bounds); e.Graphics.DrawLine(SystemPens.ControlDarkDark, bounds.X, bounds.Y, bounds.Width - 1 , bounds.Y); e.Graphics.DrawLine(SystemPens.ControlDarkDark, bounds.X, bounds.Y, bounds.X, bounds.Height - 1 ); e.Graphics.DrawLine(SystemPens.ControlDarkDark, bounds.X bounds.Width - 1 , bounds.Y, bounds.X bounds.Width - 1 , bounds.Height - 1 ); } } protected virtual void OnSetRenderer(ToolStripProfessionalRenderer pr) { pr.RenderButtonBackground _pr_RenderItemBackground; } private void _pr_RenderItemBackground( object sender, ToolStripItemRenderEventArgs e) { Graphics g e.Graphics; Rectangle bounds new Rectangle(Point.Empty, e.Item.Size); Color gradientBegin Color.White; Color gradientEnd Color.FromArgb( 198 , 194 , 188 ); ToolStripButton button e.Item as ToolStripButton; if (button.Pressed || button.Checked) { gradientBegin _pr.ColorTable.ButtonPressedGradientBegin; gradientEnd _pr.ColorTable.ButtonPressedGradientEnd; } else if (button.Selected) { gradientBegin _pr.ColorTable.ButtonSelectedGradientBegin; gradientEnd _pr.ColorTable.ButtonSelectedGradientEnd; } // Draw Button Background using (Brush b new LinearGradientBrush(bounds, gradientBegin, gradientEnd, LinearGradientMode.Vertical)) { g.FillRectangle(b, bounds); } // Draw Outilne e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, bounds); } protected override void OnRendererChanged(EventArgs e) { base .OnRendererChanged(e); // Work around bug with setting renderer in the constructor SetRenderer(); } } 【关于用户设置的保存】 前面提到有些应用会记住自己上次关闭时的窗口大小其实在winform2.0里做到这个很简单winform2.0里有一个Settings.settings的文件它用来添加一些用户的设置和app.config不同的是他可以应用于用户范围或者整个应用范围而且还可以跟随windows漫游文件来走只要你登录在域里无论使用哪台机器你的个性化配置都会跟着你走。在Setting里加入main_form_width和main_form_height两个int型的配置范围选择user。我们在窗口关闭的时候保存用户配置打开的时候应用配置就可以做到窗口大小自动记忆了代码如下。 private void Form1_Load( object sender, EventArgs e) { if (Settings.Default.main_form_height ! 0 Settings.Default.main_form_width ! 0) { Width Settings.Default.main_form_width; Height Settings.Default.main_form_height; } } private void MainForm_FormClosing( object sender, FormClosingEventArgs e) { Settings.Default.main_form_height Height; Settings.Default.main_form_width Width; Settings.Default.Save(); } 【小节】 本文只是抛砖引玉希望大家能做出更专业用户体验更好的桌面应用来。有了这个入门大家有时间也可以根据自己的需求系统的学习下windows forms编程光做web应用有时候思路就受局限了windows上桌面应用才是王道只要解决了部署的问题web程序相对windows程序也没什么优势了可喜的是.net1.0就支持自动部署了后来又支持click one部署和更新真的不是问题而且界面体验比web强的多还有本地存储等优势能写出很强大很丰富的界面来现在web应用你要用离线存储得安装ms sync framework,google gears等要想用丰富的界面得用exts,yui等要想访问网络得自己解析rest服务返回的数据还得考虑浏览器兼容性等而winform这些东西都是天生具备的大家都围着浏览器flash,severlight的时候其实可以写一个插件式的应用程序浏览器发布的时候只是一个空架子相当于浏览器广大开发者可以根据SDK开发各种应用相当于用HTML写网页然后用应用程序浏览器去浏览各种应用相当于浏览器去浏览网页这得咱们自己去做自己干等着完全支持html5的浏览器发布不知道等到哪辈子了到那时候浏览器能直接画矢量图使用嵌入式Sql有脱机缓存方面的API内置多媒体播放器及富文本编辑器而且有好多开放的接口那时候和winform也差不多了本文也就没用了大家也该忘了winform了。关于HTML5的新特性参考如下链接 揭开HTML 5工作草稿的神秘面纱 http://www.infoq.com/cn/news/2008/02/html5draft 忘了放代码了下载路径如下 http://files.cnblogs.com/onlytiancai/WindowsApplication1.7z 补充 关于winform 2.0的新的功能改进可以参考一下两个链接 构造用户界面 http://msdn.microsoft.com/zh-cn/library/aa730862(VS.80).aspx Ground Rules for Building Enhanced Windows Forms Support into Your .NET App http://msdn.microsoft.com/en-us/magazine/cc163793.aspx 最后宣传下俺的网站
车模,这才叫美女-飞信MM 北京美女 文章转载自: http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.lkbkd.cn.gov.cn.lkbkd.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.yxyyp.cn.gov.cn.yxyyp.cn http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn http://www.morning.wdhzk.cn.gov.cn.wdhzk.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn http://www.morning.txzmy.cn.gov.cn.txzmy.cn http://www.morning.gnwse.com.gov.cn.gnwse.com http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.rahllp.com.gov.cn.rahllp.com http://www.morning.ccdyc.cn.gov.cn.ccdyc.cn http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn http://www.morning.fnrkh.cn.gov.cn.fnrkh.cn http://www.morning.zplzj.cn.gov.cn.zplzj.cn http://www.morning.addai.cn.gov.cn.addai.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.nzklw.cn.gov.cn.nzklw.cn http://www.morning.ylqb8.cn.gov.cn.ylqb8.cn http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.gyfhk.cn.gov.cn.gyfhk.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.sfwcb.cn.gov.cn.sfwcb.cn http://www.morning.mjglk.cn.gov.cn.mjglk.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.dqrpz.cn.gov.cn.dqrpz.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.rqsr.cn.gov.cn.rqsr.cn http://www.morning.kjfsd.cn.gov.cn.kjfsd.cn http://www.morning.ntyanze.com.gov.cn.ntyanze.com http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn http://www.morning.rbbgh.cn.gov.cn.rbbgh.cn http://www.morning.yrnrr.cn.gov.cn.yrnrr.cn http://www.morning.nkjkh.cn.gov.cn.nkjkh.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.china-cj.com.gov.cn.china-cj.com http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn http://www.morning.mhcft.cn.gov.cn.mhcft.cn http://www.morning.gpkjx.cn.gov.cn.gpkjx.cn http://www.morning.rrms.cn.gov.cn.rrms.cn http://www.morning.pcgjj.cn.gov.cn.pcgjj.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.cwknc.cn.gov.cn.cwknc.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.tnjkg.cn.gov.cn.tnjkg.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.spkw.cn.gov.cn.spkw.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.smnxr.cn.gov.cn.smnxr.cn http://www.morning.xpqdf.cn.gov.cn.xpqdf.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn http://www.morning.yrdn.cn.gov.cn.yrdn.cn http://www.morning.wkxsy.cn.gov.cn.wkxsy.cn http://www.morning.lxngn.cn.gov.cn.lxngn.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn http://www.morning.c-ae.cn.gov.cn.c-ae.cn http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.kwqwp.cn.gov.cn.kwqwp.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn