Windows程序设计第三章总结

6 篇文章 0 订阅
</pre><p><pre name="code" class="cpp">#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//程序中没有调用WndProc的程序代码,在WinMain中有对WndProc的参考,而这就是该函数要在程序开头附近定义
//的原因。


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
	static TCHAR szAppName[] = TEXT("HelloWin");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	//LoadIcon载入图示供程序使用
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	//LoadCursor载入鼠标游标供程序使用
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	//取得一个图形物件(这个例子中,是取得绘制视窗背景的画刷物件)
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	if (!RegisterClass(&wndclass)){
		//RegisterClass为程序视窗注册视窗类别
		MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName
		, MB_ICONERROR);
		//MessageBox显示消息方块
		return 0;
	}
	//CreateWindow根据视窗类别建立一个视窗
	hwnd = CreateWindow(szAppName,		//window class name
		TEXT("The hello program"),		//window caption
		WS_OVERLAPPEDWINDOW,			//window style
		CW_USEDEFAULT,					//initial x position
		CW_USEDEFAULT,					//initial y position
		CW_USEDEFAULT,					//initial x size
		CW_USEDEFAULT,					//initial y size
		NULL,							//parent window handle
		NULL,							//window menu handle
		hInstance,						//program instance handle
		NULL);							//creation parameters
	ShowWindow(hwnd, iCmdShow);
	//在屏幕上显示视窗
	UpdateWindow(hwnd);
	//指示视窗自我更新
	while (GetMessage(&msg, NULL, 0, 0)){
		//从消息贮列中取得消息
		TranslateMessage(&msg);
		//转译某些键盘消息
		DispatchMessage(&msg);
		//将消息发送给视窗消息处理程序
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	switch(message){
	case WM_CREATE:
		PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
		//播放一个音效档案
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		//开始绘制视窗
		GetClientRect(hwnd, &rect);
		//取得视窗显示区域的大小
		DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER
			| DT_VCENTER);
		//显示字串
		EndPaint(hwnd, &ps);
		//结束绘制视窗
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		//在消息储列中插入一个退出程序消息
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
	//执行内定的消息处理
}

/*
CS-ClientStyle 视窗类别样式
CW-CreateWindow 建立视窗
DT-DrawText 绘制文字
IDI-ImageID 图示ID
IDC 游标ID
MB-MessageBox 消息方块
SND-sound 声音
WM-WindowMessage 视窗消息
WS-WindowStyle 视窗样式

MSG 消息结构
WNDCLASS 视窗类别结构
PAINTSTRUCT 绘图结构
RECT 矩形结构

HINSTANCE 执行实体代号(句柄)
HWND 视窗代号(句柄)
HDC 装置内容代号(句柄)


代号(句柄)是一个整数,它代表一个物件。Windows中的代号类似传统C程序设计中档案代号、程序几乎总是通过
调用Windows函数取得代号(句柄)。程序在其他Windows函数中使用这个代号,以使用它代表的物件。

在为程序建立视窗之前,必须首先调用RegisterClass注册一个视窗类别。该函数只需要一个参数,即一个指向类型为WNDCLASS的结构指针。
typedef struct tagWNDCLASSW{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackgroud;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
}
WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;

视窗消息处理程序定义如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
程序通常不直接调用视窗消息处理程序,视窗消息处理程序通常由Windows本身调用。通过调用SendMessage函数,
程序能够直接调用它自己的视窗消息处理程序。

消息回圈
在发生输入事件之后,Windows将事件转换为一个消息,并将消息放入程序的消息贮列中。
消息回圈以GetMessage调用开始,它从消息贮列中取出一个消息:
GetMessage(&msg, NULL, 0, 0)
这一调用传给Windows一个指标,指向名为msg的MSG结构、第二第三和第四个参数设定为NULL或者0,表示程序接收它自己建立的所有
视窗的所有消息。Windows用从消息贮列中取出的下一个消息来填充消息结构的各个栏位。

WINDOWS程序设计的难点
在WinMain只包含了注册视窗类别,建立视窗,从消息贮列中取出消息和发送消息所必须的程序代码。
程序的所有实际动作均在视窗消息处理程序中发生。Windows程序所做的一切,都是回应发送给视窗消息处理程序的消息。
视窗消息处理程序与视窗类别相关,视窗类别是程序调用RegisterClass注册的。根据该类别建立的视窗使用这个视窗消息处理
程序来处理视窗的所有消息。Windows通过调用视窗消息处理程序对视窗发送消息。
在第一次建立视窗时,Windows调用WndProc。在视窗关闭时,Windows也调用WndProc。视窗改变大小、移动或者变为图示时,从功能
表中选择某一项目等等,Windows都有调用WndProc。
所有这些WndProc调用都以消息的形式进行。
从程序外调用程序内的常式这一种做法,在传统程序设计中也有。但是在Windows中,这种概念扩展为包括一切事件。
视窗中发生的一切都以消息的形式传给视窗消息处理程序。然后,视窗消息处理程序以某种方式回应这个消息,或者将消息传给
DefWindowProc,进行内定处理。

贮列化的消息被发送给消息贮列,而非贮列化的消息则发送给视窗消息处理程序。任何情况下,视窗消息处理程序都将获得视窗所有的
消息--包括贮列化的和非贮列化的。视窗消息处理程序是视窗的消息中心。

视窗和消息
前两个程序使用了同一个函数MessageBox来向使用者输出文字。MessageBox函数会建立一个视窗。
在windows中,视窗一词有确切的含义,一个视窗就是屏幕上的一个矩形区域,它接收使用者的输入
并以文字或者图形的格式显示输出内容。
MessageBox函数建立一个视窗,但这只是哟个功能有限的特殊视窗。消息视窗有一个带关闭按钮的标题列、
一个选项图示,一行或者多行文字,以及最多四个按钮。
要显示图形或者添加功能表,必须建立自己的视窗。
使用CreateWindow函数
范例:你能够通过滑动鼠标拖动视窗的边框来改变视窗的大小,通常,程序将通过改变视窗中的内容来回应
这种大小的变化。可能猜测,是Windows本身而不是应用程序在处理与使用者重新调整视窗大小相关的全部程序。
优于应用程序能改变其显示的样子,所以它也知道视窗大小改变了。
理解Windows所使用的架构,当使用者改变视窗的大小时,Windows给程序发送一个消息指出新视窗的大小。然后程序
就可以调整视窗中的内容,以回应大小的变化。
Windows给程序发送消息。
所谓Windows给程序发送消息,是指Windows调用函数中的一个程序,该程序的参数描述了这个特定消息,
这种位于Windows程序中的程序程序视窗消息处理程序。
作业系统调用程序,这正是Windows物件导向架构的基础。
程序建立的每一个视窗都有相关的视窗消息处理程序。这个视窗消息处理程序是一个函数,既可以在程序中,
也可在动态链接程序库中。Windows通过调用视窗消息处理程序来给视窗发送消息。视窗消息处理程序根据
此消息进行处理,然后将控制传回给Windows
视窗通常是在视窗类别的基础上建立的。视窗类别标识了处理视窗消息的视窗消息处理程序。使用视窗类别使多个视窗
能够属于同一个视窗类别,并使用同一个视窗消息处理程序。
*/










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值