为何拦截不到WM_CREATE(150分)

  • 主题发起人 主题发起人 smithcouple
  • 开始时间 开始时间
S

smithcouple

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近在用Delphi直接使用API写程序,没有使用任何VCL组件<br><br>遇到一个问题,<br>我创建了一个GroupBox,并在GroupBox里创建了ListView 比如<br> &nbsp;GPB := CreateWindow('Button', 'GroupBox',<br> &nbsp; &nbsp;WS_CHILD or WS_VISIBLE or BS_GROUPBOX, 8, 220, 436, 148, hWindow, 0, Inst, nil);<br> &nbsp;LSV := CreateWindowEx(WS_EX_CLIENTEDGE, 'SysListView32', '',<br> &nbsp; &nbsp;WS_CHILD or WS_VISIBLE or WS_TABSTOP or LVS_REPORT,<br> &nbsp; &nbsp;12, 24, 412, 112, GPB, 0, Inst, nil);<br><br>我希望在窗口被创建的时候就初始化好ListView的几个Column列,所以在主窗口的WindowProc中,写入:<br>var<br> &nbsp;LV: TLVColumn;<br>....<br>case MSG of <br> &nbsp;WM_CREATE: begin<br> &nbsp; &nbsp;LV.mask := LVCF_TEXT or LVCF_WIDTH;<br> &nbsp; &nbsp;LV.cx := 60;<br> &nbsp; &nbsp;LV.pszText := PChar('Text');<br> &nbsp; &nbsp;SendMessage(LSV, LVM_INSERTCOLUMN, 0, LongInt(@LV));<br> &nbsp; &nbsp;SendMessage(LSV, LVM_INSERTCOLUMN, 1, LongInt(@LV));<br> &nbsp;end;<br>....<br><br><br>发现根本没有效果,但可以确定 主窗口的WM_CREATE确实被发送了<br><br><br>后来尝试在GroupBox的消息循环里做:<br>GPBWndProcOld := Pointer(SetWindowLong(GPB, GWL_WNDPROC, LongInt(@GPBWndProc)));<br><br>function GPBWndProc(HGPB: HWnd; MSG, wParam, lParam: Integer): LongInt;<br>var<br> &nbsp;LV: TLVColumn;<br>begin<br> &nbsp;Result := 0;<br><br> &nbsp;case MSG of<br> &nbsp; &nbsp;WM_CREATE: begin<br> &nbsp; &nbsp; &nbsp;LV.mask := LVCF_TEXT or LVCF_WIDTH;<br> &nbsp; &nbsp; &nbsp;LV.cx := 60;<br> &nbsp; &nbsp; &nbsp;LV.pszText := PChar('12');<br> &nbsp; &nbsp; &nbsp;SendMessage(LSV, LVM_INSERTCOLUMN, 0, LongInt(@LV));<br> &nbsp; &nbsp; &nbsp;SendMessage(LSV, LVM_INSERTCOLUMN, 1, LongInt(@LV));<br> &nbsp; &nbsp;end;<br> &nbsp;else<br> &nbsp; &nbsp;Result := CallWindowProc(GPBWndProcOld, HGPB, MSG, wParam, lParam);<br> &nbsp;end;<br>end;<br><br>仍然没效果,我加入了一个MessageBox,发现GroupBox的WM_CREATE根本没反应,但如果我加一个Button,在Button的WM_COMMAND时候发送消息<br> &nbsp;Sendmessage(GRP, WM_CREATE, 0,0); <br>甚至直接设置 SendMessage(LSV, LVM_INSERTCOLUMN, 0, LongInt(@LV));<br>都能看到ListView的列确实被添加了。<br><br>另外,我将ListView从GroupBox中移出,直接放在主窗口下,然后再主窗口消息循环中,设置WM_CREATE: SendMessage(LSV, LVM_INSERTCOLUMN, 0, LongInt(@LV));也可以顺利的添加上列。<br><br>请问这是为什么,难道WM_CREATE只是针对于主窗口?<br>那应该如何在窗口初始化的时候就创建好ListView的列呢?我的ListView一定要放在GroupBox中。<br>我也看了一些VC++的代码,他们都可以很顺利的创建的。<br>刚开始接触这个几天,所以好多地方都很生疏<br>先谢谢各位的帮助!
 
WM_CREATE是在CreateWindow, CreateWindowEx调用返回前被触发的,因此只有在RegisterClass时事先定义的lpfnWndProc过程中才会收到WM_CREATE,事后用SetWindowLong设置的WndProc是收不到WM_CREATE消息的
 
非常感谢
 
后退
顶部