C#仿QQ皮肤----基窗体FormBase与基用户控件FormBase1的实现

C# 实现简易QQ界面 做了一个简易的QQ界面 1 功能:点击 我的好友会出现好友列表      点击 QQ群会出现QQ群列表                 点击   最近联系人 会出现联系人列表                点击   右上方的叉叉 就能关闭了 实现步骤 把窗口的FormBorderStyle设置为none 再把背景图片设置为QQ界面 然后拖一个panel到窗口中 再拖3个 阅读详情

   C#仿QQ皮肤-实现原理系列文章导航
                                                              http://www.cnblogs.com/sufei/archive/2010/03/10/1682847.html                                                  

 

      哎,这两个项目有点紧把文章给荒废了,这周努力一把多出两篇吧!

上次说到 把总体层次的说完了 http://www.cnblogs.com/sufei/archive/2010/03/20/1690624.html  ,接下来就应该细细的说说是怎么实现的了,今天的主要是分析一下基窗体FormBase与基用户控件FormBase1的实现

       前面我说过了这个窗体是为了实现添加修改等弹出窗体而设计的最常用的窗体之一,他在继承过后有一个固定的大小,是为了方便排版,如果所有窗体的大小都 不动的话正好跟主窗体配合是合适的,这个我是设计在程序里的,给不会排版的朋友以方便,当然您也是可以自己修改的,也就是说不管你怎么处理,只要是用我的控件就算是不做任何处理,也不是很难看,呵呵。

       因为我的每个窗体和控件可能都 会多多少少的用到不少Windows的API,特别是Windows消息这一块的,我把常用的放到了一下类里共享给大家吧,不过没有过多的注释,因为这些在网上都 有大家只要Google一下就OK了,哎,听说Google走了,那就Bing吧,呵呵

   类文件

代码
using  System;
using  System.Collections.Generic;

using  System.Text;
using  System.Runtime.InteropServices;
using  System.Drawing;
using  System.Globalization;

namespace  CRD.Common
{
    
public   static   class  Win32
    {
        
public   const   int  MF_REMOVE  =   0x1000 ;

        
public   const   int  SC_RESTORE  =   0xF120 ;  // 还原
         public   const   int  SC_MOVE  =   0xF010 ;  // 移动
         public   const   int  SC_SIZE  =   0xF000 ;  // 大小
         public   const   int  SC_MINIMIZE  =   0xF020 ;  // 最小化
         public   const   int  SC_MAXIMIZE  =   0xF030 ;  // 最大化
         public   const   int  SC_CLOSE  =   0xF060 ;  // 关闭 

        
public   const   int  WM_SYSCOMMAND  =   0x0112 ;
        
public   const   int  WM_COMMAND  =   0x0111 ;

        
public   const   int  GW_HWNDFIRST  =   0 ;
        
public   const   int  GW_HWNDLAST  =   1 ;
        
public   const   int  GW_HWNDNEXT  =   2 ;
        
public   const   int  GW_HWNDPREV  =   3 ;
        
public   const   int  GW_OWNER  =   4 ;
        
public   const   int  GW_CHILD  =   5 ;

        
public   const   int  WM_NCCALCSIZE  =   0x83 ;
        
public   const   int  WM_WINDOWPOSCHANGING  =   0x46 ;
        
public   const   int  WM_PAINT  =   0xF ;
        
public   const   int  WM_CREATE  =   0x1 ;
        
public   const   int  WM_NCCREATE  =   0x81 ;
        
public   const   int  WM_NCPAINT  =   0x85 ;
        
public   const   int  WM_PRINT  =   0x317 ;
        
public   const   int  WM_DESTROY  =   0x2 ;
        
public   const   int  WM_SHOWWINDOW  =   0x18 ;
        
public   const   int  WM_SHARED_MENU  =   0x1E2 ;
        
public   const   int  HC_ACTION  =   0 ;
        
public   const   int  WH_CALLWNDPROC  =   4 ;
        
public   const   int  GWL_WNDPROC  =   - 4 ;

        
public   const   int  WS_SYSMENU  =   0x80000 ;
        
public   const   int  WS_SIZEBOX  =   0x40000 ;

        
public   const   int  WS_MAXIMIZEBOX  =   0x10000 ;

        
public   const   int  WS_MINIMIZEBOX  =   0x20000 ;

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  SetWindowLong(IntPtr hWnd,  int  Index,  int  Value);

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  GetWindowLong(IntPtr hWnd,  int  Index);

