Windows API一日一练(20)LoadIcon和LoadCursor函数-程序图标设置和鼠标的样式

tech2024-08-01  51

主目录传送门

https://blog.csdn.net/zb774095236/article/details/108291755

本次学习的源码模板下载:

1.百度云:https://pan.baidu.com/s/1gCzgIJtWEBgGcIsUwRWPSA  提取码:f5dv

学习目标:

在上期的基础源码版本上学习之前用到的函数 哈哈 看看对话框的中鼠标的样子和程序的图标显示

 


学习内容:

一、 项目参考  

新增函数解释 LoadIcon LoadCursor

1. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadicona Microsoft官方函数文档

2. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadcursora Microsoft官方函数文档

2.https://docs.microsoft.com/en-us/windows/win32/menurc/using-cursors    官方例程

3. https://blog.csdn.net/caimouse/article/details/1722387   大牛的Win32系列

 

二. 在往期模板上修改和新增的步骤 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) { 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; 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句柄赋值就可 #if New_Add #define Cursor_IconTest_3 //想要调试那个自己改一下后面的参数 #if defined(Cursor_IconTest_1) wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/ wc.hCursor = LoadCursor(NULL, IDC_ARROW); /*加载鼠标,同上相似*/ #elif defined(Cursor_IconTest_2) wc.hIcon = LoadIcon(NULL, IDI_HAND); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/ wc.hCursor = LoadCursor(NULL, IDC_WAIT); /*加载鼠标,同上相似*/ #elif defined(Cursor_IconTest_3) wc.hIcon = LoadIcon(NULL, IDI_QUESTION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/ wc.hCursor = LoadCursor(NULL, IDC_UPARROW); /*加载鼠标,同上相似*/ #endif #endif 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/10hMvDNZjkfoHKlOlGJychQ 提取码:03wo

留在最后

      你可以通过查找宏 New_Add 来发现新增的代码段

最新回复(0)