对于windows窗口编程的详细注解代码

来源:互联网 发布:项目数据库设计 编辑:程序博客网 时间:2024/05/18 03:09

代码来自windows程序设计,修改掉错误,加上详细注解 



#include <windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口过程函数声明
//LRESULT == long , WPARAM == unsigned int , LPARAM  == long, CALLBACK == __stdcall 
//被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的,函数调用在返回前要由被调用者清理堆栈  




int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprevInstance,PSTR szCmdLine,int iCmdShow)
// WINAPI == __stdcall ,HINSTANCE 用来标识程序实例句柄, , PSTR== char*
// 参数 1唯一标识此程序 2程序多个实例运行标识,32位下无用 为0  3运行程序的命令行  4窗口如何显示(初始值是SW_SHOWNORMOL)


{
static TCHAR ClassName[]=TEXT("HelloWin");//匈牙利命名法和unicode表示法  窗口类名字 
HWND  hwnd;  //窗口句柄
MSG   msg;   //消息 MSG为结构体
WNDCLASS wndclass; //窗口类函数参数  WNDCLASS 为结构体


//初始化wndclass


wndclass.style = CS_VREDRAW|CS_HREDRAW; // UNIT  两个参数保证水平和垂直被改变,窗口重新绘制
wndclass.lpfnWndProc=WndProc;//WNDPROC指向窗口函数的指针 这个语句将该窗口类的窗口过程设为WndProc函数
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0; // int  两个预留空间,可以设为字节数,本程序不用
wndclass.hInstance=hInstance;//HINSTANCE 表示程序的句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);// HICON  图标句柄(左上角)
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);// HCURSOR 鼠标句柄
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//HBRUSH 客户区背景色句柄
wndclass.lpszMenuName=NULL;//LPCSTR == char* 制定窗口类的菜单,本程序没有菜单所以为NULL
wndclass.lpszClassName=ClassName; //LPCSTR  窗口类名字


if(! RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Worry With ResgisterClass!"),TEXT("X"),MB_ICONERROR);
return 0;
}
//防止错误处理  函数ResgisterClass 用来注册窗口类




//创建窗口,窗口创建要有窗口类
hwnd=CreateWindow(ClassName,  //窗口类名字 同时像windows发送WM_CREATE,windows·调用窗口过程
 TEXT("First WINDOWS Program"),  //窗口标题
 WS_OVERLAPPEDWINDOW,    //窗口格式,此处为普通的层叠,几个标记按位或组成
 CW_USEDEFAULT,    //初始X坐标,CW_USEDEFAULT标识默认
 CW_USEDEFAULT,    //初始y坐标
 CW_USEDEFAULT,    //初始X方向尺寸
 CW_USEDEFAULT,   //初始y方向尺寸
 NULL,            //父窗口句柄  子窗口总在父窗口前面
 NULL,           //窗口菜单句柄 该窗口没有菜单
 hInstance,      //程序实例句柄
 NULL);          //创建参数




ShowWindow(hwnd,iCmdShow);//设置窗口句柄制定的窗口显示状态 第二个函数参数为窗口显示形式 SW_SHOWNORMAL  SW_SHOUWMAXIMIZED SW_SHOWMINNOACTIVE
UpdateWindow(hwnd);        //如果窗口是SW_SHOWNORMAL,通过向窗口过程发送WM_PAINT来绘制客户区

//循环消息,接收来自用户鼠标和键盘输入(即接收消息队列)
while(GetMessage(&msg,NULL,0,0)) //第一个参数保存消息队列传来的消息,第三四个暂不研究为0
//第二参数取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息
{
TranslateMessage(&msg); //将虚拟键消息转换为字符消息,后面再研究
DispatchMessage(&msg); //将消息传递给操作系统,然后操作系统去调用我们的回调函数
}
/*
typedef struct tagMSG
{
HWND  hwnd;    // 消息对应窗口的句柄
UINT  message; // 消息标识符 ,WM前缀  windowmessage
WPARAM wParam; // 32位的消息参数,具体消息
LPARAM lParam; // 32位的消息参数
DWORD  time;   //  进入队列的时间
PIONT  pt;     //  进入队列消息的鼠标位置  PIONT结构体对应有 LONG X  ;LONG Y;
}MSG,* PMSG;
*/
return msg.wParam;  //PostQuitMessage(0); 将一个WM_QUIT插入到队列中,将传递给函数的数值给msg.wParam,通常为0
}




//窗口过程处理函数
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC   hdc; //设备环境句柄,需要它在客户区显示文本和图形
PAINTSTRUCT ps; //PAINTSTRUCT包含一些窗口过程用来对客户区绘制的信息
RECT   rect;//RECT结构体包括LONG left,right,top,bottom,  left和top总是0,right和bottom来以像素为单位标识客户区的高度和宽度


switch(message)
{
case WM_CREATE:
PlaySound(TEXT("123.wav"),NULL,SND_FILENAME|SND_ASYNC);
//SND_FILENAME|SND_ASYNC制定第一个参数为文件名且异步方式播放
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);//用窗口类的背景色涂刷背景,使整个客户区有效,返回设备环境句柄
GetClientRect(hwnd,&rect);//设置窗口客户区高宽度
DrawText(hdc,TEXT("Hello,Windwos!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);//第三个参数设为-1,标记绘制的文本字符串以0结尾
//第四个参数表示文本位置 DT_CENTER:指定文本水平居中显示 | DT_VCENTER:指定文本垂直居中显示 | DT_SINGLELINE:单行显示文本
EndPaint(hwnd,&ps);//结束绘制
return 0;
case WM_DESTROY:
PostQuitMessage(0); //将一个WM_QUIT插入到队列中,将传递给函数的数值给msg.wParam,通常为0
return 0;
}
//其他消息默认处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}

0 0