您的位置:首页 > 其它

第一个窗口程序

2014-07-08 16:06 169 查看
今天是学习的第二天,这是windows程序设计一书中的第一个窗口程序,照着写了一下,加了一些注释

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, //WINAPI 相当于_stdcall  HINSTANCE 为程序实例句柄;
PSTR szCmdLine, int iCmdShow) //PSTR相当于 char*
{
static TCHAR szAppName[] = TEXT("HelloWin");
HWND         hwnd; //窗口句柄;
MSG          msg; //消息结构体;
WNDCLASS     wndclass; //窗口类结构体;

wndclass.style = CS_HREDRAW | CS_VREDRAW |CS_DROPSHADOW; //窗口类风格;
wndclass.lpfnWndProc = WndProc;//指向基于该窗口类的所有窗口过程的地址;
wndclass.cbClsExtra = 0; //预留的额外空间;
wndclass.cbWndExtra = 0; //预留的额外空间;
wndclass.hInstance = hInstance;//该程序的实例句柄,用来标识该程序;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);/*LoadIcon()函数用来获取预定义的图标的句柄,第一个参数用于标识自身程序,此次为预定义的故可用NULL,当使用自定义的时候必须用hInstance,
第二个参数用于标识该图标;*/
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //与LoadIcon()相似;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //GetStockObject()返回一个画刷的句柄 HBRUSH是画刷句柄类型;
wndclass.lpszMenuName = NULL; //指定窗口类的菜单;
wndclass.lpszClassName = szAppName; //窗口类名,允许任意定义;

RegisterClass(&wndclass); //注册窗口类,参数为指向窗口类的指针;

//创建窗口;
hwnd = CreateWindow(szAppName,         // window class name
TEXT("HelloWin"),  // window caption
WS_OVERLAPPEDWINDOW,   //窗口风格,overlapped为层叠窗口,即标准经典样式;
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);  //窗口显示,第一个参数为窗口句柄,第二个参数为WinMain()接收的iCmdShow值,决定窗口的初始显示状态,值由操作系统调用WinMain()时填入;
UpdateWindow(hwnd); //重绘窗口客户区,即绘制窗口区域;

//消息循环,用于从消息队列中获取从键盘或鼠标得到的消息 ;
while (GetMessage(&msg, NULL, 0, 0)) //将指向msg结构的指针传给windows,然后windows用从消息队列中得到的下一条消息来填充该结构体;
{
TranslateMessage(&msg); //将msg结构返回windows以进行一些键盘消息转换;
DispatchMessage(&msg); //将该消息发送给合适的窗口过程处理函数;
}
return msg.wParam; //用于返回调用曾;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /*CALLBACK 相当于_stdcall
返回值为LRESULT相当于LONG,四个参数与msg结构的前四个字段对应;
UINT 相当于unsigned int;
WPARAM在16位系统中为word型,但32位以后定义为UINT型
LPARAM为long型
*/
{
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); /*以此函数开始绘制 , 调用此函数使整个客户区有效,以便接下来开始绘制,返回的设备环境句柄用来指定区域;
ps结构体中包含一些用来对客户区绘制的信息*/;

GetClientRect(hwnd, &rect); //rect结构有四个值,其中left,top被赋为0,则right,bottom就表示客户区的高度和宽度;

DrawText(hdc, TEXT("Hello, Windows8!"), -1, &rect,   //绘制窗口,第三个参数为-1意思是文本字符串以0结尾;
DT_SINGLELINE | DT_CENTER | DT_VCENTER);        //限定文本的各项参数,单行,水平居中,垂直居中;

EndPaint(hwnd, &ps); //以此函数结束绘制;
return 0;

case WM_DESTROY:  //销毁窗口;
PostQuitMessage(0); /*将WM_QUIT消息插入到程序的消息队列中,使Getmessage()函数返回一个0值,从而退出消息循环;
返回的msg.wparam传给PostQuitMessaage()*/
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: