////// 一个典型的用C和Win32 API写的窗口程序// 该示例描述了一个Windows窗口的实现过程,是应用Windows API函数进行编程的入门教程//// on_road// 2006.01.03//
#include <windows.h> //windows.h文件中包含应用程序中所需的数据类型和数据结构的定义
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //窗口函数说明
//============================以下初始化窗口类=================================================
/// WinMain入口函数说明// WinMain函数是所有Windows应用程序的入口,类似C语言中的Main函数,其功能是完成一系列的定义// 和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。// WinMain函数实现以下功能:// 1、注册窗口类,建立窗口及执行其他必要的初始化工作。// 2、进入消息循环,根据从应用程序消息队列接收的消息,调用相应的处理过程。// 3、当消息循环检索到WM_QUIT消息时终止程序运行。// WinMain函数有三个基本的组成部分:函数说明、初始化(即窗口类定义、注册窗口类、创建窗口、显示窗口)和消息循环。/
int WINAPI WinMain(HINSTANCE hInstance, //应用程序当前实例句柄 HINSTANCE hPrevInstance, //应用程序其他实例句柄 LPSTR lpCmdLine, //指向程序命令行参数的指针 int nShowCmd) //应用程序开始执行时窗口显示方式的整数值标识
{ HWND hwnd; //定义的窗口句柄 MSG Msg; //定义的消息数据类型变量 WNDCLASS wndclass; //定义的窗口类 char lpszClassName[] = "window"; //窗口类名 char lpszTitle[] = "Hello World!"; //窗口标题名
//窗口类定义 wndclass.style = 0; //窗口类的样式,一般设置为0 wndclass.lpfnWndProc = WndProc; //指向窗口函数的指针(窗口处理函数为WndProc) wndclass.cbClsExtra = 0; //分配在窗口类结构后的字节数(窗口类无扩展) wndclass.cbWndExtra = 0; //分配在窗口实例后的字节数(窗口实例无扩展) wndclass.hInstance = hInstance; //定义窗口类的应用程序的实例句柄(当前实例句柄) wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口类的图标(窗口的最小化图标为默认图标) wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口类的光标(窗口采用箭头光标) wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //窗口类的背景刷(窗口背景为白色)
wndclass.lpszMenuName = NULL; //窗口类菜单资源名(窗口中无菜单 ) wndclass.lpszClassName = lpszClassName; //窗口类名(“window”)
//===========================注册窗口类=================================================== if(!RegisterClass(&wndclass)) //如果注册失败则发出警告声音 { MessageBeep(0); return FALSE; }
//===========================创建窗口======================================================= //并发出WM_CREATE消息 hwnd = CreateWindow(lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //创建窗口的样式 CW_USEDEFAULT, //窗口左上角横坐标 CW_USEDEFAULT, //窗口左上角纵坐标 CW_USEDEFAULT, //窗口宽度 CW_USEDEFAULT, //窗口高度 NULL, //该窗口的父窗口句柄 NULL, //窗口主菜单句柄 hInstance, //创建窗口的应用程序当前句柄 NULL); //指向一个传递给窗口的参数值的指针
//显示窗口 ShowWindow(hwnd, nShowCmd); //hwnd:窗口句柄;nShowCmd:窗口显示的状态 UpdateWindow(hwnd); //更新并绘制用户区,并发出PAINT消息 //=============================消息循环===================================================
// // GetMessage用于从消息队列中读取一条消息,并将消息放在一个MSG结构中,。 // 原型BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax) // LPMSG lpMsg:指向MSG结构的指针 // HWND hWnd:窗口句柄 // UINT wMsgFilterMin:用于消息过滤的最小消息号值 // UINT wMsgFilterMax:用于消息过滤的最大消息号值,如果两个过滤参数都为0,则不过滤消息。 // while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); //将消息的虚拟键转换为字符信息 DispatchMessage(&Msg); //将其参数指向的消息传送到指定窗口函数 }
return Msg.wParam; //消息循环结束即程序终止时将信息返回系统
}
//========================================窗口函数================================================
//// 窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接收到的消息的// 处理过程,是消息处理分支控制语句的集合。窗口函数是应用程序处理接收到的消息的函数,其中包含// 了应用程序对各种可能接收到的消息的处理过程。//
LRESULT CALLBACK WndProc(HWND hwnd, //窗口句柄 UINT message, //代表所处理消息的消息值 WPARAM wParam, //消息的附加参数 LPARAM lParam) //消息的附加参数{ switch(message) { case WM_DESTROY: PostQuitMessage(0); //调用PostQuitMessage发出WM_QUIT消息,请求退出 default: //DefWindowProc是系统默认的处理过程,以保证所有发送到该窗口的消息均得以处理 return DefWindowProc(hwnd, message, wParam, lParam); } return(0);}