作业1
步骤
编写WinMain函数
设计窗口类
注册窗口类
创建窗口
显示并更新窗口
编写消息循环
编写窗口过程函数
总结
整体源码
编写WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例
HINSTANCE hPrevInstance, //上一个应用程序实例,不用
LPSTR lpCmdLine, //命令行参数
int nCmdShow //窗口显示的样式, 最大化,最小化
{}
设计窗口类
WNDCLASS wc;
wc.cbClsExtra = 0; //类的附加信息,一般设置为0
wc.cbWndExtra = 0; //窗口附加信息,一般设置为0
wc.hbrBackground = CreateSolidBrush(RGB(255, 100, 100)); //背景色设置
wc.hCursor = LoadCursor(NULL, IDC_HAND); //加载系统默认光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //加载系统默认图标
wc.hInstance = hInstance; //传递给MyRegisterClass的hInstance参数值。主窗口需要知道正在使用的是哪个实例。
wc.lpfnWndProc = WinProc; //窗口过程函数名字,消息处理函数
wc.lpszClassName = TEXT("windows"); //类的名字
wc.lpszMenuName = TEXT("MENU"); //菜单名字
wc.style = CS_HREDRAW | CS_VREDRAW;; //显示风格
注册窗口类`
RegisterClass(&wc);
创建窗口
HWND hWnd = CreateWindow(TEXT("windows"), TEXT("窗口标题"),
WS_OVERLAPPEDWINDOW,//窗口风格
300, 300, 300, 300,//(x,y,width,height)位置及大小
NULL, NULL, hInstance, NULL);//父窗口的句柄、主菜单的句柄、应用程序实例句柄
显示并更新窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
编写消息循环
MSG msg;
//如果接受到WM_QUIT, 返回0, 退出; 如果出错,返回-1,不退出
while (GetMessage(&msg, NULL, 0, 0))//默认接受所有信息
{
//翻译
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
编写窗口过程函数
LRESULT CALLBACK WinProc(HWND hWnd, //窗口句柄,消息所属窗口
UINT uMsg, //消息标志
WPARAM wParam, //附加信息
LPARAM lParam
)
{
switch (uMsg) {
case WM_LBUTTONDOWN: //鼠标左键按下
MessageBox(hWnd, TEXT("哈哈哈哈哈哈哈"), TEXT("啊哈哈哈哈哈哈哈哈哈"), MB_OK);
break;
case WM_CLOSE: {//关闭窗口
if (IDYES == MessageBox(hWnd, TEXT("关闭窗口"),TEXT( "关闭窗口消息框标题"), MB_YESNO))
{
DestroyWindow(hWnd);
}
break;
}
case WM_DESTROY:
PostQuitMessage(0); //WM_QUIT, 给主函数返回 msg.wParam
break;
default:
/* 该函数对未被处理的消息提供默认响应 */
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
总结
整体源码
#include <windows.h>
#include "stdafx.h"
//窗口过程函数
LRESULT CALLBACK WinProc(HWND hWnd, //窗口句柄,消息所属窗口
UINT uMsg, //消息标志
WPARAM wParam, //附加信息
LPARAM lParam
)
{
switch (uMsg) {
case WM_LBUTTONDOWN: //鼠标左键按下
MessageBox(hWnd, TEXT("哈哈哈哈哈哈哈"), TEXT("啊哈哈哈哈哈哈哈哈"), MB_OK);
break;
case WM_CLOSE: {//关闭窗口
if (IDYES == MessageBox(hWnd, TEXT("关闭窗口"),TEXT( "关闭窗口消息框标题"), MB_YESNO))
{
DestroyWindow(hWnd);
}
break;
}
case WM_DESTROY:
PostQuitMessage(0); //WM_QUIT, 给主函数返回 msg.wParam
break;
default:
/* 该函数对未被处理的消息提供默认响应 */
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
//WINAPI: 修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
//1)定义WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例
HINSTANCE hPrevInstance, //上一个应用程序实例,不用
LPSTR lpCmdLine, //命令行参数
int nCmdShow //窗口显示的样式, 最大化,最小化
) {
//2)设计窗口类WNDCLASS(给成员变量赋值)
WNDCLASS wc;
wc.cbClsExtra = 0; //类的附加信息
wc.cbWndExtra = 0; //窗口附加信息
wc.hbrBackground = CreateSolidBrush(RGB(255, 100, 100)); //背景色
wc.hCursor = LoadCursor(NULL, IDC_HAND); //加载系统默认光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //加载系统默认图标
wc.hInstance = hInstance; //传递给MyRegisterClass的hInstance参数值。主窗口需要知道正在使用的是哪个实例。
wc.lpfnWndProc = WinProc; //窗口过程函数名字,消息处理函数
wc.lpszClassName = TEXT("windows"); //类的名字
wc.lpszMenuName = TEXT("MENU"); //菜单名字
wc.style = CS_HREDRAW | CS_VREDRAW;; //显示风格
//3)注册窗口类, 告诉系统窗口过程函数的入口地址
RegisterClass(&wc);
//4)创建窗口类
HWND hWnd = CreateWindow(TEXT("windows"), TEXT("窗口标题"),
WS_OVERLAPPEDWINDOW,//窗口风格
300, 300, 300, 300,//(x,y,width,height)位置及大小
NULL, NULL, hInstance, NULL);//父窗口的句柄、主菜单的句柄、应用程序实例句柄
//5)显示和更新窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
//6)消息循环
MSG msg;
//如果接受到WM_QUIT, 返回0, 退出; 如果出错,返回-1,不退出
while (GetMessage(&msg, NULL, 0, 0))
{
//翻译
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
return msg.wParam;
}