有一个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,这种方法我试过,不行!

解决方案 »

  1.   

    你是不是要生成一个自绘的ComboBox啊,早说啊,直接说出你的要求吧(最终效果),也许我能帮你,可能根本用不着WM_DRAWITEM消息。
      

  2.   

    to shines:
    我的自绘的ComboBox是在vb中用API CreateWindowEx动态生成,并设置成上述类型,以下操作全部用Windows API完成,我不但要在ComboBox中的每一个ListItem重绘不同的效果,而且要捕捉ComboBox所产生的各种事件,并予以响应!
    shines大侠,你在vb论坛上异常活跃,相信你能解决我的问题,请!
    to Un1:
    我认为你的水平很高,因为我以前的问题主要是你所解答,希望你能继续解答我的这个问题,SpyWorks是什么?在那里可以DownLoad?
      

  3.   

    http://www.desaware.com/SpyWorksL2.htm
      

  4.   

    我的例子可以生成一个像OICQ一样的,带图片的自绘ComboBox,当然都是用API生成的,只是我不太想给,捕捉事件当然没问题,钩子就行。我不知道你觉得够好了没有,你是画图呢,还是生成文字效果,如果是控制文字,已经措措有余了。真是买血了啊!!
      

  5.   

    to shines:
    够好,够好!俺的ComboBox既要画图,还要生成文字效果,你怎么会不太想给呢?!你看看这个贴子的分数,100分啊!俺简直在卖血啊!还有么要求?尽管提!再请!
    to Un1:
    非常可惜的是,SpyWorks的例子都很好,都是vb中的特技,可惜是vc编的控件完成的,俺不要控件,俺要用完全的API完成,请再指教!
      

  6.   

    To NiceFeather: 当然可以画图也可以有文字效果啦,看来你是找对了,我就给你吧哦不是贞操哦。:))
      

  7.   

    要自绘就是要owner draw吧?
    使用window proc一定能行。检查你哪里写错了。
      

  8.   

    shines:
      能够给我一份吗?让我学习学习。
      

  9.   

    各位大虾,俺没看懂,什么叫“自绘combo"?
    谁让俺长长见识?
      

  10.   

    我想prefix也是高手。vbfans: 自绘就是自己控制再生成一个ComboBox,就像OICQ选头像的时候一样,明白了吗?iwin: 你要可以,但是得有点代价才行,白送不太行,交换还可以,像prefix就行。其实我还想向 prefix 讨教几个问题
      

  11.   

    to shines:
    关于分数,请你稍安勿躁,我还要和你密谈!
    to prefix:
    你说的对,自绘就是要owner draw,按道理使用window proc一定能行,我的window proc已写好,不会有问题,但我不知在哪里用SetWindowLong()或SendMessage()调用此window proc,初始化时不行,paint事件中也不行,因为此combobox为CBS_DROPDOWNLIST + CBS_HASSTRINGS + CBS_OWNERDRAWFIXED!
    shines再次强调你是Expert,“Great Expert”,请您看看!!请...
      

  12.   

    好的,信你收到了吧,我的代码里面没有吗?SetWindowLong()就在Form_load()中就可以了,其实在哪都行啊,你不要搞得那么复杂。
    你是不是没有收到给你的代码啊??? prefix是对的,Window Proc其实这部分满简单的,难在画ComboBox上,干嘛说我是 Great ... 受不起 :)
      

  13.   

    to shines:
    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()放在哪里都不行!
      

  14.   

    几个相关的问题:
      你们在自己的控件中使用了subclass吗?如果有,是不是常用的
    setwindowlong(...addressof(my_wnd_proc)...)...呢,如果这样的控件放两个以上的话,
    程序还会正常吗?我猜测可能会有问题.
      

  15.   

    SetWindowsLong可以有多个。我的程序就在各个控件中都有一个,主窗口也有一个。都一直运行得好好的。想想看,每个控件不是都要接收消息吗?那有多个Window proc就很正常了。
      

  16.   

    对了,忘了说,我现在还并非什么高手,因为vc我还只会一点点(学习中),vb学到现在也才一年多一点。主要是因为我喜欢做编程这种工作。
      

  17.   

    SetWindowlong在form_load()中写就可以了,wm_drawitem是一个消息,当控件收到此消息时,window proc函数就会收到,你可以在window proc中写个
    select case XXX
       case wm_drawitem
        处理...
    end select
      

  18.   

    to prefix:
    我的写法和你的一模一样,但执行到case wm_drawitem处就刹车不执行了!以下代码一句也不执行!
      

  19.   

    prefix,请你收[email protected]中的信!
      

  20.   

    很简单的么。刚好刚做完一个“自绘”的MENU,而且是一个程序里有许多许多个MENU,做出
    象OICQ的效果,加图片、图表改变选择效果等等。就是用SETWINDOWLONG改一下WNDPROC的指针,这个函数必须在模块里而不能在窗体里。
    不过很容易崩溃,在自己的WNDPROC里千万不能出错,不能有断点、单步什么的。
    而退出时要恢复WNDPROC的指针。
    有个技巧:最好不要用Form.hWnd,而是放个PictureBox,用它的hWnd、WNDPROC,
    调试好了放到用户控件里去,就不容易崩溃了。
      

  21.   

    flywhc: 给我一份吧,[email protected]
      

  22.   

    flywhc: 给我一份吧,[email protected],谢谢
      

  23.   

    NiceFeather,信已经收到,国庆这几天我给你看看。
      

  24.   

    二楼的大哥,能不能也给我发一份,我研究这个东西很久了,一点进展都没有,很郁闷。邮箱:[email protected]