图标资源
添加资源
注意图标的大小,一个图标文件中可以有多个不同大小的图标。
加载图标:
HICON LoadIcon(
HINSTANCE hInstance
LPCTSTR lpIconName
);
设置图标:注册窗口类时。
光标资源:
添加光标资源:每个光标有HotSpot;
加载资源:
HCURSOR LoadCursor(
HINSTANCE hInstance,
LPCTSTR lpCursorName
); hInstance 可以为NULL,获取系统默认Cursor
设置资源:
在注册窗口时设置光标,使用SetCursor设置光标。
HCURSOR SetCursor(HCURSOR hCursor);
WM_SETCURSOR消息
wParam:当前使用的光标句柄
LPARAM:LOWORD:当前区域的代码HTCLIENT(客户区)/HTCAPTION(标题栏)...
HIWORD: 当前鼠标消息ID
字符串资源
添加字符串表,在表中增加字符串
字符串资源的使用
int LoadSting(
HINSTANCE hInstance,
UINT uIN, //字符串ID
LPTSTR lpBuffer,//接收你想得到的这个字符串的缓冲区
int nBufferMax//缓冲区大小
);成功返回字符串长度,失败返回0.
加速键资源:
添加:添加加速键表,增加命令ID对应的加速键
使用:
加载加速键表:
HACCEL LoadAccelerators(
HINSTANCE hInstance,
LPCTSTR lpTableName
);返回加速键表句柄
翻译加速键
int TranslateAccelerator(
HWND hWnd,
HACCEL hAccTable,加速键表句柄
LPMSG lpMsg//消息
);如果是加速键,返回非零。
TranslateAccelerator伪代码:
TranslateAccelerator(hWnd, hAccel, &nMsg) {
if (nMsg.message != WM_KEYDOWN)
return 0;
根据nMsg.wParam(键码值), 获知哪些按键被按下(例如ctrl + M)
拿着(ctrl + M)到hAccel(加速键表) 中去匹配查找
if(没找到) return 0;
if (找到) {
SendMessage(hWnd, WM_COMMAND, wParam(低两个字节是加速键ID, 高字是1),lParam没用);
return 非零;
}
}
加速键和菜单都可以发命令,发WM_COMMAND消息,WM_COMMAND消息的wParam的HIWORD如果是1表示来自加速键,0表示来自菜单项
LOWORD是命令ID。
#include <windows.h>
#include "resource.h"
#include "resource1.h"
HINSTANCE g_hInstance;
//窗口处理函数(自定义,处理消息)
void OnCommand(HWND hWnd, WPARAM wParam) {
switch (LOWORD(wParam)) {
case ID_NEW:
/*if (HIWORD(wParam) == 0) MessageBox(hWnd, "新建菜单项被点击", "Infor", MB_OK);
else
MessageBox(hWnd, "ctrl + M被点击", "infor", MB_OK);*/
MessageBox(hWnd, "新建命令已执行", "通知", MB_OK);
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
switch (msgId) {
case WM_COMMAND:
OnCommand(hWnd, wParam);
break;
case WM_SETCURSOR:
{
HCURSOR hCur = LoadCursor(g_hInstance, (char*)IDC_CURSOR2);
if (LOWORD(lParam) == HTCLIENT) {
SetCursor(hCur);
return 0;
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgId, wParam, lParam);
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
g_hInstance = hIns;
//注册窗口类
WNDCLASS wc = { 0 };
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = NULL;//LoadCursor(hIns, (char*)IDC_CURSOR1);
wc.hIcon = LoadIcon(hIns, (char*)IDI_ICON1);
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
TCHAR name[] = TEXT("Main");
wc.lpszClassName = name;
wc.lpszMenuName = (char*)IDR_MENU1;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
//在内存中创建窗口
char szTitle[256] = { 0 };
LoadString(hIns, IDS_WND, szTitle, 256);
HWND hWnd = CreateWindow(name, TEXT(szTitle), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
HACCEL hAccel = LoadAccelerators(hIns, (char*)IDR_ACCELERATOR1);
//消息循环
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
if (TranslateAccelerator(hWnd, hAccel, &nMsg)) continue;
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
}
return 0;
}