本次学习的源码模板下载:
1、 https://pan.baidu.com/s/1XqTLTQ2Noa72VgHeYQtUQw 提取码:6lzt
学习目标:
在上期的基础源码版本上学习一个新的函数
学习内容:
一、 项目参考
新增函数解释 DestroyWindow
1. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-destroywindow Microsoft官方函数文档
2.https://docs.microsoft.com/en-us/windows/win32/winmsg/using-windows 官方例程
二. 在往期模板上修改和新增的步骤
1.代码段
//库文件
#include "Windows.h"
#include "tchar.h"
#include "resource.h"
#define New_Add 0x01 //后续将采用宏定义的方式来标记新增代码段
HINSTANCE g_hInstance;
LRESULT CALLBACK ABOUTBOX_Proc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter
{
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
// Fall through.
case IDCANCEL:
EndDialog(hwnd, wParam);//结束对话框
return TRUE;
}
}
return FALSE;
}
LRESULT CALLBACK MainWndProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter
{
PAINTSTRUCT ps;
HDC hdc;
int wmId = (int)(wParam & 0xFFFF);//实验发现 wParam会有问题 这里做出来对应的修改
switch (uMsg)
{
#if New_Add
case WM_CLOSE:
// Create the message box. If the user clicks
// the Yes button, destroy the main window.
if (MessageBox(hwnd, _T("关闭窗口"), _T("测试"), MB_YESNOCANCEL) == IDYES)
DestroyWindow(hwnd);
else
return 0;
break;
#endif
case WM_COMMAND:
switch (wmId)
{
case ID_ABOUT:
MessageBox(hwnd, _T("ALT+?"), _T("你使用了快捷键"), MB_OK);
break;
case ID_EXIT:
//MessageBox(hwnd, _T("ALT+/"), _T("你使用了快捷键"), MB_OK);
#define DialogBoxTest_1 //想要调试那个自己改一下后面的参数
#if defined(DialogBoxTest_1)
if (DialogBox(g_hInstance,
MAKEINTRESOURCE(IDD_ABOUTBOX),
hwnd,
(DLGPROC)ABOUTBOX_Proc) == IDOK)
#elif defined(DialogBoxTest_2)
if (DialogBoxParam(g_hInstance,
MAKEINTRESOURCE(IDD_ABOUTBOX),
NULL, (DLGPROC)ABOUTBOX_Proc,
0) == IDOK)
#endif
{
MessageBox(hwnd, _T("确定"), _T("你使用了按钮"), MB_OK);
}
else
{
MessageBox(hwnd, _T("取消"), _T("你使用了按钮"), MB_OK);
}
break;
default:
break;
}
return 0;
case WM_CREATE:
// Initialize the window.
return 0;
case WM_PAINT:
// Paint the window's client area.
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 0, 0, _T("Hello, Windows!"), 15);
EndPaint(hwnd, &ps);
return 0;
case WM_SIZE:
// Set the size and position of the window.
return 0;
case WM_DESTROY:
// Clean up window-specific data objects.
PostQuitMessage(0);
return 0;
//
// Process other messages.
//
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);//系统的默认消息处理函数
}
return 0;
}
//定义WinMain的入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
//没有这些参数也不会发生警告
//UNREFERENCED_PARAMETER(hInstance);
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//UNREFERENCED_PARAMETER(nCmdShow);
HACCEL hAccelTable;
WNDCLASS wc; //创建窗口类对象
//对窗口类的各属性进行初始化
wc.style = CS_HREDRAW | CS_VREDRAW; /*窗口类的风格,CS前缀,C表示Class,S表示
Style,这里使用了水平和垂直风格*/
wc.lpfnWndProc = MainWndProc; /*这里将回到函数的名字赋值用以windows后面回调*/
wc.cbClsExtra = 0; //附加参数,通常情况下为0
wc.cbWndExtra = 0; //附加参数,通常情况下为0
wc.hInstance = hInstance; //窗口句柄,这里将WinMain中的hInstance句柄赋值就可
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/
wc.hCursor = LoadCursor(NULL, IDC_ARROW); /*加载鼠标,同上相似*/
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); /*窗口画刷,这里是使用的白色画刷,所以创建出来的窗口的背景颜色则是白色的*/
wc.lpszMenuName = _T("MainMenu"); //窗口菜单名称,这里没有菜单,设为NULL
wc.lpszClassName = _T("MainWindowClass"); //窗口类名称,这个窗口类名称可作为这个窗口的唯一标识
/*注册窗口类*/
if (!RegisterClass(&wc))
{
//注册窗口类失败时,弹出提示
MessageBox(NULL, TEXT("This program requires Window NT!"), _T("MainWindowClass"), MB_ICONERROR);
return FALSE;
}
/*创建窗口
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类名
LPCTSTR lpWindowName, //窗口标题
DWORD dwStyle, //窗口风格,WS开头
int x, //窗口左上角x坐标
int y, //窗口左上角y坐标
int nWidth, //窗口宽度
int nHeight, //窗口高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HANDLE hlnstance, //窗口句柄
LPVOID lpParam); //改值会传递给窗口WM_CREATE消息的一个参数
*/
HWND hwnd; //创建窗口函数CreateWindow()会返回一个HWND句柄,这里定义下,用来接收这个句柄
hwnd = CreateWindow(_T("MainWindowClass"), //窗口类名
TEXT(" Hello Win32API"), //窗口标题,会在窗口的左上角标题栏显示
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, //窗口风格
CW_USEDEFAULT, //窗口左上角x位置,这里使用的系统默认值,可自定义
CW_USEDEFAULT, //窗口左上角y位置
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //该窗口的父窗口或所有者窗口的句柄,这里用不到,设为NULL
NULL, //窗口菜单句柄,这里没有菜单,设置为NULL
hInstance, //窗口句柄
NULL //传递给窗口WM_CREATE消息的一个参数,这里不用,设置为NULL
);
/*显示窗口,显示方式使用WinMain的参数*/
ShowWindow(hwnd, nCmdShow);
/*更新窗口*/
UpdateWindow(hwnd);
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_TESTWIN));//自己定义的快捷键表
g_hInstance = hInstance;//得到全局窗口的句柄
MSG msg;
// 主消息循环:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))//用来处理快捷键
{
TranslateMessage(&msg);//把虚键消息翻译成字符消息(WM_CHAR)
//再把WM_CHAR消息放到消息队列中去
DispatchMessage(&msg);//指示操作系统把这条消息发到窗口
//过程MainWndProc 进行处理
}
}
return 0;
}
项目下载地址:
1.百度云:https://pan.baidu.com/s/1gCzgIJtWEBgGcIsUwRWPSA 提取码:f5dv
留在最后加班断了,加油奥力给