zoukankan      html  css  js  c++  java
  • 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可以看成是操作系统维护的内部结构,应用程序不应该试图了解改结果的内部实现。

  • 相关阅读:
    解决Eclipse点击运行后控制台不能自动弹出的问题
    vc中的空格怎么变成了“ `”或“^”,怎么变回来
    ping百度域名时的收获
    java学习(权限修饰符)
    can't create socket (must run as root?) : Permission denied
    Zabbix各种报错信息和遇到的问题
    windows2012r2 更改管理员密码
    Zabbix钉钉机器人报警
    用route命令添加永久路由
    zabbix使用jmx监控tomcat
  • 原文地址:https://www.cnblogs.com/tocy/p/GUI-CreateWindow.html
Copyright © 2011-2022 走看看