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. sqlite元数据

    sqlite数据库每个文件都是一个database,因此同一个文件内部不再划分database.sqlite没有提供像mysql那样的show tables;和desc 表名类似的语句.许多数据库的元 ...

  2. 数组问题常用的O(N)算法:单调队列

    求max(a)<min(b)的区间个数 给定两个长度都为N的整型数组a[N]和b[N],求满足如下条件的闭区间个数:在区间[l,r]上,a中的任意元素都比b中的任意元素小. 这个问题是O(N)复 ...

  3. STAF进行分布式脚本分发----实践篇

    该博文理论支持文章:http://www.cnblogs.com/zhangfei/p/3169139.html 一.准备条件 1.安装STAF.由于其官网被墙了,所以大家可进入WAT群的网盘里去下载 ...

  4. struct2 拦截所有没有登录的用户,强行转到登录界面AuthorizationInterceptor

    package com.sise.action; import java.util.Map; import com.opensymphony.xwork2.Action; import com.ope ...

  5. Windows 重装系统-用户转移User和Program Files 文件夹

    原文地址:https://blog.csdn.net/sinat_38799924/article/details/74059037 重装系统时为了让系统数据保持可用我们需要做一些备份处理.比如用户数 ...

  6. Spring MVC @PathVariable被截断

    一.问题描述 一个控制器提供RESTful访问信息: @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + &qu ...

  7. Jquery常用开发插件收集

    2013年7月4日11:11:23 因为在做上传的时候,表单异步提交的时候 input 的 type等于file时候,异步提交不上去 所以使用 jquery.form.js  辅助一下 学习地址: h ...

  8. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

  9. SQL 给字符串补0

    第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数,例如这里是5,所以有5个0 @count就是被格式化 ...

  10. django 模板语言入门详解

    django 模板语言所解决的问题域: 1.动态生成html文件 2.是上这个模板语言用可用于生成任何形式的文本文件 从一个不用模板语言生成html的例子看模板语言的优点: 假设我要生成一个 “hel ...