CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

关于创建刷子

楼主wzzwwz(皮皮鲁)2005-04-01 16:35:41 在 VB / API 提问

增加一个复选框,然后把   Style   属性设置成   1   -   Graphical   ,然后把它选中,既   Value   =   1   ,这个时候复选框表面的颜色变成了这样的颜色  
  灰色   白色   灰色   白色   。。。。。。  
  白色   灰色   白色   灰色   。。。。。。  
  我现在想用   API   函数创建一个这样的刷子,弄了半天也不行,只能通过   CreateBitmap     创建了一个位图,然后用   CreatePatternBrush   创建的位图刷子,现在,我想直接用一个刷子函数创建类似的刷子,能否实现?注意:颜色相隔是一个象素,多了不好看 问题点数:100、回复次数:26Top

1 楼wzzwwz(皮皮鲁)回复于 2005-04-01 17:15:26 得分 0

。。。。Top

2 楼wzzwwz(皮皮鲁)回复于 2005-04-01 19:41:30 得分 0

帮忙顶一下也行啊Top

3 楼wzzwwz(皮皮鲁)回复于 2005-04-01 21:20:58 得分 0

希望明天来看得时候有人帮忙顶一下或者解答。Top

4 楼mndsoft(枕善居(http://www.mndsoft.com/)回复于 2005-04-01 21:28:08 得分 10

上午刚发了一个有关画图的程序,去我的网站上找找吧Top

5 楼wzzwwz(皮皮鲁)回复于 2005-04-02 09:22:19 得分 0

谢谢楼上的,但是我看了一下那个例子得代码,没有我想要得效果啊Top

6 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2005-04-02 09:36:02 得分 10

可以通过CreateBrushIndirect来创建,将LOGBRUSH的lbHatch   设置为HS_BDIAGONAL或者HS_DIAGCROSS   、HS_FDIAGONAL。你可以使用上面的设置来看一下哪个是你要的效果。Top

7 楼wzzwwz(皮皮鲁)回复于 2005-04-02 09:50:08 得分 0

不是我想要得效果,各位可以这样看看那种效果。按照我说的设置复选框的属性,然后抓图,放到图象编辑软件里放大看看。每种颜色的间隔只有一个象素。而现在创建的阴影刷子,间隔不止一个象素。如果各位嫌分数少,我再加Top

8 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2005-04-02 10:36:32 得分 0

如果是这样的话只能用位图画刷了,CreateBrushIndirect所支持的画刷可能没法实现以一个像素的交叉。Top

9 楼wzzwwz(皮皮鲁)回复于 2005-04-02 10:46:49 得分 0

那么用   CreateDIBPatternBrushPt   函数怎样画出下面那样的效果?还有,不知道系统是怎么画的?  
  灰色   白色   灰色   白色  
  白色   灰色   白色   灰色  
  Top

10 楼wzzwwz(皮皮鲁)回复于 2005-04-02 14:15:15 得分 0

又沉了。。。。。Top

11 楼wzzwwz(皮皮鲁)回复于 2005-04-02 17:24:34 得分 0

丁页Top

12 楼homezj(小吉)回复于 2005-04-05 15:23:45 得分 0

灰色   白色   灰色   白色   。。。。。。  
  白色   灰色   白色   灰色   。。。。。。  
   
  好象不是这样的吧?  
  CheckBox的Style=   1   -   Graphical   ,Value   =   1时,是一个浅灰色,这是一个系统色的单色刷呀。  
   
  可以用hBrush   =   CreateSolidBrush(GetSysColor(22))获取。  
  Top

13 楼wzzwwz(皮皮鲁)回复于 2005-04-05 19:58:50 得分 0

不管什么颜色,可是那确实是两种颜色相间隔形成的。。。。。。。。  
  我看了一下,一个颜色是按钮的表面颜色,一个是按钮的3D加亮区的颜色Top

14 楼junki(『.NET技术争霸天下』)回复于 2005-04-15 15:05:17 得分 5

看到了也顶一下Top

15 楼kikikaki(江海门户通天下)回复于 2005-04-15 16:50:59 得分 5

顶Top

16 楼kikikaki(江海门户通天下)回复于 2005-04-15 18:01:37 得分 0

wzzwwz   是什么意思?挺熟悉的呀Top

17 楼wzzwwz(皮皮鲁)回复于 2005-04-16 09:10:52 得分 0

kikikaki(江海门户通天下)    
  挺熟悉?你在哪里见过?Top

18 楼wzzwwz(皮皮鲁)回复于 2005-04-16 14:29:09 得分 0

无解??Top

19 楼homezj(小吉)回复于 2005-04-16 16:11:57 得分 70

今天才试了一下你说的抓图法,看了一下,的确是灰白相间,原来系统对高亮的处理很简单,就把原图的一半像素改成加亮色!简易高亮法:)  
   
  模似这种效果有何意义,先不说吧,我想肯定有解啦,一下子脑子出现无数种办法,但好象都不算方便。就说一种,我认为最简单的吧(也许还有更方便的,别笑我就行):  
   
  Private   Const   COLOR_BTNFACE   =   15  
  Private   Const   COLOR_BTNHIGHLIGHT   =   20  
  Private   Type   RECT  
                  Left   As   Long  
                  Top   As   Long  
                  Right   As   Long  
                  Bottom   As   Long  
  End   Type  
  Private   Declare   Function   FillRect   Lib   "user32"   (ByVal   hdc   As   Long,   lpRect   As   RECT,   ByVal   hBrush   As   Long)   As   Long  
  Private   Declare   Function   DeleteObject   Lib   "gdi32"   (ByVal   hObject   As   Long)   As   Long  
  Private   Declare   Function   CreatePatternBrush   Lib   "gdi32"   (ByVal   hBitmap   As   Long)   As   Long  
  Private   Declare   Function   CreateCompatibleBitmap   Lib   "gdi32"   (ByVal   hdc   As   Long,   ByVal   nWidth   As   Long,   ByVal   nHeight   As   Long)   As   Long  
  Private   Declare   Function   CreateCompatibleDC   Lib   "gdi32"   (ByVal   hdc   As   Long)   As   Long  
  Private   Declare   Function   SelectObject   Lib   "gdi32"   (ByVal   hdc   As   Long,   ByVal   hObject   As   Long)   As   Long  
  Private   Declare   Function   DeleteDC   Lib   "gdi32"   (ByVal   hdc   As   Long)   As   Long  
  Private   Declare   Function   SetPixelV   Lib   "gdi32"   (ByVal   hdc   As   Long,   ByVal   x   As   Long,   ByVal   y   As   Long,   ByVal   crColor   As   Long)   As   Long  
  Private   Declare   Function   GetSysColor   Lib   "user32"   (ByVal   nIndex   As   Long)   As   Long  
   
  Private   Function   HalfBrush(hdc   As   Long,   x   As   Long,   y   As   Long,   w   As   Long,   h   As   Long)   As   Boolean  
          Dim   hBrush   As   Long,   rc   As   RECT,   tmpdc   As   Long,   tmpbmp   As   Long,   tmpobm   As   Long  
          Dim   color1   As   Long,   color2   As   Long  
          tmpdc   =   CreateCompatibleDC(hdc)  
          tmpbmp   =   CreateCompatibleBitmap(hdc,   2,   2)  
          tmpobm   =   SelectObject(tmpdc,   tmpbmp)  
          color1   =   GetSysColor(COLOR_BTNFACE)  
          color2   =   GetSysColor(COLOR_BTNHIGHLIGHT)  
          SetPixelV   tmpdc,   0,   0,   color2  
          SetPixelV   tmpdc,   0,   1,   color1  
          SetPixelV   tmpdc,   1,   0,   color1  
          SetPixelV   tmpdc,   1,   1,   color2  
          SelectObject   tmpdc,   tmpobm  
          DeleteDC   tmpdc  
          hBrush   =   CreatePatternBrush(tmpbmp)  
          DeleteObject   tmpbmp  
          rc.Left   =   x  
          rc.Top   =   y  
          rc.Right   =   x   +   w  
          rc.Bottom   =   y   +   h  
          FillRect   hdc,   rc,   hBrush  
          DeleteObject   hBrush  
  End   Function  
   
  Private   Sub   Command1_Click()  
          HalfBrush   Picture1.hdc,   0,   0,   100,   100  
  End   Sub  
   
  Top

20 楼homezj(小吉)回复于 2005-04-16 16:16:39 得分 0

啊!贴出来有这么长!  
  写得太随意了,没当函数写,只是个Sub而已,感觉是自己写得最烂的一段代码了。Top

21 楼wzzwwz(皮皮鲁)回复于 2005-04-16 20:52:36 得分 0

哦,我的目的:通过自画做平面复选框,除了实现平面化,其它方面想尽量和系统一致。  
  还有什么其它方法?乐意讲一讲吗?如果嫌麻烦,呵呵,我马上结贴。Top

22 楼homezj(小吉)回复于 2005-04-16 21:07:21 得分 0

这个目的,那更简单呀,画个边框就行了,用DrawEdge,很方便的,就不用我贴代码了吧:)Top

