在WinForm二三事(一)里,我们谈了WinForm上的事件(比如点击啊,双击啊)是借助消息循环,消息分发的机制实现的。但那篇里只是一笔带过。后来有人问我这中间的具体关系是什么呢?那今天我们就来详细谈谈从Win32的Message到WinForm上的Event。

Win32中的Hello world

要具体了解这个问题,我们先来看看在Win32的时候,使用原生的API(或者叫Native API)如何做个简单的Hello World的小窗体:

#include <windows.h>
   2:  
//这就是就受消息,然后处理的地方了
   4: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
   5: {
switch(msg)
   7:     {
return 0;
return DefWindowProc(hwnd,msg,wparam,lparam);
  10:     }
  11: }
  12:  
int cmdShow)
  14: {
//一个窗体类,用来设置窗体的各种属性,比如大小啊、背景颜色啊等等
  16:     WNDCLASSEX windowClass;
  17:     MSG msg;
  18:     HWND window;
sizeof(WNDCLASSEX));
sizeof(WNDCLASSEX);
  21:     windowClass.hInstance = instance;
;
//注意这里,当消息分发到这个窗体上来的时候,就是由WndProc这个函数进行处理
  24:     windowClass.lpfnWndProc = WndProc;
  25:     windowClass.hbrBackground = (HBRUSH)COLOR_WINDOW+1;
  26:     
if(!RegisterClassEx(&windowClass))
  28:     {
,MB_OK|MB_ICONERROR);
return 1;
  31:     }
,WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
  33:                 CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, instance, NULL);
  34:     ShowWindow(window,cmbShow);
  35:     
//消息循环,从消息队列里获取消息,然后分发消息
//实际上GetMessage方法会返回-1(意思是出错了),所以下面这样的写法并不总是正确的
while(GetMessage(&msg,NULL,0,0)) 
  39:     {
  40:         TranslateMessage(&msg);
  41:         DispatchMessage(&msg);
  42:     }
  43:     
return 0;
  45: }

相关文章:

  • 2021-09-14
  • 2021-07-19
  • 2021-07-30
  • 2021-08-21
  • 2022-12-23
  • 2021-10-23
猜你喜欢
  • 2021-05-12
  • 2021-09-07
  • 2021-09-01
  • 2022-02-25
  • 2021-06-13
相关资源
相似解决方案