文章目录
一、界面开发三步走
①纯API进行窗口的[手动]创建+[手动]创建控件+[手动]响应消息;
②纯API进行对话框窗口的[半手动]创建+[自动]创建控件+[手动]响应消息;
③MFC窗口的[自动]创建+[自动]创建控件+[自动]响应消息;
备注。为保持程序的灵活性,以及让大家学到更多的东西,针对第③点我们只是界面部分用MFC,其余逻辑部分仍然用WinAPI进行开发。
二、纯API进行窗口的[手动]创建+[手动]创建控件+[手动]响应消息
1.Win32窗口程序的创建流程[手动]
第一步:注册窗口类,指定窗口类的名称与窗口回调函数
第二步:创建窗口,指定注册窗口类,窗口标题,窗口的大小
第三步:显示窗口
第四步:开始消息循环
第五步:窗口函数中处理窗口消息
代码如下:
#include <windows.h>
#include <tchar.h>
static TCHAR szWindowClass[] = _T("WindowClass"); //窗口类名
static TCHAR szTitle[] = _T("我的第一个程序"); //窗口标题
//第五步:窗口函数中处理窗口消息
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//消息处理函数.参数:窗口句柄,消息,消息参数,消息参数
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("大家好!"); //窗口内容
switch (uMsg)//处理所需的消息
{
case WM_CLOSE://窗口关闭的时候添加确认提示框,取消则不关闭窗口
{
int iRet = MessageBox(hWnd, _T("要关闭窗口吗?"), _T("Tip"), MB_OKCANCEL);
if (iRet == IDOK) return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
break;
case WM_SIZE://窗口被最大化的时候添加 MessageBox 提示框;
{
if (wParam == SIZE_MAXIMIZED)
{
MessageBox(hWnd, _T("窗口被最大化啦!"), _T("Tip"), MB_OK);}
}
break;
case WM_CREATE://窗口创建的时候添加提示框;
MessageBox(hWnd, _T("窗口被创建啦!"), _T("Tip"), MB_OK);
break;
case WM_PAINT://窗口绘制消息
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 5, 5, greeting, _tcslen(greeting));
EndPaint(hWnd, &ps);
break;
case WM_DESTROY://当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
PostQuitMessage(0);
break;
default://其他消息交给由系统提供的缺省处理函数
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
//应用程序主函数。参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式
{
//第一步:注册窗口类,指定窗口类的名称与窗口回调函数
WNDCLASSEX wcex = {
0 };//RegisterClassEx中的结构指针
wcex.cbSize = sizeof(WNDCLASSEX);//WNDCLASSEX 的大小
wcex.lpfnWndProc = WindowProc; //关联消息处理函数
wcex.lpszClassName = szWindowClass;//类名称
if (!RegisterClassEx(&wcex))
//RegisterClassEx注册窗口类,如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为FALSE
{
MessageBox(NULL, _T("注册窗口失败"), _T("Tip"), NULL);
return 1;
}
//第二步:创建窗口,指定注册窗口类,窗口标题,窗口的大小
HWND hWnd = CreateWindow( //创建一个重叠窗口
szWindowClass, //窗口类名
szTitle, //窗口标题,最开头定义过
WS_OVERLAPPEDWINDOW, //指定创建窗口的风格
CW_USEDEFAULT, CW_USEDEFAULT,//窗口初始位置
500, 300, //窗口初始宽、高
NULL, //指向被创建窗口的父窗口或所有者窗口的句柄
NULL, //菜单句柄,或依据窗口风格指明一个子窗口标识
hInstance, //与窗口相关联的模块实例的句柄。
NULL //指向一个值的指针,该值传递给窗口WM_CREATE消息。
);
if (!hWnd)//CreateWindow函数执行成功,返回新创建窗口的窗口句柄,函数执行失败返回NULL
{
MessageBox(NULL, _T("创建窗口失败!"), _T("Tip"), NULL);
return 1;
}
//第三步:显示窗口
ShowWindow(hWnd, nCmdShow);//窗口句柄,窗口激活方式
// 第四步:开始消息循环
MSG msg = {