Win32窗口笔记

1. 前言

Win32窗口的创建按照以下步骤:

  • 定义窗口
  • 注册窗口
  • 创建窗口
  • 显示窗口
  • 更新窗口 (非必须???)
  • 消息循环
  • 窗口过程 WndProc

2. 相关函数

2.1 WinMain

Windows中GUI程序的入口函数是WinMain

int WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nShowCmd)
{
    // hIns: 当前程序实例句柄
    // hPreIns: 前一个程序的实例句柄,已经弃用
    // lpCmdLine: 
    // nShowCmd:
}

2.2 WndProc

每个窗口都有一个过程函数。

LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wPara, LPARAM lPara)
{
    switch(msg)
    {
        case:
        //  .......
    }

    return DefWindowProc(hWnd, msg, wPara, lPara);
}

2.3 CreateWindowEx

函数功能是创建窗口。

HWND CreateWindowExA(
  [in]           DWORD     dwExStyle,
  [in, optional] LPCSTR    lpClassName,
  [in, optional] LPCSTR    lpWindowName,
  [in]           DWORD     dwStyle,
  [in]           int       X,
  [in]           int       Y,
  [in]           int       nWidth,
  [in]           int       nHeight,
  [in, optional] HWND      hWndParent,
  [in, optional] HMENU     hMenu,
  [in, optional] HINSTANCE hInstance,
  [in, optional] LPVOID    lpParam
);

dwExStyle: 窗口的扩展样式.这里演示几个样式.
WS_EX_ACCEPTFILES: 创建可以接收文件。当拖放文件到窗口上时,系统会向该窗口发送WM_DROPFILES消息。

WS_EX_TOPMOST: 这个属性只用在顶层窗口上,对于子窗口这个属性被自动忽略, 设置了这个属性的窗口会一直在其他窗口上面。

3. 一些概念

3.1 顶层窗口

指的是没有父窗口或者父窗口为桌面的窗口,顶层窗口不会拥有WS_CHILD属性.

3.2 客户区与非客户区

非客户区包括以下部分:

  • 标题栏: 顶部的横条, 显示的窗口图标, 标题
  • 边框
  • 垂直和水平滚动条
  • 菜单栏,在标题栏的下方
  • 系统菜单,WM_SYSMENU

4. 菜单的使用

4.1 介绍

Windows中有三种菜单, 分别时系统菜单, 顶层菜单, 弹出菜单(右键菜单), 如下图所示: