求c#c winfrom 权限绘制爱心

c# WinForm画图集锦_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c# WinForm画图集锦
上传于||文档简介
&&c​#​ ​W​i​n​F​o​r​m​画​图​集​锦
你可能喜欢做过.NET Winform窗体美化的人应该都很熟悉UpdateLayeredWindow吧,UpdateLayeredWindow可以实现窗体的任意透明,效果很好,不会有毛边。不过使用这个API之后,会有一个问题就是无法使用普通控件,而且没有Paint消息。为了解决这个问题,有两种方法。
一、使用双层窗体,底层窗体使用UpdateLayeredWindow作为背景,上层窗体用普通窗体,并且可以使用TransparencyKey或者Region来实现去除不需要的窗体内容,让上层窗体能看到底层的窗体。
二、直接单层窗体,使用控件的DrawToBitmap把控件图像绘制到UpdateLayeredWindow的窗体上,这样就可以看到普通控件了。不过这个也有问题:1.控件内容不能自动更新
2.效率低,很多控件使用DrawToBitmap绘制出的图像不完整,甚至绘制不出图像。比如TextBox无法显示光标,WebBrowser无法显示内容。
三、采用DirectUI技术,重写所有基础控件。效果最好,不过工作量巨大。
使用UpdateLayeredWindow时,一般是需要对Bitmap缓存起来,通过设置剪辑区域,局部重绘来提高效率。另外还可以异步重绘,模拟Winform的失效到重绘。
有些人会说为什么不直接用WPF啊,Wpf和Winform各有优缺点,适应不同的场合。Winform相对于使用更简单一些,系统要求更低。当然需要看人的习惯了和擅长的。
UpdateLayeredWindow 基本使用方法:
重写窗体的 CreateParams 属性
CreateParams CreateParams
CreateParams cp
base .CreateP
cp.ExStyle
WS_EX_LAYERED 扩展样式
SetBitmap(Bitmap bitmap,
(bitmap.PixelFormat
PixelFormat.Format32bppArgb)
ApplicationException( "位图必须是32位包含alpha 通道" );
IntPtr screenDc
Win32.GetDC(IntPtr.Zero);
IntPtr memDc
Win32.CreateCompatibleDC(screenDc);
IntPtr hBitmap
IntPtr oldBitmap
bitmap.GetHbitmap(Color.FromArgb( 0 ));
// 创建GDI位图句柄,效率较低
Win32.SelectObject(memDc, hBitmap);
Win32.Size size
Win32.Size(bitmap.Width, bitmap.Height);
Win32.Point pointSource
Win32.Point( 0 ,
Win32.Point topPos
Win32.Point(Left, Top);
Win32.BLENDFUNCTION blend
Win32.BLENDFUNCTION();
blend.BlendOp
Win32.AC_SRC_OVER;
blend.BlendFlags
blend.SourceConstantAlpha
blend.AlphaFormat
Win32.AC_SRC_ALPHA;
Win32.UpdateLayeredWindow(Handle, screenDc,
size, memDc,
pointSource,
blend, Win32.ULW_ALPHA);
Win32.ReleaseDC(IntPtr.Zero, screenDc);
IntPtr.Zero)
Win32.SelectObject(memDc, oldBitmap);
Win32.DeleteObject(hBitmap);
Win32.DeleteDC(memDc);
[StructLayout(LayoutKind.Sequential)]
Point(Int32 x, Int32 y)
[StructLayout(LayoutKind.Sequential)]
Size(Int32 cx, Int32 cy)
[StructLayout(LayoutKind.Sequential, Pack
[StructLayout(LayoutKind.Sequential, Pack
BLENDFUNCTION
SourceConstantA
Int32 ULW_COLORKEY
Int32 ULW_ALPHA
Int32 ULW_OPAQUE
AC_SRC_OVER
AC_SRC_ALPHA
[DllImport( " user32.dll " , ExactSpelling
true , SetLastError
Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst,
Point pptDst,
Size psize, IntPtr hdcSrc,
Point pprSrc, Int32 crKey,
BLENDFUNCTION pblend, Int32 dwFlags);
[DllImport( " user32.dll " , ExactSpelling
true , SetLastError
IntPtr GetDC(IntPtr hWnd);
[DllImport( " user32.dll " , ExactSpelling
ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport( " gdi32.dll " , ExactSpelling
true , SetLastError
IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport( " gdi32.dll " , ExactSpelling
true , SetLastError
Bool DeleteDC(IntPtr hdc);
[DllImport( " gdi32.dll " , ExactSpelling
IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
[DllImport( " gdi32.dll " , ExactSpelling
true , SetLastError
Bool DeleteObject(IntPtr hObject);
[DllImport( " user32.dll " , EntryPoint
" SendMessage " )]
SendMessage( int
[DllImport( " user32.dll " , EntryPoint
" ReleaseCapture " )]
ReleaseCapture();
WM_SysCommand
SC_MAXIMIZE
SC_MINIMIZE
需要呈现图像的时候调用 SetBitmap 方法。只要优化好,呈现效率比普通的Paint重绘方式高很多,并且不卡不闪烁,支持任意透明。
下面是自己开发出来的效果:
这个是用OpenGL绘制的
推荐一款C#界面库:DSkin界面库(Winform平台首个DirectUI界面库)
还有一个也是我开发的免费界面库LayeredSkin
也可以实现很多效果
Winform也可以很炫丽的!
在文章中找不到问题答案?您还可以
热门栏目订阅C#新手入门图文教程---基于winform的一个小例子_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C#新手入门图文教程---基于winform的一个小例子
上传于||文档简介
&&C​#​图​文​教​程​ ​w​i​n​f​o​r​m​例​子
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢虽然VS为我们提供了很多控件可以使用,但有时候这些控件仍然不能满足我们的要求,比如我们要对部分控件进行一些个性化的定制,例如美化控件,这时候就需要自己绘制控件,或是在原有控件的基础上进行修改
自定义控件分为三种
  1、组合控件(CompositeControls):在原有控件的基础上根据需要进行组合
  2、扩展控件(ExtendedControls):继承自原有控件,添加一些新的属性和方法,绘制一些新元素
  3、自定义控件(CustomControls):控件的绘制全部由用户定义
1、组合控件
  新建项目,拖入需要的控件,就像在窗体一样
  编译生成,可以查看控件的外观
  在生成的目录可以找到相应的控件库文件CompositeControl.dll
  这样组合控件的dll就做好了,用法后面再讲
2、扩展控件
  首先,添加一个类库
  引用两个命名空间 System.Drawing 和 System.Windows.Forms ,类改名为为ButtonEx,继承自Button
  注意,扩展控件编译生成后并不能调用可视化工具查看,只生成了dll文件,需要引入到项目中使用才能看到
3、自定义控件
  自定义控件添加方法跟扩展控件一样,只是最后类是继承自Control类的
接下来是把控件库引入到项目中使用
  如果项目和控件库项目在同一解决方案中的话,控件会自动引入到工具箱
  如果在不同项目中
  浏览 选择库文件,然后将该控件打钩
  将控件拖到窗体中
  这节主要讲自定义控件如何创建和使用,具体如何绘制和定义控件内容。可以看后续博文
阅读(...) 评论()}

我要回帖

更多关于 android 绘制爱心 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信