MFC底层窗口的实现
代码:
# include <windows.h> //底层实现窗口的文件
//6.处理窗口过程 此过程可先跳过 是最后一步
LRESULT CALLBACK WindowProc(
HWND hwnd, //消息所属的窗口句柄
UINT uMsg, //具体消息名称 WM_XXXXX
WPARAM wParam, //键盘附加消息
LPARAM lParam) //鼠标附加消息
{
switch (uMsg) //判断具体的消息名称
{
//一下俩个case是相关联的,第一个处理后的结果交给第二个才能退出窗口
case WM_CLOSE:
DestroyWindow(hwnd);//DESTROYWIDON发送另一个消息 WM_DESTROY
case WM_DESTROY:
PostQuitMessage(0); //退出窗口
break;
case WM_LBUTTONDOWN:
{
int xpoint = LOWORD(lParam); //鼠标附加消息
int ypoint = HIWORD(lParam);
char buf[1024];
wsprintf(buf,TEXT("x=%d,y=%d"),xpoint,ypoint);
MessageBox(hwnd, TEXT("WINDOWS"), TEXT("鼠标按下"), MB_OK); //MessageBoxe的功能是实现一种小型窗口,以后我会有实例
}
}
//返回值用默认的处理方式
return DefWindowProc(hwnd, uMsg, wParam, lParam); //就是结构体的成员
};
//程序入口函数
//WINAPI 代表__stdcall 参数得到传递顺序,从右到左,依次入栈,并且在函数返回前清空栈
int WINAPI WinMain(
HINSTANCE hInstance, //应用程序句柄
HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用
LPSTR lpCmdLine, //char *argv[] ,可以不用管,我也是照搬的
int nShonwCmd) //显示命令,最大化,最小化,正常,可以利用MSDN软件查找nShonwCmd 里边有窗口的类型
{
//窗口实现的六个步骤
//1,设计窗口
//2。注册窗口
//3.创建窗口
//4.显示和更新
//5.通过循环取消息
//6.处理消息(窗口过程)
//1.设计窗口
WNDCLASS wc; //定义一个窗口类对象
//以下两个不需了解
wc.cbClsExtra = 0; //类的额外的内存
wc.cbWndExtra = 0; //窗口的额外的内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景,HBRUSH是一种画刷类型,把GetStockObject()返回值强制类型转化,其中GetStockObject参数多种多样,在MSDN中都可以找到
wc.hCursor = LoadIcon(NULL, IDI_HAND); //设置光标,如果第一个参数为NULL,代表使用系统提供的光标
wc.hInstance = hInstance; //应用程序实例句柄 ,传入WinMain中的形参即可
wc.lpfnWndProc=WindowProc; 回调函数 窗口过程
wc.lpszClassName = TEXT("WIN"); //指定窗口类名称
wc.lpszMenuName = NULL; //菜单名称
wc.style = 0; //0代表默认风格
//2.注册窗口
RegisterClass(&wc);
//3.创建窗口
//CreateWindow的九个参数的意义
/*
lpClassName, 类名
lpWindowName, 标题名
dwStyle, WS_OVERLAPPEDWINDOW 风格
x, y,\ 显示坐标 CW_USEDEFAULT 为默认值
nWidth, nHeight, //宽高 默认值
hWndParent, 父窗口 NULL
hMenu, 菜单NULL
hInstance, 实例句柄
lpParam 附加值,鼠标附加值
*/
//返回句柄类型
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
//4.显示和更新
ShowWindow(hwnd, SW_FORCEMINIMIZE);
UpdateWindow(hwnd);
//5.通过循环取消息
/*
HWND hwnd; 主窗口句柄
UINT message; 具体消息名称
WPARAM wParam; 键盘消息
LPARAM lParam; 鼠标消息
DWORD time; 消息产生时间
POINT pt; 鼠标附加消息 x,y 位置消息
*/
//MSG为一个结构体
MSG msg;
while (true) {
GetMessage的参数解释:
/*
_Out_ LPMSG lpMsg, 消息
_In_opt_ HWND hWnd, 捕获窗口 填NULL,代表捕获所有的窗口
_In_ UINT wMsgFilterMin, 最小和最大的过滤信息,一般填入0
_In_ UINT wMsgFilterMax); 填0代表捕获所有信息
*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE) {
break;
}
//翻译消息
TranslateMessage(&msg);
//不为false
//分发消息
DispatchMessage(&msg);
}
//6.处理消息 窗口过程,写在了开头
system("pause");
return 0;
}