东方虚空 發表於 2022-6-30 16:43:00

C# Winform程序界面优化实例

<p>  进入移动互联网时代以来,Windows桌面开发已经很久不碰了。之前就是从做Windows开发入行的。</p>
<p>  当年,还是C++ VC6, MFC的时代。那时候开发要查的是MSDN :-)。内存要自己管理, 排查内存泄漏(忘了释放分配的内存)也是基本日常。光阴似箭,岁月如梭~!</p>
<p>  几年之前,北漂时需要写一个windows 的客户端,想招一个c#程序员,专职开发,结果压根就没有人投简历,-_-||,后来只好,亲力亲为。</p>
<p>  个人觉得微软的开发环境,工具其实是非常好用的。好上手,效率高。没落的原因,应该主要是没有赶上移动互联网的发展,windows 程序员的需求可能已经小于,安卓和 ios的程序员了。</p>
<p>  同时,因为环境比较封闭。 windows系统要钱, visual studio 要钱,还不开源。反观java&nbsp; 基本不要钱,还开源……。</p>
<p>  近期又遇到一个需要开发一个windows原生程序的需求,仍然选择用c#开发的。 因为UI上有一定要求, 这里主要就分享下,c# winform窗体的UI美化思路。另外,c# 似乎还有一个叫WPF的库,之前简单用过,感觉比较复杂,这里就还是用winform方式开发,反正UI的要求也没有那么高。</p>
<p>  <strong>美化前<br></strong></p>
<p><strong>  <img src="https://img2022.cnblogs.com/blog/2753310/202206/2753310-20220630154840955-1003077762.png"></strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>  美化后</strong></p>
<p><strong>  <img src="https://img2022.cnblogs.com/blog/2753310/202206/2753310-20220630155815129-1987751528.png"></strong></p>
<p>&nbsp;</p>
<p>  有没有好看一丢丢, 下面分控件,区域说下,美化思路。</p>
<p>&nbsp;</p>
<p>&nbsp;  <strong>按钮</strong></p>
<p>&nbsp;  图中的 4,6,9 ,放大,缩小,包括云台移动控制,以及右上角窗体的 最大,最小化,关闭等,都是<strong>Button</strong>控件。按钮可定制性比较高,可以 设置属性窗口中的 <strong>FlatStyle</strong> 为 <strong>FLat ,</strong>之后展开 <strong>FlatAppearance</strong>&nbsp;,设置对应的边框颜色<strong>BorderColor</strong>即可。 文字颜色即 <strong>ForeColor</strong>。文字字体在属性窗体中也有对应的设置。</p>
<p>&nbsp;</p>
<p>  <strong>列表框</strong></p>
<p>  左侧的摄像头列表,是一个<strong>ListBox</strong>控件。这个控件没有找到可以设置表框颜色的属性。可以配置的只有一个<strong>BorderStyle,</strong>将其设置为<strong>None</strong>,则可以去掉原边框,只留下列表内容。然后我们考虑在<strong>OnPaint</strong>中,给这个列表框手动绘制一个边框。结果ListBox也不支持,OnPaint事件。 最后只好把它放入一个<strong>Panel</strong>中,在<strong>Panel</strong>的<strong>Paint</strong>事件中,通过<strong>GDI+</strong>提供的绘图函数,自行手动绘制一个亮蓝色边框。</p>
<div class="cnblogs_code">
<pre>       <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> splitContainer1_Panel1_Paint(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, PaintEventArgs e)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">画一个边线</span>
             Graphics g =<span style="color: rgba(0, 0, 0, 1)"> e.Graphics;
            g.Clear(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.BackColor);
            Pen pen </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Pen(Color.FromArgb(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">233</span>, <span style="color: rgba(128, 0, 128, 1)">227</span>), <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
            Rectangle rect </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Rectangle(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, splitContainer1.Panel1.ClientSize.Width-<span style="color: rgba(128, 0, 128, 1)">2</span>, splitContainer1.Panel1.ClientSize.Height-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);

            g.DrawRectangle(pen, rect);
            pen.Dispose();
             e.Dispose();
      }</span></pre>
</div>
<p>&nbsp;</p>
<p><strong>  列表框的右键弹出菜单</strong>  </p>
<p>  即图中那个<strong>按时间回放</strong>的弹出菜单,默认是系统风格。可以设置<strong>BackColor</strong>属性,但设置后,鼠标移动到上面选择时,会很难看。 另外前面默认会有一个图标的空白位置。需要额外做下设置。<strong>取消图片空白, 设置选中颜色, 设置边框颜色。</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">..................
                  contextMenuStrip.RenderMode </span>=<span style="color: rgba(0, 0, 0, 1)"> ToolStripRenderMode.Professional;
                  contextMenuStrip.Renderer </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> ToolStripProfessionalRenderer(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyToolStripRenderTable());
                  contextMenuStrip.ShowImageMargin </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
..................</span></pre>
</div>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">internal</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MyToolStripRenderTable: ProfessionalColorTable
    {
   
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> System.Drawing.Color MenuItemSelected
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span> Color.FromArgb(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">233</span>, <span style="color: rgba(128, 0, 128, 1)">227</span><span style="color: rgba(0, 0, 0, 1)">); }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> System.Drawing.Color MenuBorder
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span> Color.FromArgb(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">233</span>, <span style="color: rgba(128, 0, 128, 1)">227</span><span style="color: rgba(0, 0, 0, 1)">); }
      }
    }</span></pre>
</div>
<p>  </p>
<p>  <strong>窗体标题</strong></p>
<p><strong>  </strong>窗体的标题,以及最大,最小,关闭按钮,是系统的统一风格,无法直接定制。 于是只好迂回实现。<strong>思路上就是将窗体设置为无边框窗体,然后自行在窗体上放置按钮,实现 最大,最小及关闭功能</strong>,如此便可以方便的绘制成自己想要的风格。通过将<strong>FormBorderStyle</strong> 设置为 <strong>None ,</strong>隐藏掉系统默认的窗体边框,及关闭等按钮。自行添加3个 <strong>Button</strong>控件,在点击事件中,分别实现,最大,最小,关闭功能。</p>
<p><strong>  注意:将窗体边框隐藏后,除了关闭等按钮需要自行实现外。 窗体拖动(按住标题栏,移动窗体位置)以及窗体的大小调整(拖拉窗体边框,调整窗体大小)也会失效。都需要自行实现。</strong></p>
<p><strong>  拖动处理:</strong>通过处理窗体的鼠标按下以及移动事件,计算X,Y移动距离。对应修改窗体位置 Top及Left 属性即可。</p>
<p><strong>&nbsp; &nbsp; 窗体大小调整:</strong>处理窗体的鼠标移动及按下事件,在进入特定范围时,如边界10像素时,改变鼠标样式,在按住左键拖动时,将窗体宽高,设置为鼠标位置对应X,Y值即可。</p>
<p>&nbsp;</p>
<p><strong>  窗体边框</strong></p>
<p><strong>  </strong>最外部的蓝色边线,本应可以在窗体的<strong>Paint</strong>事件中绘制, 但锅叔遇到了一个问题, 如果下面的方式取得graphics ,拖动时会有边线残留。 不能正常Clear。</p>
<div class="cnblogs_code">
<pre>Graphics g = e.Graphics;</pre>
</div>
<p>  而使用CreateGraphics(),可以正常擦除,但效率会很低。有知道为啥的朋友可以指导下。。。</p>
<p>  研究无果,决定,也同样添加一个跟窗体一样大的<strong>Panel</strong> ,通过Panel的Paint事件绘制边线。这里因为Panel覆盖了整个窗体, 上面说的窗体拖动及缩放处理。<strong>实际处理的是这个Panel的鼠标事件。</strong></p>
<p>&nbsp;</p>
<p><strong>  经过上面的处理,就变得好看一些了。。。o(* ̄︶ ̄*)o。</strong></p>
<p><strong>  最后还是说, 微软的东西用来开发自己windows上的东西,还是挺方便的。<span style="text-decoration: line-through">希望不要倒闭了,</span>。希望微软与它的c#,以及winform与天同寿,万古长青(此处应网友要求修改,20220702 锅叔)-_-||。</strong></p>
<p>&nbsp;  </p>

</div>
<div id="MySignature" role="contentinfo">
    <p style="color:#98430e;text-indent:0;font-weight: bold;">本文来自博客园,作者:锅叔<br>转载请注明原文链接:https://www.cnblogs.com/uncleguo/p/16427193.html</p><br><br>
来源:https://www.cnblogs.com/uncleguo/p/16427193.html
頁: [1]
查看完整版本: C# Winform程序界面优化实例