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. iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch

    本文为转载文章 故事背景: 这两天,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术 ...

  2. java 获取当前日期和特殊日期格式转换

     1.获取当前日期: package com.infomorrow.dao; import java.sql.Timestamp; import java.util.Calendar; import ...

  3. protobuf3 iOS 接入 protobuf

    1.引入官方基础pod 谷歌将protobuf需要使用的基础类封装成了一个pod,因此可以直接安装该pod,不必再手工导入. 如下: pod "Protobuf", :git =& ...

  4. 什么是EPEL 及 Centos上安装EPEL

    RHEL以及他的衍生发行版如CentOS为了稳定,官方的rpm repository提供的rpm包为了服务器安全稳定更新往往是很滞后的,很多时候需要自己编译那太辛苦了,而EPEL恰恰可以解决这两方面的 ...

  5. stm32开发 - 远离 Keil uVision, 回到 Visual Studio

    学了8051单片机, 学了MSP430系列, 终于开始步入正轨, 开始学习 stm32(ARM Cortex-M3)系列微处理器~ 学51用Keil uVision开发环境, 提一下Keil uVis ...

  6. Oracle 12C -- 删除audit policy

    删除之前,必须将policy disable掉:然后再删除 SQL> noaudit policy audit_sysprvi_po01; SQL> drop audit policy a ...

  7. openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)

    openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...

  8. poj3041(最小顶点覆盖)

    链接:点击打开链接 题意:N*N的矩阵中有一些点代表陨石.每次仅仅能消灭一行或一列连,问须要多少次才干所有消灭 代码: #include <map> #include <queue& ...

  9. shell curl 下载图片并另存为(重命名)

    curl -o fuck.png http://img30.360buyimg.com/imgzone/jfs/t19711/232/1837927836/150222/e4cd87bb/5ad990 ...

  10. python appium 有道云笔记分享文章到qq

    有道云添加一个笔记,笔记的title为aff 使用appium 把这篇文章分享到qq,前提是android里面有登录qq Python代码 from appium import webdriver i ...