Windows编程模型与API调用示例
Windows编程模型与API调用示例
Windows编程模型示意图:
打开VS2010,选择语言VC++,创建一个WIN32项目,例如叫DEMO。
打开DEMO.CPP文件,会看到VS已经帮我们写了几个函数(这几个函数其实是VS帮我们包了一层,原生函数后面会介绍):
注册窗体函数
ATOM MyRegisterClass(HINSTANCEhInstance);
初始化
BOOL InitInstance(HINSTANCE,int);
处理windows消息的函数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
注册窗口
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;窗口的风格
wcex.lpfnWndProc = WndProc;窗口消息处理函数的指针
wcex.cbClsExtra = 0;分配给窗口类结构之后的额外字节数
wcex.cbWndExtra = 0;分配给窗口实例之后的额外字节数
wcex.hInstance = hInstance;窗口所对应的应用程序句柄
wcex.hIcon =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CGAMEDEMO));窗口的坐标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);窗口的鼠标
wcex.hbrBackground = CreateSolidBrush(RGB(100,0,0)); 窗口的背景(这里调用了CreateSolidBrush API函数)
wcex.lpszMenuName = NULL,//MAKEINTRESOURCE(IDC_CGAMEDEMO);窗口的菜单资源名称
wcex.lpszClassName = szWindowClass;窗口类的名称
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);注册窗口
创建窗口
hWnd =CreateWindow(
szWindowClass,创建窗口所用的窗口类的名称
NULL,// szTitle, 窗口标题
WS_OVERLAPPEDWINDOW,窗口风格,定义为普通型
0,窗口位置的X坐标
0,窗口位置的Y坐标
1000,窗口的宽度
1000, 窗口的高度
NULL,父窗口句柄
NULL, 菜单句柄
hInstance,应用程序句柄
NULL);一般为NULL
显示窗口
if (!hWnd)
{
return FALSE;
}
告诉系统显示窗口
ShowWindow(hWnd, nCmdShow);
立即显示窗口
UpdateWindow(hWnd);
消息循环
// 主消息循环:
while (GetMessage(&msg, NULL, 0,0))
{
if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
消息处理函数以及API调用
/*
为了演示鼠标事件,在这里放了几个变量,存鼠标的坐标
*/
int a ,b;
char ac[25];
char bc[25];
char ret[50];
HWND hWnd,窗口句柄
UINT message,主消息
WPARAM wParam,副消息1(例如,如果主消息是键盘消息,这里存键值)
LPARAM lParam副消息2
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
intwmId, wmEvent;
PAINTSTRUCTps;
HDC hdc;
switch(message)
{
case WM_KEYDOWN:键盘消息
switch(wParam){从副消息中拿出键盘值
caseVK_SPACE:
MessageBox(hWnd,_T("按下了空格键"),_T("test"),MB_OK);
break;
}
break;
右键按下
caseWM_RBUTTONDOWN:
a= LOWORD(lParam);从副消息里面拿鼠标点击的X坐标
b= HIWORD(lParam);拿Y坐标
itoa(a,ac,10);
itoa(b,bc,10);
strcat(ret,ac);
strcat(ret,",");
strcat(ret,bc);
MessageBoxA(hWnd,ret,"test",MB_OK);
strcpy(ret,"");
break;
左键按下
caseWM_LBUTTONDOWN:
MessageBoxA(hwnd,
“按下了左键","test",MB_YESNO|MB_HELP|MB_ICONERROR);
break;
caseWM_COMMAND:菜单消息(因为用的VS,所以创建项目时候IDE给带了这个)
wmId = LOWORD(wParam);
wmEvent= HIWORD(wParam);
//分析菜单选择:
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd, message, wParam, lParam);
}
break;
caseWM_PAINT:
hdc= BeginPaint(hWnd, &ps);
//TODO: 在此添加任意绘图代码...
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:窗体销毁
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd, message, wParam, lParam);
}
return0;
}