前面写的都是通过MFC来进行编程,讲到缓冲机制就结束了,由于要进行3D开发,老师又开始介绍不适用MFC,直接通过windows的api来编程。、
还是从最简单的开始,创建一个窗口。
基本步骤:
1:
实例化一个窗口结构体对象,设置参数值。
可通过WNDCLASSEX或者WNDCLASS来创建,WNDCLASSEX是WNDCLASS的超级,多了两个参数,一个是结构体的大小,一个是小图标。
WNDCLASSEX的结构如下:
typedef struct
{
UINT cbSize; //本结构大小
UINT style; //窗口样式,
WNDPROC lpfnWndProc; //回调函数
int cbClsExtra; //类附加信息
int cbWndExtra; //窗口附加信息
HANDLE hInstance; //应用程序实例
HICON hICON; //主图标
HCUSOR hCursor; //窗口中的光标样式
HBRUSH hbrBackground; //窗口的背景填充样式
LPCTSTR lpszMenuName; //主菜单名
LPCTSTR lpszClassName; //本类类名
HICON hIconSm; //小图标
}WNDCLASSEX;
去除红色的两个属性就是WNDCLASS结构体的内容。
style 可选CS_HREDRAW:水平刷新 CS_VERDRAW:竖直刷新等等。
lpfnWndProc:指向事件句柄函数的指针,一般是回调函数,并且是自定义的。
cbClsExtra和cbWndExtra这两个参数一般不用,设置为0。
hInstance 用WinMain函数中的形参就可以
2:
注册该窗口
注册函数:RegisterClassEx(WNDCLASSEX *);
3:
创建定义的窗口CreateWindowEx
CreateWindowEx()函数原型
HWND CreateWindowEx
(
DWORD dwExStyle, //窗口的样式一般设为NULL
LPCTSTR lpClassName, //前面定义的窗口类名
LPCTSTR lpWindowName, //窗口标题名
DWORD dwStyle, //外观行为的通用标志
intx,inty, //窗口左上角在屏幕中的位置
int nWidth, int nHeith, //窗口的大小
HWND hWndParent,//父窗口的句柄,如果没设为NULL
HMENU hMenu, //菜单的句柄,如果没有设为NULL
HINSTANCE hInstance,//窗口实例,WinMain中的hinstance
LPVOID lpParam//高级特征
);
4:创建事件句柄
事件句柄就是当事件发生时Windows从主事件循环调用回调函数。
MyWinProc原型
LRESULT CALLBACK MyWinProc
(
HWND hwnd,//
UINT msg,//
WPARAM wparam,//
LPARAM lparam//
);
5:构建主事件循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
通过上面五个步骤就可以创建一个空窗口了。
实例代码如下:
#include<windows.h>
#include<windowsx.h>
LRESULT CALLBACK MyWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{/*
PAINTSTRUCT PS;
HDC hdc;*/
switch(msg)
{
case WM_CREATE:
break;
//case WM_PAINT:
// {
// hdc=BeginPaint(hwnd&ps);
// EndPaint(hwnd&ps);
// return 0;
// }
//break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return ::DefWindowProc(hwnd,msg,wparam,lparam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
//MessageBox(NULL,"THERE CAN BE ONLY ONE!!!","MY FIRST WINDOWS PROGRAM.",MB_OK|MB_ICONEXCLAMATION);
//MessageBeep(MB_OK);
WNDCLASSEX wcex=
{
sizeof(WNDCLASSEX),CS_HREDRAW|CS_VREDRAW,
MyWinProc,
0,
0,
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)GetStockObject(GRAY_BRUSH),
NULL,
"MyWndClass",
LoadIcon(NULL,IDI_APPLICATION)
};
RegisterClassEx(&wcex);
HWND hwnd;
hwnd=CreateWindowEx
(
NULL,
"MyWndClass",
"My First Window",
WS_OVERLAPPEDWINDOW,
50,
10,
800,
600,
NULL,
NULL,
hInstance,
NULL
);
if(!hwnd)
return 0;
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
有疑问请留言,有错误请指正,谢谢。