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

Windows下GUI编程——窗口的更多相关文章

  1. 初尝Windows 下批处理编程

    本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了. 本文包括以下内容 1.什么是批处理 2.常用批处理命令 3.简介批处 ...

  2. 初探WINDOWS下IME编程

    初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本 ...

  3. Windows下串口编程

     造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...

  4. Windows下多线程编程(一)

    前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. ...

  5. Windows下Hadoop编程环境配置指南

    刘勇    Email: lyssym@sina.com 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究 ...

  6. windows下socket编程:区分shutdown()及closesocket()

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  7. Windows下多线程编程(二)

    线程的分类 1.     有消息循环线程 MFC中有用户界面线程,从CWinThread派生出一个新的类作为UI线程类CUIThread,然后调用AfxBeginthread(RUNTIME_CLAS ...

  8. Windows下C编程获取软件安装列表信息

    代码如下: #include <windows.h> #include <stdio.h> #include <iostream> #include <vec ...

  9. windows下网络编程UDP

    转载 C++ UDP客户端服务器Socket编程 UDPServer.cpp #include<winsock2.h>#include<stdio.h>#include< ...

随机推荐

  1. ldap文件

    demo.ldif dn:dc=sgp,dc=com objectclass:domain objectclass:top o:Michael Blog dc:sgp dn:ou=Developer, ...

  2. 【java】解析JToolBar类的使用

    1.简介 在大部分的Look and Feels下,用户都可以把该工具条拖离原Window组件(除非floatable属性设置为false).为了能够正常的实现拖动效果,该类的实例被建议添加到Bord ...

  3. sublime Text 些许使用配置

    在安装numpy等库函数时,通过“命令提示符”操作显示库函数已经安装完毕,在pycharm中可是依然显示引用失败,尝试使用sublime,显示可用,遂好好使用sublime,现配置成想用的模式. 1 ...

  4. numpy ndarray可用的常规函数

    该部分位于numpy - ref - 1.14.5中的2.8 available ufuncs 1 数学运算 1.1 元素级加法 add 加法规则: numpy.add(x1, x2, /, out= ...

  5. mysql主从复制配置问题

    一,基本步骤 1,创建在主从数据上都创建复制账号,权限选上super, replication slave , replication master(选上这个可以方便从库变成主库): 2,配置主库和备 ...

  6. mac 上运行cassandra出现的java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: : : unknown error错误解决方法

    mac 上运行cassandra出现的java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostExce ...

  7. 解决WIN32窗口不响应WM_LBUTTONDBLCLK消息

    原文链接: http://www.cnblogs.com/xukaixiang/archive/2012/05/27/2520059.html 今天在做一个软件时,发现win32创建的窗体不能响应WM ...

  8. jQuery $.ajax 参数说明及调用注意事项

    $.ajax参数设置 备注:data.contentType.dataType属性值很重要!!! async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同 ...

  9. C++中的#和##运算符

    #和##运算符 #:构串操作符 构串操作符#只能修饰带参数的宏的形参,它将实参的字符序列(而不是实参代表的值)转换成字符串常量 #define STRING(x) #x#x#x #define TEX ...

  10. [转]Class.forName()的作用与使用总结

    1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类 ...