Windows编程-图形化框架
创建窗口
1 创建一个窗口类-WNDCLASS
typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
其中的第二个参数lpfnWndProc,和lpszClassName必须要有
WNDCLASS myclass = { 0 };
WCHAR lpszClassName[] = TEXT("Sm7");
myclass.lpszClassName = lpszClassName;
myclass.lpfnWndProc = NULL;
其他参数
HBRUSH参数表示背景的颜色,会自动填充,如果这个值没有就会让程序员自己在进行操作后进行背景的操作
HICON表示的是资源句柄,用来修改各种图标光标等资源
lpszMenuName表示菜单资源的名字,这里用来添加菜单资源
2 注册窗口类-RegisterClass
ATOM RegisterClass(
const WNDCLASS *lpWndClass
);
参数
参数表明的是自己创建的窗口类的指针
返回值
如果函数成功,则返回值是一个类原子,它唯一地标识正在注册的类。这个类原子只有由具体的Windows函数来操作
如果创建失败则返回值为0
3 创建窗口-CreateWindow
void CreateWindowW(
lpClassName,
lpWindowName,
dwStyle,
x,
y,
nWidth,
nHeight,
hWndParent,
hMenu,
hInstance,
lpParam
);
参数
第一个参数表示刚刚注册的窗口的类名
第二个参数表示窗口的名字
第三个参数表示窗口的风格,这个有很多的宏定义
第四个和第五个参数表示窗口的初始位置
第六个和第七个参数表示窗口的宽度和高度
第七个参数 hWndParent表示窗口的父窗口或所有者的句柄
第八个参数hMenu表示窗口的菜单的句柄
第九个参数hInstance表示WINMAIN函数的实例句柄
第十个参数lpParam 是用来调用回调函数的参数
WCHAR My_Window_Name[] = L"sm7的窗口";
LPCWSTR Point_My_Window_Name = My_Window_Name;
CreateWindowW(
lpszClassName,
Point_My_Window_Name,
WS_BORDER,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
100,
NULL,
NULL,
NULL,
NULL
);
返回值
如果成功则返回窗口的句柄
如果失败则返回NULL
4 显示窗口-ShowWindow
BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);
参数
第一个hWnd表示窗口句柄
第二个参数nCmdShow表示显示的风格
消息
windows系统是基于消息的操作系统
每个窗口都在处理消息,所有的操作都是有操作响应后的操作
产生消息的机制叫做消息循环,处理消息的窗口调用回调函数来处理消息
消息的产生
消息的分类
1 user主动产生的消息
2 Windows系统自己产生的消息
3 应用程序自己的消息
4 其他程序产生的消息
应用程序如何接受消息
windows有系统消息队列,每个GUI程序程序也都有自己的消息队列,系统消息队列负责将系统发给不同GUI程序的消息队列。应用程序获取本程序消息队列的信息,然后将消息发给消息处理函数来处理消息。
消息的API函数
GetMessage 从消息队列中取出1个消息
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
参数:
第一个lpMsg表示消息的结构体的指针,用的是一个MSG的结构体
第二个参数hWnd表示获取的消息的窗口的句柄,这个句柄必须属于当前线程
第三个和第四个参数表示获取的消息范围,第三个表示消息最低整数值,第四个表示最高整数值,如果都为0表示获取所有的消息。
DispatchMessage 将消息发送给消息处理函数
LRESULT DispatchMessage(
const MSG *lpMsg
);
消息处理函数
这里的函数就是你自己的类里面的lpfnWndProc函数,这个函数需要在类的时候就把参数传进去,消息处理函数有自己的格式
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
第一个参数表示的是窗口的句柄,
第二个参数表示要处理的消息的类型
第三和第四个参数表示附加消息,这个取决于uMsg参数的值
返回值:类型:LRESULT
返回值是消息处理的结果,并取决于发送的消息。
肯定不可能处理完所有的响应所以这里需要用到另一个API函数DefWindowProc来用系统的默认处理来未处理的消息
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
总结
Windows编程也就是在Windows下进行编程,编程分为GUI和CUI,GUI就是图形化编程,CUI就是命令行下编程。这次是GUI编程也就是Windows下图形化编程。Windows的GUI编程就是窗口化编程每一个可以看到的图形编程都是看为窗口
首先创建一个窗口,创建窗口的流程为:创建窗口类,注册窗口类,创建窗口,显示窗口。然后这个窗口需要配合着别的东西来处理,也就是配合Windows下的消息来处理。Windows系统有自己的消息处理队列,Windows系统会将属于该窗口的消息发给该窗口的消息队列,那么该窗口只需要针对自己的消息队列来处理消息。窗口对于消息来进行响应。
当窗口有消息时,消息先发给Windows操作系统,然后操作系统将消息分发给窗口,窗口再调用自己的响应函数去处理消息。
创建窗口,创建窗口响应
创建窗口类,注册窗口类,创建窗口,显示窗口,捕获窗口消息,消息响应
1 //总代码 2 #include<Windows.h> 3 #include<iostream> 4 5 LRESULT CALLBACK WindowProc( 6 HWND hwnd, 7 UINT uMsg, 8 WPARAM wParam, 9 LPARAM lParam 10 ) 11 { 12 switch (uMsg) 13 { 14 case WM_CREATE: 15 MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK); 16 break; 17 default: 18 break; 19 } 20 return DefWindowProc(hwnd,uMsg,wParam,lParam); 21 } 22 int WINAPI WinMain( 23 HINSTANCE hInstance, 24 HINSTANCE hPrevInstance, 25 LPSTR lpCmdLine, 26 int nShowCmd 27 ) 28 { 29 //1 创建一个窗口类 30 WNDCLASS myclass = { 0 }; 31 myclass.lpszClassName = L"sm7"; 32 myclass.lpfnWndProc = WindowProc; 33 34 //2注册窗口类 35 RegisterClass(&myclass); 36 37 //3创建窗口 38 HWND hMyWindow = CreateWindow( 39 myclass.lpszClassName, 40 L"sm7的窗口", 41 WS_BORDER, 42 CW_USEDEFAULT, 43 0, 44 CW_USEDEFAULT, 45 0, 46 NULL, 47 NULL, 48 hInstance, 49 NULL 50 ); 51 52 53 //4显示窗口 54 ShowWindow(hMyWindow, SW_SHOW); 55 56 //5获取消息 57 MSG message; 58 LPMSG MESSAGE = &message; 59 while (1) 60 { 61 GetMessage(MESSAGE,hMyWindow,0,0); 62 DispatchMessage(MESSAGE); 63 } 64 return 0; 65 }