windows SDK编程
/*****************************************************
我的第一个win32 HelloWorld程序!
******************************************************/
/*Win32应用程序框架主要由"初始化窗口类","窗口注册类","窗口的创建"以"窗口消息函数"等组成*/
#include <Windows.h>
//@funD
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); //窗口函数说明
/*
WinMain函数是所有windows应用程序的入口,类似于C语言中的Main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。
消息循环是整个程序运行的核心。WinMain函数实现以下功能。
1. 注册窗口类,建立窗口及执行其它必要的初始化工作;
2. 进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程
3. 当消息循环检索到WM_QUIT消息时终止程序运行。
WinMain函数有三个基本的组成部份:函数说明、初始化和消息循环。
WinMain函数的说明如下:
int WINAPI WinMain( //WinMain函数说明
HINSTANCE hInstance, //程序当前实例句柄
HINSTANCE hPrevInstance, //应用程序其它实例句柄
LPSTR lpCmdLine, //指向程序命令行参数的指针
int nCmdShow //应用程序开始执行时窗口显示方式的整数值标识
)
由于Window操作系统是多任务的操作系统,能进行多任务的管理,因此,windows应用程序可能被并行的多次执行,因而可能出现同一个程序的多个窗口同时存在的情况,Windows系统将应用程序每一次执行称为该应用程序的一个实例(Instance),并用一个实例句柄唯一的标识它。
*/
int WINAPI WinMain ( HINSTANCE hInstance, //WinMain函数说明
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow ) {
/*
建议采用Pascal的变量定义风格,即在程序(函数)开始处定义所有变量
虽然C++的变量定义比较灵活,本程序为了使程序易于理解,未采用这种方法
*/
char lpszClassName[] = "窗口"; //窗口类名
char lpszTitle[] = "Windows SDK编程之一 窗口示例程序"; //窗口标题名
//---------------窗口类定义-------------------------------------
/*
窗口类的定义
在Windows应用程序中,窗口害定义了窗口的形式与功能。窗口类定义通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包括窗口类的各种属性,在窗口类定义过程中常用到以下函数:
*/
WNDCLASS wndclass;
wndclass.style = 0; //窗口类型为缺省类型
wndclass.lpfnWndProc = WndProc; //窗口处理函数为WndProc
wndclass.cbClsExtra = 0; //窗口类无扩展
wndclass.cbWndExtra = 0; //窗口实例无扩展
wndclass.hInstance = hInstance; //当前实例句柄
wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ); //使用缺省图标
/*
LoadIcon():在应用程序中加载一个窗口图标
LoadIcon()函数原型为:
HICON LoadIcon(
HINSTANCE hInstance,//图标资源所在的模块句柄,为NULL则使用系统预定义图标
LPCTSTR lpIconName //图标资源名或系统预定义图标标识名
)
*/
wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ); //窗口采用箭头光标
/*
LoadCursor():在应用程序中加载一个窗口光标
LoadCursor()函数原型为:
HCURSOR LoadCursor(
HINSTANCE hInstance,//光标资源所在的模块句柄,为NULL则使用系统预定义光标
LPCTSTR lpCursorName //光标资源名或系统预定义光标标识名
)
*/
wndclass.hbrBackground = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ); //窗口背景为白色
/*
GetStockObject():获取已经定义的画笔、画刷、字体等对象的句柄
GetStockObject()函数原型为:
HGDIOBJ GetStockObject(int fnObject); //fnObject为对象的标识名
*/
wndclass.lpszMenuName = NULL; //窗口中无菜单
wndclass.lpszClassName = lpszClassName; //窗口类名为''''窗口实例''''
//------------------以下是进行窗口类的注册---------------------------
/*
注册窗口类
Windows系统本身提供部份预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由注册函数RegisterClass()实现。其形式为:
RegisterClass(&wndclass)
&wndclass为窗口类结构
RegisterClass函数的返回值为布尔值,注册成功则返回真
*/
if ( ! RegisterClass ( &wndclass ) ) { //注册窗口,若失败,则发出声音
MessageBeep ( 0 );
return FALSE;
}
/*
创建窗口实例
创建一个窗口类的实例由函数CreateWindow()实现,该函数的原型为:
HWND CreateWindow(LPCTSTR lpszClassName, //创建窗口,窗口类名
LPCTSTR lpszTitle, //窗口实例的标题名
DWORD dwStyle, //窗口的风格
int x, //窗口左上角坐标
int y, //窗口左上角坐标
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hwndParent, //此窗口父窗口
HWENU hMenu, //此窗口主菜单
HINSTANCE hInstance, //应用程序当前句柄
LPVOID lpParam); //指向一个传递给窗口的参数值的指针
*/
//创建窗口操作
HWND hwnd; //窗口结构
hwnd = CreateWindow ( lpszClassName, //创建窗口,窗口类名
lpszTitle, //窗口实例的标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐标为缺省值
CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高度和宽度为缺省值
NULL, //此窗口无父窗口
NULL, //此窗口无主菜单
hInstance, //应用程序当前句柄
NULL ); //不使用该值
ShowWindow ( hwnd, nCmdShow ); //显示窗口
UpdateWindow ( hwnd ); //绘制用户区
/*
消息循环
windows应用程序的运行以消息为核心。windows将产生的消息放入应用程序的消息队列中而应用程序WinMain函数的消息循环提取消息队列中的消息,并将其传递给窗口函数为相应处理过程处理。
MSG msg; //消息结构
while( GetMessage(&msg,NULL,0,0)) //消息循环
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
*/
MSG msg; //消息结构
/*GetMessage()作用:从消息队列中读取一条消息,并将消息放在一个MSG结构中:
BOOL GetMessage(
LPMSG lpMsg, //指向MSG结构的指针
HWND hWnd,
UINT wMsgFilterMin, //用于消息过滤的最小信息号值
UINT wMsgFilterMax //用于消息过滤的最大信息号值 如最小值和最大值均为0, 则不过滤消息
);
当GetMessage返回0时,即检索到WM_QUIT消息,程序将结束循环并退出
BOOL TranslateMessage( const MSG *lpMsg ); 负责把消息的虚拟键值转换为字符信息
LRESULT DispatchMessage( const MSG *lpmsg ); 将参数lpmsg指向的消息传递给指定的窗口
*/
while ( GetMessage ( &msg, NULL, 0, 0 ) ) { //消息循环
TranslateMessage ( &msg );
DispatchMessage ( &msg );
}
return msg.wParam; //程序终止时,将信息返回操作系统
}
//-----------------------------窗口函数---------------------------------------
/*
窗口消息处理函数定义了应用程序对接收到的不同消息的响应,它包含了应用程序对各种可用接收到的消息的处理过程,通常
,窗口函数由一个或多个switchcase语句组成,每一条case语句
对应一种消息,当应用程序接收到一个消息时,相应的case语句被 激活并执行相应的响应程序模块。
窗口函数的一般形式如下:
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case
.
break;
case WM_DESTROY:
//void PostQuitMessage(int nExitCode)函数的作用是向程序发送WM_QUIT消息,nExitCode应用程序退出代码
PostQuitMessage(0); //调用该函数发出WM_QUIT消息
default: //缺省消息处理函数,以保证所的发往窗口的消息都能被处理
return DefWindowProc(hwnd,message,wParam,lParam);
}
return (0);
}
*/
//@funS
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
switch ( message ) {
case WM_DESTROY:
PostQuitMessage ( 0 ); //调用该函数发出WM_QUIT消息
default: //缺省消息处理函数
return DefWindowProc ( hwnd, message, wParam, lParam );
}
return ( 0 );
}