        [DllImport(
" user32 " )]
        
public   static   extern  IntPtr GetSystemMenu(IntPtr hwnd,  int  flag);

        [DllImport(
" user32 " )]
        
public   static   extern   int  TrackPopupMenu( int  hMenu,  int  wFlags,  int  x,  int  y,  int  nReserved, IntPtr hwnd,  int  lprc);

        [DllImport(
" user32 " )]
        
public   static   extern   int  SendMessage(IntPtr hwnd,  int  msg,  int  wp,  int  lp);

        [DllImport(
" user32 " )]
        
public   static   extern   int  ReleaseCapture();

        [DllImport(
" gdi32.dll " )]
        
public   static   extern   int  CreateRoundRectRgn( int  x1,  int  y1,  int  x2,  int  y2,  int  x3,  int  y3);

        [DllImport(
" user32.dll " )]
        
public   static   extern   int  SetWindowRgn(IntPtr hwnd,  int  hRgn, Boolean bRedraw);

        
public   const   int  CS_DROPSHADOW  =   0x20000 ;

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  SetClassLong(IntPtr hwnd,  int  nIndex,  int  dwNewLong);
        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  GetClassLong(IntPtr hwnd,  int  nIndex);

        
public   struct  MENUINFO
        {
            
public   int  cbSize;
            
public   uint  fMask;
            
public   int  dwStyle;
            
public   int  cyMax;
            
public   int  hbrBack;
            
public   int  dwContextHelpID;
            
public   int  dwMenuData;
        }

        [DllImport(
" gdi32 " )]
        
public   static   extern   int  CreatePatternBrush( int  hBitmap);

        [DllImport(
" user32 " )]
        
public   static   extern   int  SetMenuInfo(IntPtr hMenu,  ref  MENUINFO mi);

