如何截获WM_DRAWITEM? (100分)

  • 主题发起人 主题发起人 doxpix
  • 开始时间 开始时间
D

doxpix

Unregistered / Unconfirmed
GUEST, unregistred user!
重载TForm的WndProc,DefaultHandler都没用。
可我明明在forms.pas(2969行起)看到TCustomForm.WndProc
成功的截获了WM_DRAWITEM!
为什么?为什么??为什么???
 
你的意思是屏蔽掉他?
 
你想实现什么?
 
只要做一个最简单的程序表明能截获WM_DRAWITEM就行了。
就像这样
procedure WMDrawItem(Var Message:TWMDRAWITEM);
begin
showmessage('Got WM_DRAWITEM Message!!!');
end;

 
确实没有截获到,不过我跟踪了Form里面的WM_DRAWITEM,也没有产生事件呀。
跟踪的办法是project->Options->Complier->Debuging->Use Debuging DCU,然后就可以了。
真的不知道这个东西什么时间产生事件
 
你子类化试试
var p:pointer;
p:=setwindowlong(form.handle,GWL_WNDPROC,integer(pointer(子类化方法)));
 
子类化也是没有用的。
子类化可以截获到WM_NCACTIVATE, WM_NCPAINT, WM_PAINT这些消息。
但是独独对WM_DRAWITEM没有作用。
 
The WM_DRAWITEM message is sent to the owner window of an owner-drawn button,
combo box, list box, or menu when a visual aspect of the button, combo box,
list box, or menu has changed.

如果我没翻译错的话,应该是在comobox等控键变化时,由comobox控件发送给其owner控件,
但是我也没有截获它:(
踢一交
 
Delphi里这样写的,
CN_BASE=$BC00;
CN_DRAWITEM = CN_BASE + WM_DRAWITEM;
你截获CN_DRAWITEM试试看,看有没有同样的效果
 
CN_DRAWITEM是换汤不换药。
 
我在HOOK(WH_CALLWNDPROCRET)中可以:(其他的没试)
procedure HookProc(hWnd:integer;uMessage:integer;wParam:WPARAM;lParam:LPARAM);stdcall;
var
ds:pdrawitemstruct;
begin
if (uMessage=wm_paint) or (uMessage=wm_drawitem) or (uMessage=wm_ncpaint) then
begin
psl^.PaintHandle :=hWnd;
if (uMessage=wm_drawitem) then
begin
psl^.PaintHandle :=hWnd;
ds:=pdrawitemstruct(lparam);
SendMessage(psl^.MainHandle ,wm_GetPaint,wParam,lParam);
// SaveInfo('paint'+timetostr(now)+#13#10);
end;
end;
end;

function GetMessageCall(ncode:integer;wparam:longint;lparam:longint):lresult;stdcall;export;
var
pcs:pcwpretstruct;
// pcs:PMSG;
hd,uMsg,wP,lP:integer;
begin
pcs:=pcwpretstruct(lParam);
if (nCode>=0) and (pcs<>nil) and (pcs^.hwnd<>0) then
begin
hd:=pcs^.hwnd;
uMsg:=pcs^.message;
wp:=pcs^.wParam;
lp:=pcs^.lParam;
HookProc(hd,uMsg,wp,lp);
end;
Result:=CallNextHookEx(psl^.HHGetMsgProc,nCode,wParam,lParam);
end;
 
看来用钩子有戏,明天上午我try一下。
 
鼠标在IE地址栏上移进移出肯定发生WM_DRAWITEM消息
 
有没有把菜单的OwnerDraw属性设为True?
 
不是菜单,是按钮。
 
用BitBtn就可以了,普通的Button在创建的时候不会使用BS_OWNERDRAW 的窗口风格。
 
to cheka:
WindowBlinds你一定玩过吧。它是如何把windows98的按钮画成WindowsXP等其他风格的?
用的是钩子吗?它钩了哪些消息?请指教。
 
你 截获WM_DRAWITEM
干吗????????????

Style = csOwnerDrawFixed


procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin

end;

不时很好吗
 
to hfghfghfg:
不是combobox,是button。
 
后退
顶部