23 楼wzzwwz(皮皮鲁)回复于 2005-04-16 21:24:48 得分 0

惭愧。。。。。。没有用过   DrawEdge   这个函数.我自己先搞一下,如果搞不定。就再次麻烦你了。。。。。。。。Top

24 楼homezj(小吉)回复于 2005-04-17 09:33:54 得分 0

若出于模拟系统控件效果的目的,其实根本不用这种画法,系统这样做的目的相当于让Face色与白色进行Alpha=128的色彩混合,只不过这是通过一种视觉效果模似的,并非真正混合。  
   
  从系统角度,它内部掌握着控件位图数据的指针,它只需简单的处理一半像素就可以了,即节省时间,又不用进行Alpha值的运算,肯定是首选。当然这也只适用于纯色位图。估计是Windows早期留下的传统。  
   
  所以,对按钮的高亮处理,你可选择两条不同的路,  
  一、与系统的内部实现方式完全相同,除上面方法外,位图数组处理也比较快,当然你没有系统的指针优势、需两次复制,效率上会差一些。  
  二、与系统产生的视觉效果完全相同,这就简单得多了,无非就是两种颜色的Alpha混合,对纯色图可预算合成色,再建单色刷,对图片按钮,可用AlphaBlend。  
   
  关于绘按钮、Check等控件,我在一篇做ToolBar的代码中,专门写过,其中有各种自绘平面、3D、位图样式按钮方法,你可参考。  
  http://community.csdn.net/Expert/topic/3758/3758060.xml?temp=.3342554Top

25 楼wzzwwz(皮皮鲁)回复于 2005-04-17 09:56:42 得分 0

好的,我去看看,我比较菜。。。。。。。Top

26 楼wzzwwz(皮皮鲁)回复于 2005-04-17 10:18:12 得分 0

唉,自己的水平实在不怎么样。看你的代码像看天书。你真牛!!高人啊!行了,我现在的水平还难以理解你讲的一些知识。以后尽量努力学习。结贴。Top

相关问题

  • 简单问题,使用CreateSolidBrush创建的刷子,不再使用时,是否需要用DeleteObject删除掉
  • 刷子释放问题
  • 关于刷子,笔等作图
  • 一个空刷子的问题
  • 主框架如何刷子框架
  • CBrush刷子,哪位大哥能不能帮我解释一下什么是刷子。
  • CWnd创建
  • Pen的创建
  • 创建目录
  • 创建报表????

关键词

  • 函数
  • 系统
  • 效果
  • 代码
  • 控件
  • 灰色
  • 刷子
  • 白色
  • 颜色
  • 创建

得分解答快速导航

  • 帖主:wzzwwz
  • mndsoft
  • TechnoFantasy
  • junki
  • kikikaki
  • homezj

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo