关于创建刷子
增加一个复选框,然后把 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




