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

博客园原文章 C#仿QQ皮肤----基窗体FormBase与基用户控件FormBase1的实现

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吧,呵呵

类文件

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> 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(IntPtrhWnd, int Index, int Value);

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

[DllImport(
" user32 " )]
public static extern IntPtrGetSystemMenu(IntPtrhwnd, int flag);

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

[DllImport(
" user32 " )]
public static extern int SendMessage(IntPtrhwnd, 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(IntPtrhwnd, int hRgn,BooleanbRedraw);

public const int CS_DROPSHADOW = 0x20000 ;

[DllImport(
" user32.dll " ,CharSet = CharSet.Auto)]
public static extern int SetClassLong(IntPtrhwnd, int nIndex, int dwNewLong);
[DllImport(
" user32.dll " ,CharSet = CharSet.Auto)]
public static extern int GetClassLong(IntPtrhwnd, 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(IntPtrhMenu, ref MENUINFOmi);

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

[DllImport(
" kernel32.dll " )]
public static extern bool SetProcessWorkingSetSize(IntPtrprocess, 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(IntPtrhWndLock);

[DllImport(
" User32.dll " ,CharSet = CharSet.Auto)]
public static extern IntPtrGetWindowDC(IntPtrhandle);

[DllImport(
" User32.dll " ,CharSet = CharSet.Auto)]
public static extern IntPtrReleaseDC(IntPtrhandle,IntPtrhDC);

[DllImport(
" Gdi32.dll " ,CharSet = CharSet.Auto)]
public static extern IntPtrCreateCompatibleDC(IntPtrhdc);

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

[DllImport(
" User32.dll " ,CharSet = CharSet.Auto)]
public static extern IntPtrGetWindow(IntPtrhwnd, int uCmd);

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

[DllImport(
" user32 " ,CharSet = CharSet.Auto)]
public static extern int GetClientRect(IntPtrhwnd, ref RECTlpRect);

[DllImport(
" user32 " ,CharSet = CharSet.Auto)]
public static extern int GetClientRect(IntPtrhwnd,[In,Out] ref Rectanglerect);

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

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

[DllImport(
" user32 " ,CharSet = CharSet.Auto)]
public static extern bool InvalidateRect(IntPtrhwnd, ref Rectanglerect, bool bErase);

[DllImport(
" user32 " ,CharSet = CharSet.Auto)]
public static extern bool ValidateRect(IntPtrhwnd, ref Rectanglerect);

[DllImport(
" user32.dll " ,CharSet = CharSet.Auto)]
public static extern bool GetWindowRect(IntPtrhWnd,[In,Out] ref Rectanglerect);

[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 IntPtrhwnd;
public IntPtrhwndAfter;
public int x;
public int y;
public int cx;
public int cy;
public uint flags;
}

[StructLayout(LayoutKind.Sequential)]
public struct NCCALCSIZE_PARAMS
{
public RECTrgc;
public WINDOWPOSwndpos;
}

[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(IntPtrhwnd, int fnBar, ref SCROLLINFOlpsi);
[DllImport(
" user32.dll " ,EntryPoint = " SetScrollInfo " )]
public static extern int SetScrollInfo(IntPtrhwnd, int fnBar,[In] ref SCROLLINFOlpsi, bool fRedraw);

[DllImport(
" User32.dll " ,CharSet = CharSet.Auto,EntryPoint = " SendMessage " )]
static extern IntPtrSendMessage(IntPtrhWnd, uint Msg,IntPtrwParam,IntPtrlParam);
[DllImport(
" user32.dll " ,SetLastError = true )]
public static extern bool PostMessage(IntPtrhWnd, 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(HandleRefhWnd,[In,Out] ref RECTrect);


[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;
}
}
}

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> Win32.SetWindowLong( this .Handle, - 16 ,Win32.WS_SYSMENU + Win32.WS_SIZEBOX + Win32.WS_MAXIMIZEBOX + Win32.WS_MINIMIZEBOX);

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

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

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

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

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

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 默认的肤色这是一个枚举
private SkinColor_currentSkinColor = SkinColor.Default;

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

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

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

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

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

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

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

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

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

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 指定方法或是属性是否可以在编辑器中查看Never始终不能,Always始终是可以的,Advanced只有高级用户才能查看
[EditorBrowsable(EditorBrowsableState.Never)]
public new FormBorderStyleFormBorderStyle
{
get { return base .FormBorderStyle;}
set { base .FormBorderStyle = value;}
}

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 指定事件或是属性是否显示在属性窗口中
// [Browsable(false)]
// 指定事件或是属性是否显示在属性窗口中
[Browsable( true )]
public FormBorderStyleFormStyle
{
get { return _formBorderStyle;}
set {_formBorderStyle = value;}
}

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

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

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

,重写OnLoad事件和OnResize事件

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 得到一个值表示是否重绘
public bool IsRedrawSuspended
{
get { return _isRedrawSuspended;}
}

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

第五步

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

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 重写的OnLoad事件
protected override void OnLoad(EventArgse)
{

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(EventArgse)
{
base .OnResize(e);

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

}

第六步,设置窗体的图片

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 设置用户控件的图片
public void PerformReSetFormBitmap()
{
try
{
this .SuspendRedraw();

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

public virtual void ReSetFormBitmap()
{

}

第七步,设置窗体背景

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 设置用户控件背景
public void PerformChangeBackgroundStripe(BackgroundStripebackgroundStripe)
{
try
{
ChangeBackgroundStripe(backgroundStripe);
}
catch
{
throw ;
}
finally
{
this .ResumeRedraw();
}
}

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

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

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> #region // 设置皮肤色ChangeSkinColor


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

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

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

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

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

实现 代码

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // 修改皮肤色时
public virtual void ChangeSkinColor(SkinColorskinColor)
{
if ( this .CurrentSkinColor != skinColor)
{
this .ReSetFormBitmap();
if (skinColor != SkinColor.Undefault)
{
Shared.ChangeSkinColor(skinColor,
this );
}
}
else
{
this .ReSetFormBitmap();
Shared.ChangeControlsSkinColor(
this );
}
this .CurrentSkinColor = Shared.CurrentSkinColor;
}

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

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

效果就是这样的,

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

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> 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 SkinColorCurrentSkinColor
{
get { return _currentSkinColor;}
set {_currentSkinColor = value;}
}

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

// 指定事件或是属性是否显示在属性窗口中
// [Browsable(false)]
// 指定事件或是属性是否显示在属性窗口中
[Browsable( true )]
public FormBorderStyleFormStyle
{
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(EventArgse)
{

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(EventArgse)
{
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(BackgroundStripebackgroundStripe)
{
try
{
ChangeBackgroundStripe(backgroundStripe);
}
catch
{
throw ;
}
finally
{
this .ResumeRedraw();
}
&n
上一篇: 调用Https WebService发布后使用时报“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系”证书验证失败的解决过程(3) 下一篇: GridView 使用方法总结
<script type="text/javascript"> new Ad(4, 'ad_cen'); </script>
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
<script type="text/javascript"> var fileName = '5427240'; var commentscount = 2; var islock = false </script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/comment.js?v=1.1"></script>
<script type="text/javascript"> new Ad(5, 'ad_bot'); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值