        [DllImport(
" user32.dll " , EntryPoint  =   " ShowWindow " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  ShowWindow(IntPtr hwnd,  int  nCmdShow);

        [DllImport(
" kernel32.dll " )]
        
public   static   extern   bool  SetProcessWorkingSetSize(IntPtr process,  int  minSize,  int  maxSize);

        
public   const   int  GCW_ATOM  =   - 32 ;
        
public   const   int  GCL_CBCLSEXTRA  =   - 20 ;
        
public   const   int  GCL_CBWNDEXTRA  =   - 18 ;
        
public   const   int  GCL_HBRBACKGROUND  =   - 10 ;
        
public   const   int  GCL_HCURSOR  =   - 12 ;
        
public   const   int  GCL_HICON  =   - 14 ;
        
public   const   int  GCL_HMODULE  =   - 16 ;
        
public   const   int  GCL_MENUNAME  =   - 8 ;
        
public   const   int  GCL_STYLE  =   - 26 ;
        
public   const   int  GCL_WNDPROC  =   - 24 ;

        [DllImport(
" user32 " , EntryPoint  =   " GetClassLong " )]
        
public   static   extern   int  GetClassLong( int  hwnd,  int  nIndex);

        [DllImport(
" user32 " , EntryPoint  =   " SetClassLong " )]
        
public   static   extern   int  SetClassLong( int  hwnd,  int  nIndex,  int  dwNewLong);

        
public   const   int  WM_SETREDRAW  =   0x000B ;
        
public   const   int  WM_USER  =   0x400 ;
        
public   const   int  EM_GETEVENTMASK  =  (WM_USER  +   59 );
        
public   const   int  EM_SETEVENTMASK  =  (WM_USER  +   69 );

        [DllImport(
" user32.dll " )]
        
public   extern   static   bool  LockWindowUpdate(IntPtr hWndLock);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern  IntPtr GetWindowDC(IntPtr handle);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern  IntPtr ReleaseDC(IntPtr handle, IntPtr hDC);

        [DllImport(
" Gdi32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern  IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  GetClassName(IntPtr hwnd,  char [] className,  int  maxCount);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern  IntPtr GetWindow(IntPtr hwnd,  int  uCmd);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  IsWindowVisible(IntPtr hwnd);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  GetClientRect(IntPtr hwnd,  ref  RECT lpRect);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   int  GetClientRect(IntPtr hwnd, [In, Out]  ref  Rectangle rect);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  MoveWindow(IntPtr hwnd,  int  X,  int  Y,  int  nWidth,  int  nHeight,  bool  bRepaint);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  UpdateWindow(IntPtr hwnd);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  InvalidateRect(IntPtr hwnd,  ref  Rectangle rect,  bool  bErase);

        [DllImport(
" user32 " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  ValidateRect(IntPtr hwnd,  ref  Rectangle rect);

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto)]
        
public   static   extern   bool  GetWindowRect(IntPtr hWnd, [In, Out]  ref  Rectangle rect);

        [StructLayout(LayoutKind.Sequential)]
        
public   struct  RECT
        {
            
public   int  Left;
            
public   int  Top;
            
public   int  Right;
            
public   int  Bottom;
        }

        [StructLayout(LayoutKind.Sequential)]
        
public   struct  WINDOWPOS
        {
            
public  IntPtr hwnd;
            
public  IntPtr hwndAfter;
            
public   int  x;
            
public   int  y;
            
public   int  cx;
            
public   int  cy;
            
public   uint  flags;
        }

        [StructLayout(LayoutKind.Sequential)]
        
public   struct  NCCALCSIZE_PARAMS
        {
            
public  RECT rgc;
            
public  WINDOWPOS wndpos;
        }

        [StructLayout(LayoutKind.Sequential)]
        
public   struct  tagSCROLLINFO
        {
            
public   uint  cbSize;
            
public   uint  fMask;
            
public   int  nMin;
            
public   int  nMax;
            
public   uint  nPage;
            
public   int  nPos;
            
public   int  nTrackPos;
        }
        
public   enum  fnBar
        {
            SB_HORZ 
=   0 ,
            SB_VERT 
=   1 ,
            SB_CTL 
=   2
        }
        
public   enum  fMask
        {
            SIF_ALL,
            SIF_DISABLENOSCROLL 
=   0X0010 ,
            SIF_PAGE 
=   0X0002 ,
            SIF_POS 
=   0X0004 ,
            SIF_RANGE 
=   0X0001 ,
            SIF_TRACKPOS 
=   0X0008
        }

        
public   static   int  MakeLong( short  lowPart,  short  highPart)
        {
            
return  ( int )((( ushort )lowPart)  |  ( uint )(highPart  <<   16 ));
        }
        
public   const   int  SB_THUMBTRACK  =   5 ;
        
public   const   int  WM_HSCROLL  =   0x114 ;
        
public   const   int  WM_VSCROLL  =   0x115 ;
        [DllImport(
" user32.dll " , EntryPoint  =   " GetScrollInfo " )]
        
public   static   extern   bool  GetScrollInfo(IntPtr hwnd,  int  fnBar,  ref  SCROLLINFO lpsi);
        [DllImport(
" user32.dll " , EntryPoint  =   " SetScrollInfo " )]
        
public   static   extern   int  SetScrollInfo(IntPtr hwnd,  int  fnBar, [In]  ref  SCROLLINFO lpsi,  bool  fRedraw);

        [DllImport(
" User32.dll " , CharSet  =  CharSet.Auto, EntryPoint  =   " SendMessage " )]
        
static   extern  IntPtr SendMessage(IntPtr hWnd,  uint  Msg, IntPtr wParam, IntPtr lParam);
        [DllImport(
" user32.dll " , SetLastError  =   true )]
        
public   static   extern   bool  PostMessage(IntPtr hWnd,  uint  Msg,  long  wParam,  int  lParam);

        
public   struct  SCROLLINFO
        {
            
public   uint  cbSize;
            
public   uint  fMask;
            
public   int  nMin;
            
public   int  nMax;
            
public   uint  nPage;
            
public   int  nPos;
            
public   int  nTrackPos;
        }

        
public   enum  ScrollInfoMask
        {
            SIF_RANGE 
=   0x1 ,
            SIF_PAGE 
=   0x2 ,
            SIF_POS 
=   0x4 ,
            SIF_DISABLENOSCROLL 
=   0x8 ,
            SIF_TRACKPOS 
=   0x10 ,
            SIF_ALL 
=  SIF_RANGE  +  SIF_PAGE  +  SIF_POS  +  SIF_TRACKPOS
        }

        
public   enum  ScrollBarDirection
        {
            SB_HORZ 
=   0 ,
            SB_VERT 
=   1 ,
            SB_CTL 
=   2 ,
            SB_BOTH 
=   3
        }

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto, ExactSpelling  =   true )]
        
public   static   extern   bool  GetClientRect(HandleRef hWnd, [In, Out]  ref  RECT rect);


        [StructLayout(LayoutKind.Sequential)]
        
public   class  SYSTEMTIME
        {
            
public   short  wYear;
            
public   short  wMonth;
            
public   short  wDayOfWeek;
            
public   short  wDay;
            
public   short  wHour;
            
public   short  wMinute;
            
public   short  wSecond;
            
public   short  wMilliseconds;
            
public   override   string  ToString()
            {
                
return  ( " [SYSTEMTIME:  "   +   this .wDay.ToString(CultureInfo.InvariantCulture)  +   " / "   +   this .wMonth.ToString(CultureInfo.InvariantCulture)  +   " / "   +   this .wYear.ToString(CultureInfo.InvariantCulture)  +   "   "   +   this .wHour.ToString(CultureInfo.InvariantCulture)  +   " : "   +   this .wMinute.ToString(CultureInfo.InvariantCulture)  +   " : "   +   this .wSecond.ToString(CultureInfo.InvariantCulture)  +   " ] " );
            }
        }

        [StructLayout(LayoutKind.Sequential, CharSet 
=  CharSet.Auto)]
        
public   class  SYSTEMTIMEARRAY
        {
            
public   short  wYear1;
            
public   short  wMonth1;
            
public   short  wDayOfWeek1;
            
public   short  wDay1;
            
public   short  wHour1;
            
public   short  wMinute1;
            
public   short  wSecond1;
            
public   short  wMilliseconds1;
            
public   short  wYear2;
            
public   short  wMonth2;
            
public   short  wDayOfWeek2;
            
public   short  wDay2;
            
public   short  wHour2;
            
public   short  wMinute2;
            
public   short  wSecond2;
            
public   short  wMilliseconds2;
        }
    }
}

 

