首页 > 代码库 > win32API 入口WinMain()内部机理

win32API 入口WinMain()内部机理

win32API 入口WinMain()内部机理

  • 入口 WinMain()
  • 前面戴两重“帽子”:一个"int"是指返回值; 一个WINAPI指“调用约定”。
  • 后面有四个参数:
    • HINSTANCE hInstance, 由操作系统生成的“当前实例句柄”。
    • HINSTANCE hPrevInstance,"先前实例句柄"----已经遭废弃,以前有用到过,现在已无用。“二货”都会遭到”白眼“,一般赋值null。
    • LPSTR lpCmdLine,由外部传递进来的命令行,如:用记事本打开一个txt文件,内里实现是把txt文件路径传入记事本程序,而记事本也要从入口WinMain()进入的,LPSTR lpCmdLine就来接收此路径参数。
    • int nShowCmd 显示参数,由操作系统指定。
  • WNDCLASSEX 结构用于注册窗口类
    • cbSize:
      • wcex.cbSize = sizeof( WNDCLASSEX );
      • WNDCLASSEX 的大小。我们可以用sizeof(WNDCLASSEX)来获得准确的值。
    • cbClsExtra:
      • wcex.cbClsExtra = 0;
      • 指定紧跟在窗口类结构后的附加字节数。窗口类关联的一个额外的空间。基本已经用不到。
    • cbWndExtra:
      • wcex.cbWndExtra = 0;
      • 指定紧跟在窗口事例后的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时,则必须把这个成员设成DLGWINDOWEXTRA。窗口关联的一个额外的空间。
    • hbrBackground:
      • wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
      • 背景画刷的句柄。
    • hCursor:
      • wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
      • 光标的句柄。
    • hIcon:
      • wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      • 图标的句柄,任务栏上面的图标。
    • hIconSm:
      • wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO );
      • 和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。标题栏左边的小图标。
    • hInstance:
      • wcex.hInstance = hInstance;
      • 本模块的事例句柄。
    • lpfnWndProc:
      • wcex.lpfnWndProc = (WNDPROC) WndProc;
      • 窗口处理函数的指针。
      • WNDCLASSEX 中最重要的成员莫过于lpfnWndProc了。前缀 lpfn 表示该成员是一个指向函数的长指针。在 Win32中由于内存模式是 FLAT 型,所以没有 near 或 far 的区别。每一个窗口类必须有一个窗口过程,当 Windows 把属于特定窗口的消息发送给该窗口时,该窗口的窗口类负责处理所有的消息,如键盘消息或鼠标消息。由于窗口过程差不多智能地处理了所有的窗口消息循环,所以您只要在其中加入消息处理过程即可。
    • lpszClassName:
      • wcex.lpszClassName = "My Class";
      • 指向类名称的指针。
    • lpszMenuName:
      • wcex.lpszMenuName = NULL;
      • 指向菜单的指针。
    • style:
      • wcex.style = CS_HREDRAW | CS_VREDRAW;
      • 从这个窗口类派生的窗口具有的风格。您可以用“or”操作符来把几个风格或到一起。
    • return RegisterClassEx( &wcex );

win32API 入口WinMain()内部机理