谁能讲解一下window的消息处理过程,要api形式不要VCL形式~(100分)

  • 主题发起人 主题发起人 Rocklee
  • 开始时间 开始时间
R

Rocklee

Unregistered / Unconfirmed
GUEST, unregistred user!
我试着不用application对象,<br>而是直接用<br>&nbsp; with tform1.create(nil) do <br>&nbsp; &nbsp; show;<br>&nbsp; fClassName := AppletClassName;<br>&nbsp; with wClass do<br>&nbsp; begin<br>&nbsp; &nbsp; Style := CS_PARENTDC;<br>&nbsp; &nbsp; hIcon := LoadIcon(hInst, 'MAINICON');<br>&nbsp; &nbsp; lpfnWndProc := @WindowProc;<br>&nbsp; &nbsp; hInstance := hInst;<br>&nbsp; &nbsp; hbrBackground := COLOR_BTNFACE + 1;<br>&nbsp; &nbsp; lpszClassName := pchar(fclassname);<br>&nbsp; &nbsp; hCursor := LoadCursor(0, IDC_ARROW);<br>&nbsp; end;<br>&nbsp; RegisterClass(wClass);<br>&nbsp; fhandle := CreateWindowEx(WS_EX_TOOLWINDOW, pchar(fclassname), 'test',<br>&nbsp; &nbsp; WS_OVERLAPPEDWINDOW, 1, 1, 1, 0, 0, 0, hInst, nil);<br>&nbsp;<br>&nbsp; while (GetMessage(Msg, fHandle, 0, 0)) do<br>&nbsp; begin<br>&nbsp; &nbsp; if (Msg.Message &lt;&gt; WM_QUIT) then begin<br>&nbsp; &nbsp; &nbsp; TranslateMessage(Msg);<br>&nbsp; &nbsp; &nbsp; DispatchMessage(Msg);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br><br><br>....<br>function WindowProc(hWnd, Msg, wParam, lParam: Longint): Longint; stdcall;<br>begin<br>&nbsp; Result := DefWindowProc(hWnd, Msg, wParam, lParam);<br>&nbsp; if (Msg = wm_destroy) or (Msg = wm_Close) then begin<br>&nbsp; &nbsp; UnRegisterClass(pchar(fClassName), hInst);<br>&nbsp; &nbsp; &nbsp; onEnd;<br>&nbsp; &nbsp; ExitProcess(hInst); //end program<br>&nbsp; end;<br>end;<br><br><br>上面是一段很经典的API建立window对象的代码,<br>先声明,如果硬要这样运行,可能不会成功,因为这是抄出来的,不完整。<br>但如果这样写,TFORM1的实例,就不能接收任何消息!!,像死机一样停着不动。<br>但如果改为 with tform1.create(nil) showmodal,tform1的实例就可以接收消息。<br>(那个 with tform1...我是用来试试除用api建立的wClass能接收消息外,其他对象能否<br>接收,别以为我吃饱了撑着,呵呵)<br><br>现在我想问:GetMessage(Msg, fHandle, 0, 0)是什么意思,能举例说明吗?<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与peekmessage有什么不同?<br>&nbsp; &nbsp; &nbsp; TranslateMessage(Msg)跟 &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; DispatchMessage(Msg)又是什么意思(好像是一对使用的,呵呵)<br><br>假如,我用API建立不止一个window对象,那消息又如何处理?<br>
 
Peekmessage() 从消息队列中读消息<br>Getmessage() 可以有选择的从消息列表中得到消息<br>DispatchMessage() 用来派送消息到窗口过程<br>TranslateMessage() 用于将Virtul-Key消息翻译为字符消息<br><br>当然每个对象都要建立自己的消息机制<br>你没看到这种写法里一个又一个case语句来区分消息的嘛<br>在现在这个时候如果有人这么用就真是吃饱了撑的
 
你可不能这样说啊,假如不需要GUI的话,难道你也用APPLICATION之类的对象吗?<br>如果这样做,我会鄙视你的<br>毕竟用户的资源是宝贵的<br>别的不要说了,如果知道详细用法的话,就言归正传吧<br>我的意思是说,如果有存在两个或以上的windows窗体(用API创建),则用getmessage<br>好像不行!会使前一个windows窗体收不到消息!<br>有没有解决方法?
 
啊,今天试了一下,大概知道是什么原因了<br>但是,为什么我在另一线程中建立第二个window,第二个window就不能接收消息?<br>(前提:这个线程是放在第一个window建立之后才生成的)<br>如果把建立第二个window的代码放在此线程之外,就可以。<br><br>有人能解释吗?
 
★★★Windows消息系统是如何工作的<br>Windows的消息系统是由3个部分组成的:<br>&amp;#8226; 消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取<br>消息,然后分派给某个窗口。<br>&amp;#8226; 消息循环。通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然<br>后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。<br>&amp;#8226; 窗口过程。每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后<br>响应它。窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给Windows。<br>
 
我就不骂你们了。
 
还是去参考一下经典的C语言用API编写的Main。
 
function WindowProc(hWnd, Msg, wParam, lParam: Longint): Longint; stdcall;<br>&nbsp;我那句不是已经有返回值了吗?而且是默认的处理返回的呢<br>
 
后退
顶部