• Windows下GUI编程——窗口


    windows下创建一个基于GUI的窗口程序很简单,使用MFC或者Win32 API都可以实现。本文简单整理下windows API创建GUI应用程序的基本编码框架。

     比较常见的窗口包括:桌面窗口、应用程序窗口、对话框及控件。从编程的角度而言,创建GUI应用程序需要提供入口函数WinMain的实现,其定义格式如下:

    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nCmdShow) 

    这里不解释其具体含义,感兴趣的可参考《Windows程序设计》或者msdn上相关资料。

    WinMain通常包含以下几个过程:

    1. 注册窗口类(window class);

    2. 创建窗口(CreateWindow);

    3. 消息循环(窗口过程回调、消息队列)。

    如果使用操作系统已经定义的窗口类,可以省略第一步;如果不需要自定义窗口消息处理机制,也可以省略第三步(有些资料直接调用对话框的默认实现,来给出最短的windows程序实现,基本上就是基于此原理)。

    关于窗口类的资料介绍,可以参考下我前段时间整理的“窗口类(Window Class)概述”。

    如果将上面三个步骤和c++编程语言对比下,第一步注册窗口类,就是为了给出新的类型的声明和实现,这个类型内部包含了一些必要的属性和方法,只不过操作系统提供的api在查找该类型时使用的类型名字(字符串);第二步创建窗口就是类实例化的过程,这里需要指定要创建的类名称(字符串);第三步就是针对先前实例化类型变量的调用规约,需要按照操作系统提供的约定来使用(消息处理及传递)。

    下面是CreateWindowEx函数的声明。

    HWND WINAPI CreateWindowEx(
      _In_      DWORD dwExStyle,
      _In_opt_  LPCTSTR lpClassName,
      _In_opt_  LPCTSTR lpWindowName,
      _In_      DWORD dwStyle,
      _In_      int x,
      _In_      int y,
      _In_      int nWidth,
      _In_      int nHeight,
      _In_opt_  HWND hWndParent,
      _In_opt_  HMENU hMenu,
      _In_opt_  HINSTANCE hInstance,
      _In_opt_  LPVOID lpParam
    );

    这里面的所有参数基本就是一个窗口用于的可定制的属性。不如窗口名称、窗口样式(Window Style,WS_XXX的原型)、窗口启动的位置、菜单、父窗口等。

    需要说明的是CreateWindowEx函数的返回值,hwnd。在msdn中关于HWND类型的说明只有一句话,handle to a window,顾名思义窗口句柄,指向某个窗口的句柄。尽管vs中HWND的定义要不是void *,要不是int类型,但从实际使用来看,窗口句柄是全局的,属于操作系统维护的,而且可以跨进程使用的,也许这也是 FindWindow函数的一种实现方法(另外一种说法是微软为了保持和16位操作系统兼容而提供的这种机制)。鉴于此,HWND可以看成是操作系统维护的内部结构,应用程序不应该试图了解改结果的内部实现。

  • 相关阅读:
    运动运行。
    stratMove方法
    抛物线
    表单的小例子吖
    常用的查询DOM的方法
    liuyan
    防止xss攻击。
    ES6
    Map的使用
    ZOJ 3998(线段树)
  • 原文地址:https://www.cnblogs.com/tocy/p/GUI-CreateWindow.html
Copyright © 2020-2023  润新知