学习WindowsAPI

/*
Author:     Kongxiangzhen
Time:        2012/4/30
SysEnv:     VS2008
Function:  创建并显示一个简单的窗口【背景为黑色】
*/

#include <windows.h>
/*
在这儿推荐大家看下这个《开启--windows平台程序设计大门》
http://windows.chinaitlab.com/special/apiprog/Index.html
目录如下:
一、windows用户界面构件及思想
1.1、用户界面的构件
	1.1.1 窗口
	1.1.2 边框
	1.1.3 标题栏
	1.1.4 控制框
	1.1.5 最小化图标
	1.1.6 最大化图标
	1.1.7 垂直滚动条
	1.1.8 水平滚动条
	1.1.9 选单栏
	1.1.10 用户区
1.2、面向对象的思维方法

二、WINDOWS句柄和数据常量
1.3、句柄
1.4、数据类型及常量

三、Windows程序术语及窗口对象函数
1.5、应用程序使用的一些术语
	1.5.1 模块
	1.5.2 应用程序
	1.5.3任务和实例
	1.5.4 动态链接库
	1.5.5应用程序设计接口
	1.5.6 Windows下的函数
1.6、事件和消息
1.7、窗口对象
	1.7.1 窗口类
	1.7.2 创建窗口对象
	1.7.3 窗口函数

四、WINDOWS应用程序组织及实例
1.8、Windows应用程序的面向对象认识
1.9、Windows程序的组织


通过这个系列文章可以了解很多Windows编程的基础,比如事件和消息机制、Windows程序的基本组成模块等。

Windows本身由几个相关的模块组成,Windows API函数就是在Windows启动时装入内存中的几个动态链接库模块实现的。
其中的三个主要模块是USER.EXE(用于窗口管理等)、KERNEL.EXE(用于内存管理的多任务调度)和GDI.EXE(图形设备接口,用于图形输出等)。

windows中面向对象的程序设计的四个基本机制(类、对象、方法和消息)

*/

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/*
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define PASCAL      __stdcall
被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传),
函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。
*/


/*
我个人也是初学者,因此很多东西是按自己的理解写的,不对的地方还请大家批评指正。
感觉最难的地方在于看到这些成串的大写字母还有莫名其妙的类型会感到很头疼。
比如:查看WinDef.h
typedef UINT_PTR             WPARAM;   //Word Param
typedef LONG_PTR            LPARAM;   //Long Param
typedef LONG_PTR            LRESULT; 

typedef unsigned long       DWORD;
typedef int                         BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;

定义WORD、DWORD其实主要是为了:1)便于移植,2)更为严格的类型检查。 
WORD固定是2字节,DWORD固定是4字节。

大家又会疑问,这个_PTR又是什么东西?别着急,MSDN是一个万能的东西,不懂的都可以在上面查到。
The *_PTR types were added to the Windows API in order to support Win64's 64bit addressing.
就是说,新加进WinAPI来的*_PRT类型是为了支持和兼容64位寻址的,
举例来说, INT_PTR在32位系统下表示32bit的值,在64位系统下可表示64位的值。

Windows的API用了很多typedef,初开始看我感觉这些typedef把东西变得很复杂了,后来感觉这种命名方式其实增加了代码的可读性。
更重要的是,同样的东西之所以会有这么多的别名,完全是为了保证兼容性。比如保证同一段代码在32位系统和64系统编译分别生成相应的
32位可执行文件和64位可执行文件。

不要在一开始就指望搞清楚所有的这些东西,慢慢看就会有感觉的。希望跟大家一起进步。
*/

/*WinMain函数是Windows应用程序开始执行时的入口点,它的返回类型为int。WinMain函数的作用十分类似于MS-DOS中的C应用程序的main函数。*/
int PASCAL WinMain(
				   HINSTANCE hInstance,// 应用程序的实例句柄
				   HINSTANCE hPrevInstance,// 该应用程序前一个实例的句柄
				   LPSTR lpszCmdLine,// 命令行参数串
				   int nCmdShow)// 程序在初始化时如何显示窗口
{
     char szAppName[] = "Window";
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	/*
	结构类型WNDCLASS的说明为:

  typedef struct tagWNDCLASS {
     DWORD style;               // 窗口风格 
     WNDPROC *lpfnWndProc;     // 窗口函数 
     int cbClsExtra;                 // 类变量占用的存储空间
     int cbWndExtra;              // 实例变量占用的存储空间 
     HINSTANCE hinstance;       // 定义该类的应用程序实例的句柄 
     HICON hicon;            // 图标对象的句柄 
     HCURSOR hCursor;        // 光标对象的句柄 
     HBRUSH hbrBackground;     // 用于擦除用户区的刷子对象的句柄
     LPCSTR lpszMenuName;    // 标识选单对象的字符串 
     LPCSTR lpszClassName;        // 标识该类的名字的字符串 
  } WNDCLASS;
	*/
    if(! hPrevInstance)
	{
	// 该实例是程序的第一个实例,注册窗口类
	wndclass.style = CS_VREDRAW | CS_HREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;


	if(!RegisterClass(&wndclass))
		{
		return FALSE;
		}

	// 对每个实例,创建一个窗口对象
	hwnd = CreateWindow(//调用CreateWindow创建一个窗口对象
		szAppName,
		"Sample Program",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);

	ShowWindow(hwnd ,nCmdShow);//ShowWindow 函数的用途:显示或改变给定的窗口
	UpdateWindow(hwnd);
	/*
	UpdateWindow 函数
    用途:若应用程序的消息队列中存在WM_PAINT消息(绘制用户区消息),
	则该函数使Windows立即调用窗口函数,向其传递WM_PAINT。否则该函数不作为任何动作。
	*/
	while(GetMessage(&msg, NULL, 0, 0)){//GetMessage 函数的用途:从应用程序中的消息队列中检索一条消息
		TranslateMessage(&msg);
		DispatchMessage(&msg);// DispatchMessage 函数的用途:将消息发送到指定的窗口对象上(窗口函数被调用)。
		}
	return msg.wParam;
	}
}

/*
回调函数
一个窗口对象所接受到的消息的响应是由该对象的方法决定的,这些方法被定义在一个称为窗口函数的函数中。
*/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值