  这个类的使用方法其实很简单,大家看下下面的代码就明白了

 

 Win32.SetWindowLong( this .Handle,  - 16 , Win32.WS_SYSMENU  +  Win32.WS_SIZEBOX  +  Win32.WS_MAXIMIZEBOX  +  Win32.WS_MINIMIZEBOX);

 

  其实说白了就是一个实体类,呵呵Win32.WS_SYSMENU 这样就行了。

       下面开始一步一步的来实现吧

 第一步.先建一个名称为FormBase的窗体,这个过程相信没有人不会吧,我就不写了;

 第二步.把窗体变为无边框并且设置其大小为580, 364,我把要修改的属性一一的罗列一下吧!!!

就只有这几个属性需要修改一下,别的都 是默认的就行了;

     第三步.我们来处理一下我们要定义这样几个变量,是处理加载窗体是默认皮肤的

 

代码
  // 默认的肤色 这是一个枚举
         private  SkinColor _currentSkinColor  =  SkinColor.Default;

        
// 设置窗体无边框
         private  FormBorderStyle _formBorderStyle  =  FormBorderStyle.None;

        
// 得到一个值表示 是否重绘
         private   bool  _isRedrawSuspended;

        
// 当前应用的皮肤
         public  SkinColor CurrentSkinColor
        {
            
get  {  return  _currentSkinColor; }
            
set  { _currentSkinColor  =  value; }
        }

 

 

    第一行是取得系统默认的皮肤;

    第二行是设置窗体无边框的这个咱们已经用属性设置过了, 我是不放心才写了一下,呵呵大家可以只写代码的;

    第三行是定义一个变量指示是否要重绘;

    第四行的是定义当前皮肤属性,方便取和设置;

第四步,FormBorderStyle和FormBorderStyle这个两属性我们需要定义一下

    因为我们的窗体是无边框的所以FormBorderStyle这个属性我们也不希望能被使用都随时改变,可能为影响美难,所以我在这里禁止使用,也 就是说不让它出现在

属性窗体中,这个是怎么设置的呢,其实Ms做的很文件,只要一行代码就可以了

   

代码
// 指定方法或是属性是否可以在编辑器中查看Never始终不能,Always始终是可以的,Advanced只有高级用户才能查看
        [EditorBrowsable(EditorBrowsableState.Never)]
        
public   new  FormBorderStyle FormBorderStyle
        {
            
get  {  return   base .FormBorderStyle; }
            
set  {  base .FormBorderStyle  =  value; }
        }

 

