有一个ComboBox,类型为CBS_DROPDOWNLIST + CBS_HASSTRINGS + CBS_OWNERDRAWFIXED,我想重画这个控件,势必要发送WM_DRAWITEM消息,但我的大量重画代码在WM_DRAWITEM过程中,而且这个WM_DRAWITEM过程当然要在Hook的WinProc中,但
Public Type DRAWITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemAction As Long
itemState As Long
hwndItem As Long
hdc As Long
rcItem As RECT
itemData As Long
End TypeDim drawitem As DRAWITEMSTRUCT
WITH drawitem
.
.
.
END WITHSendMessage ComboBox.hWnd,WM_DRAWITEM,0&,drawitem
根本无法完成工作,因为WM_DRAWITEM过程的Hook WinProc无法导入,请教全国vb高手:
1、在什么地方发送重画消息?
2、如何在发送重画消息时导入Hook WinProc中的WM_DRAWITEM消息过程?
请简述实现过程!参考:有人说可以在获得ComboBox.hWnd以后用SetWindowLong设置WinProc,这种方法我试过,不行!
Public Type DRAWITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemAction As Long
itemState As Long
hwndItem As Long
hdc As Long
rcItem As RECT
itemData As Long
End TypeDim drawitem As DRAWITEMSTRUCT
WITH drawitem
.
.
.
END WITHSendMessage ComboBox.hWnd,WM_DRAWITEM,0&,drawitem
根本无法完成工作,因为WM_DRAWITEM过程的Hook WinProc无法导入,请教全国vb高手:
1、在什么地方发送重画消息?
2、如何在发送重画消息时导入Hook WinProc中的WM_DRAWITEM消息过程?
请简述实现过程!参考:有人说可以在获得ComboBox.hWnd以后用SetWindowLong设置WinProc,这种方法我试过,不行!
我的自绘的ComboBox是在vb中用API CreateWindowEx动态生成,并设置成上述类型,以下操作全部用Windows API完成,我不但要在ComboBox中的每一个ListItem重绘不同的效果,而且要捕捉ComboBox所产生的各种事件,并予以响应!
shines大侠,你在vb论坛上异常活跃,相信你能解决我的问题,请!
to Un1:
我认为你的水平很高,因为我以前的问题主要是你所解答,希望你能继续解答我的这个问题,SpyWorks是什么?在那里可以DownLoad?
够好,够好!俺的ComboBox既要画图,还要生成文字效果,你怎么会不太想给呢?!你看看这个贴子的分数,100分啊!俺简直在卖血啊!还有么要求?尽管提!再请!
to Un1:
非常可惜的是,SpyWorks的例子都很好,都是vb中的特技,可惜是vc编的控件完成的,俺不要控件,俺要用完全的API完成,请再指教!
使用window proc一定能行。检查你哪里写错了。
能够给我一份吗?让我学习学习。
谁让俺长长见识?
关于分数,请你稍安勿躁,我还要和你密谈!
to prefix:
你说的对,自绘就是要owner draw,按道理使用window proc一定能行,我的window proc已写好,不会有问题,但我不知在哪里用SetWindowLong()或SendMessage()调用此window proc,初始化时不行,paint事件中也不行,因为此combobox为CBS_DROPDOWNLIST + CBS_HASSTRINGS + CBS_OWNERDRAWFIXED!
shines再次强调你是Expert,“Great Expert”,请您看看!!请...
你是不是没有收到给你的代码啊??? prefix是对的,Window Proc其实这部分满简单的,难在画ComboBox上,干嘛说我是 Great ... 受不起 :)
1、信收到了,代码我要审,关于分数,请你稍安勿躁!
2、你用过Microsoft Windows Common Controls 6.0里的ImageCombo控件吗?你看和你的有什么区别?
3、你的ComboBox能加载图标等图片,能用任意绘图API“绘制”ListItem吗?注意是“绘制”,不用SendMessage ComboBox.hWnd,WM_DRAWITEM,...让我很吃惊!
4、“Window Proc其实这部分满简单的,难在画ComboBox”,画ComboBox的代码不在Window Proc中在哪里呢?
5、SetWindowLong()放在哪里都不行!
你们在自己的控件中使用了subclass吗?如果有,是不是常用的
setwindowlong(...addressof(my_wnd_proc)...)...呢,如果这样的控件放两个以上的话,
程序还会正常吗?我猜测可能会有问题.
select case XXX
case wm_drawitem
处理...
end select
我的写法和你的一模一样,但执行到case wm_drawitem处就刹车不执行了!以下代码一句也不执行!
象OICQ的效果,加图片、图表改变选择效果等等。就是用SETWINDOWLONG改一下WNDPROC的指针,这个函数必须在模块里而不能在窗体里。
不过很容易崩溃,在自己的WNDPROC里千万不能出错,不能有断点、单步什么的。
而退出时要恢复WNDPROC的指针。
有个技巧:最好不要用Form.hWnd,而是放个PictureBox,用它的hWnd、WNDPROC,
调试好了放到用户控件里去,就不容易崩溃了。