   有了这几行代码我们不管怎么样改变窗体他都会是无标题的了,那我们怎么设置样式呢,别急看下面的代码

 

代码

 

有个这个属性我们不就能设置了吗?

好现在窗体的样式 基本上实现了

还有两个地方也要改一下不过是常用的大家看下代码吧

,重写OnLoad事件和OnResize事件

代码
  // 得到一个值表示 是否重绘
         public   bool  IsRedrawSuspended
        {
            
get  {  return  _isRedrawSuspended; }
        }

        
// 构造函数
         public  FormBase()
        {
            
this .SetStyle(ControlStyles.DoubleBuffer  |  ControlStyles.AllPaintingInWmPaint,  true );
            InitializeComponent();
        }

 

第五步

   为什么要重写呢,OnResize事件重写的目的是留出边框的大小,而OnLoad的重写是为了应用皮肤我处理一下消息

我都 写在了代码里下面是这个事件的代码

代码
// 重写的OnLoad事件
         protected   override   void  OnLoad(EventArgs e)
        {

            Win32.SetWindowLong(
this .Handle,  - 16 , Win32.WS_SYSMENU  +  Win32.WS_SIZEBOX  +  Win32.WS_MAXIMIZEBOX  +  Win32.WS_MINIMIZEBOX);

            
int  Rgn  =  Win32.CreateRoundRectRgn( 3 ,  3 ,  this .Width  -   2 ,  this .Height  -   2 ,  7 ,  7 );
            Win32.SetWindowRgn(
this .Handle, Rgn,  true );

            
this .PerformReSetFormBitmap();
            
base .OnLoad(e);

            
if  ( this != Shared.MainForm  &&   this .CurrentSkinColor  !=  Shared.CurrentSkinColor)
            {
                Shared.ChangeSkinColor(Shared.CurrentSkinColor, 
this ,  true );
            }
        }

        
// 重写的OnResize事件
         protected   override   void  OnResize(EventArgs e)
        {
            
base .OnResize(e);

            
int  Rgn  =  Win32.CreateRoundRectRgn( 3 ,  3 ,  this .Width  -   2 ,  this .Height  -   2 ,  7 ,  7 );
            Win32.SetWindowRgn(
this .Handle, Rgn,  true );

        }

 

第六步,设置窗体的图片

方法很简单,直接 看代码应该理我容易理解

代码
  // 设置用户控件的图片
         public   void  PerformReSetFormBitmap()
        {
            
try
            {
                
this .SuspendRedraw();

                ReSetFormBitmap();
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

        
public   virtual   void  ReSetFormBitmap()
        {

        }

 

第七步,设置窗体背景

跟上面的实现 方法是一样的

代码
  // 设置用户控件背景
         public   void  PerformChangeBackgroundStripe(BackgroundStripe backgroundStripe)
        {
            
try
            {
                ChangeBackgroundStripe(backgroundStripe);
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

        
public   virtual   void  ChangeBackgroundStripe(BackgroundStripe backgroundStripe)
        {
            
this .CurrentSkinColor  =  Shared.CurrentSkinColor;
        }

 

第七八步,设置的默认皮肤

跟上面的实现 方法是一样的,这三个实现方法是一样的,在这里不在多解释了

代码
  #region   // 设置皮肤色ChangeSkinColor


        
public   void  PerformChangeSkinColor()
        {
            PerformChangeSkinColor(SkinColor.Undefault);
        }

        
// 设置皮肤色
         public   void  PerformChangeSkinColor(SkinColor skinColor)
        {
            
try
            {
                
this .SuspendRedraw();

                ChangeSkinColor(skinColor);
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

 

 

最后一步,就是当修改皮肤是我们要做什么了

  其实也不是很难的,只要调用一些方法就可以,大家如果 想知道 每个方法的意思 的话,可以自己转到定义去看, 当然在说到皮肤控件是我会一一说明 的

实现 代码

代码

 

这个实体基本上就是这样实现 的,FormBase跟窗体的实现 是一样的,只是在新建的时候创建的是用户控件,实现 的方法没有二样,

      有了这个窗体就为了们实现FunctionFormBase这个窗体打下了基础,下一次的文章我会接着说FunctionFormBase这个窗体的实现 也就是常用的添加,删除的小窗体,先看看效果吧!!!

 

 

效果就是这样的,

下面是这个窗体实现的所有代码

 

代码
using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;

using  System.Text;
using  System.Windows.Forms;
using  System.IO;
using  CRD.Common;

namespace  CRD.WinUI.Forms
{
    
///   <summary>
    
///  常用的窗体之一,用于添加修改等弹出窗体
    
///   </summary>
     public   partial   class  FormBase : Form
    {
        
// 默认的肤色 这是一个枚举
         private  SkinColor _currentSkinColor  =  SkinColor.Default;

        
// 设置窗体无边框
         private  FormBorderStyle _formBorderStyle  =  FormBorderStyle.None;

        
// 得到一个值表示 是否重绘
         private   bool  _isRedrawSuspended;

        
// 当前应用的皮肤
         public  SkinColor CurrentSkinColor
        {
            
get  {  return  _currentSkinColor; }
            
set  { _currentSkinColor  =  value; }
        }

        
// 指定方法或是属性是否可以在编辑器中查看Never始终不能,Always始终是可以的,Advanced只有高级用户才能查看
        [EditorBrowsable(EditorBrowsableState.Never)]
        
public   new  FormBorderStyle FormBorderStyle
        {
            
get  {  return   base .FormBorderStyle; }
            
set  {  base .FormBorderStyle  =  value; }
        }

        
// 指定事件或是属性是否显示在属性窗口中
        
// [Browsable(false)]
        
// 指定事件或是属性是否显示在属性窗口中
        [Browsable( true )]
        
public  FormBorderStyle FormStyle
        {
            
get  {  return  _formBorderStyle; }
            
set  { _formBorderStyle  =  value; }
        }

        
// 得到一个值表示 是否重绘
         public   bool  IsRedrawSuspended
        {
            
get  {  return  _isRedrawSuspended; }
        }

        
// 构造函数
         public  FormBase()
        {
            
this .SetStyle(ControlStyles.DoubleBuffer  |  ControlStyles.AllPaintingInWmPaint,  true );
            InitializeComponent();
        }

        
// 重写的OnLoad事件
         protected   override   void  OnLoad(EventArgs e)
        {

            Win32.SetWindowLong(
this .Handle,  - 16 , Win32.WS_SYSMENU  +  Win32.WS_SIZEBOX  +  Win32.WS_MAXIMIZEBOX  +  Win32.WS_MINIMIZEBOX);

            
int  Rgn  =  Win32.CreateRoundRectRgn( 3 ,  3 ,  this .Width  -   2 ,  this .Height  -   2 ,  7 ,  7 );
            Win32.SetWindowRgn(
this .Handle, Rgn,  true );

            
this .PerformReSetFormBitmap();
            
base .OnLoad(e);

            
if  ( this != Shared.MainForm  &&   this .CurrentSkinColor  !=  Shared.CurrentSkinColor)
            {
                Shared.ChangeSkinColor(Shared.CurrentSkinColor, 
this ,  true );
            }
        }

        
// 重写的OnResize事件
         protected   override   void  OnResize(EventArgs e)
        {
            
base .OnResize(e);

            
int  Rgn  =  Win32.CreateRoundRectRgn( 3 ,  3 ,  this .Width  -   2 ,  this .Height  -   2 ,  7 ,  7 );
            Win32.SetWindowRgn(
this .Handle, Rgn,  true );

        }

        
#region    // 设置用户控件的图片ReSetFormBitmap

        
// 设置用户控件的图片
         public   void  PerformReSetFormBitmap()
        {
            
try
            {
                
this .SuspendRedraw();

                ReSetFormBitmap();
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

        
public   virtual   void  ReSetFormBitmap()
        {

        }

        
#endregion

        
#region    // 设置用户控件背景ChangeBackgroundStripe

        
// 设置用户控件背景
         public   void  PerformChangeBackgroundStripe(BackgroundStripe backgroundStripe)
        {
            
try
            {
                ChangeBackgroundStripe(backgroundStripe);
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

        
public   virtual   void  ChangeBackgroundStripe(BackgroundStripe backgroundStripe)
        {
            
this .CurrentSkinColor  =  Shared.CurrentSkinColor;
        }

        
#endregion

        
#region   // 设置皮肤色ChangeSkinColor


        
public   void  PerformChangeSkinColor()
        {
            PerformChangeSkinColor(SkinColor.Undefault);
        }

        
// 设置皮肤色
         public   void  PerformChangeSkinColor(SkinColor skinColor)
        {
            
try
            {
                
this .SuspendRedraw();

                ChangeSkinColor(skinColor);
            }
            
catch
            {
                
throw ;
            }
            
finally
            {
                
this .ResumeRedraw();
            }
        }

        
// 修改皮肤色时
         public   virtual   void  ChangeSkinColor(SkinColor skinColor)
        {
            
if  ( this .CurrentSkinColor  !=  skinColor)
            {
                
this .ReSetFormBitmap();
                
if  (skinColor  !=  SkinColor.Undefault)
                {
                    Shared.ChangeSkinColor(skinColor, 
this );
                }
            }
            
else
            {
                
this .ReSetFormBitmap();
                Shared.ChangeControlsSkinColor(
this );
            }
            
this .CurrentSkinColor  =  Shared.CurrentSkinColor;
        }

        
#endregion

        
#region  Suspend / Resume Controls Painting
        
public   void  SuspendRedraw()
        {
            _isRedrawSuspended 
=   true ;
            SuspendRedraw(
this );
        }

        
public   void  SuspendRedraw(Control control)
        {
            
if  (DesignMode)  return ;
        }

        
public   void  ResumeRedraw()
        {
            _isRedrawSuspended 
=   false ;

            ResumeRedraw(
this );
        }

        
public   void  ResumeRedraw(Control control)
        {
            
if  (DesignMode)  return ;
        }

        
public   void  LockWindowUpdate( bool  lockUpdate)
        {
            Shared.LockWindowUpdate(
this , lockUpdate);
        }
        
#endregion

    }
}

 

 

                         

                              如有转载请注明出处谢谢合作!!!

签名:做一番一生引以为豪的事业;找一个一生荣辱与共的妻子;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;

Windows如何使用Anaconda 3进行keras环境的配置 ** Windows如何使用Anaconda 3进行keras环境的配置 搭建Keras环境* Anaconda3如何安装keras,主要包括下面三步: 1.安装mingw libpython 2.安装theano 3.安装keras 若你还没有按装anaconda,赶紧下载安装吧! 下载途径有两个 (1)Anaconda版本为Anaconda 4.4.0,对应的python版本为3.6,附上An... 阅读详情

相关推荐

逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)

本文详细介绍了如何利用Python和Chrome开发者工具逆向破解药监局网站的动态数据加载机制。通过分析Ajax请求、解析JSON响应数据以及处理动态参数,帮助开发者高效采集动态加载内容,适用于爬虫开发与数据分析场景。

weixin_30832143的博客 67

C#仿QQ皮肤-皮肤控件窗体SkinForm的实现

    原文:http://www.sufeinet.com/thread-1950-1-1.html 可以下载源码 导读部分 ------------------------------------------------------------------------------------------------------------- C#仿QQ皮肤-实现原理系列文章导航 最新版源...

weixin_33919950的博客 208

状态转移矩阵在离散控制系统中的应用与实现步骤详解

本文深入解析了状态转移矩阵在离散控制系统中的核心作用与实现步骤。通过一个具体实例,详细演示了如何将连续状态空间模型精确离散化,计算出离散系统矩阵A_d和B_d,并分享了采样周期选择、数值计算技巧及嵌入式C语言实现等关键工程经验,为开发高性能数字控制器提供实用指南。

weixin_28454475的博客 378

C#仿QQ皮肤-基窗体FunctionFormBase的实现

                                                     阅读全文:http://www.cckan.net/forum.php?mod=viewthread&amp;tid=363        导读部分-----------------------------------------------------------------------...

weixin_33755557的博客 149

【电磁场计算】磁偶极子在外磁场中的受力

最近在总结电磁场计算公式的时候发现,关于磁偶极子受力的计算公式,在不同文献中的说明有点出入,在此特地写一篇博客澄清一下。

sky4403的博客 7463

差分信号_差分信号的原理及其在PCB的设计

差分线是 PCB 设计中非常重要的一部分信号线,信号处理要求也是相当严谨,今天为大家介绍下差分信号的原理以及其在 PCB 设计中的处理方法。 什么是差分信号 差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相等,相位相差 180 度,极性相反。在这两根线上传输的信号就是差分...

weixin_31849185的博客 1809

C# QQ管理系统——窗体版

功能要求 实现增删查功能 制作步骤介绍 创建主页面 创建查询页面 实现搜索功能 搜索功能进阶(判断非空) 实现右键菜单删除功能 新增功能页面 制作过程 一.主页面 详细步骤 将各类控件放入窗口,并修改摆放 双击 “确定” 按钮 在 “确定” 按钮内获取当前选择的按钮,并弹出对应的窗口 代码展示 private void button1_Click(object sender, EventArgs e) { if (rb_delete.Checked

YuStart的博客 655

Ubuntu20.04复现instant-ngp,自建数据集,导出mesh

本次仅仅记录一下自己复现instant-ngp的过程,如果里面的参考有冒犯到原博主请联系我删除,本人也是nerf的小白一枚,可以一起交流学习神经辐射场,希望大家在复现instant-ngp的时候少走一些坑,情况允许下可以去复现一下npg-pl和nerfStudio,最后希望大家一起进步。看到一些博主说葵司的npg_pl也不错,而且葵司是台湾人,在youtube上也有讲解的视频。渲染的效果还是可以的,相对于源码来说还是有点模糊,我一些参数也没有设置,直接就拉进来进行渲染,速度是非常快的。

weixin_59961223的博客 9451

C#仿QQ皮肤-常用用户控件EnterFrom1和窗体EntryForm的实现

  导读部分 ------------------------------------------------------------------------------------------------------------- C#仿QQ皮肤-实现原理系列文章导航 最新版源码下载 http://www.cckan.net/thread-2-1-1.html  ...

weixin_30445169的博客 101

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 534

ENVI水体提取流程实践与问题

ENVI水体提取流程实践与问题 卫片解译中,水体属于比较好判别的一类。有水体指数、阈值法、监督分类等一系列方法进行提取,今天介绍利用水体指数和ENVI提取水体的过程。 1.所用数据 Landsat8卫片1景、ENVI5.3。 2.辐射定标与水陆分离 由于要对卫片进行水体指数的计算,因此需要对数据进行辐射定标以及大气校正的预处理。 辐射定标就是将图像的数字量化值(DN)转化为辐射亮度值或者反射率或者表面温度等物理量的处理过程。在工具栏中搜索Radiometric Correction,点开进行辐射定标。

Soul_taker的博客 4万+

C#仿QQ皮肤-总体层次说明(一)

                                                                           C#仿QQ皮肤-实现原理系列文章导航                                                               http://www.cnblogs.com/sufei/archive/2010/03

sufeinet 1188

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网

写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页...

信息安全领域优质创作者|操作系统领域专家 1805

C#仿QQ皮肤-总体层次说明(二)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34122810的博客 71

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# 高仿腾讯QQ (窗口皮肤美化)(附测试源码)

  首写这篇文章之前先跟大家说声抱歉,我很少写这方面的文章,所以一直不敢动手,之前的文章确实不带源的,因为当时只是想做为自己初次开发的记录过程,打算程序开发完后再来贴源的。不过从现在开始,我觉定还是把自己每次写的控件实例写出来,和大家一起探讨研究,这样也可增加自己学习经验。   在这里先跟大家说一下,由于我也是菜鸟型人物,C#、Winform完全是因为兴趣爱好而自学的,所以很不专业,里面的一些说...

weixin_30367169的博客 641

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

FormBase设置

Bestway.Windows.Forms.FormBase 1、样式一              2、样式二

快乐人生 1263

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Form_base单点登录方法

登录系统的地址为http://tivoli04/WebConnect5.5/portal/windows/index.asp)1、 写一个fsso的文件,在安装路径底下有一个template:fsso.conf.t...

cuiliqian8980的博客 538

界面控件DevExpress WinForms的数据网格组件——更轻松地管理业务数据(二)

本文将介绍DevExpress WinForms控件中的DataGrid(数据网格组件),该组件附带数十个高影响力的功能,欢迎下载最新版体验~

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 591
上一篇: C#仿QQ皮肤----基窗体FormBase与基用户控件FormBase1的实现
下一篇: C#仿QQ皮肤----基窗体FormBase与基用户控件FormBase1的实现
csdsuper
博客等级 码龄22年 35粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值