字符串资源
添加字符串资源
添加字符串表,在表中增加字符串
字符串资源的使用
int LoadString(
HINSTANCE hInstance, //handle to resource module
UINT uID, //字符串ID
LPTSTR ipBuffer, //存放字符串BUFF
int nBufferMax //字符串BUFF长度
);成功返回字符串长度,失败
#include <windows.h>
#include "resource.h"
HINSTANCE g_hInstance = 0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam)
{
switch (msgID) {
case WM_SETCURSOR:
{
HCURSOR hCur = LoadCursor(g_hInstance, (char*)IDC_CURSOR2);
if (LOWORD(IParam) == HTCLIENT) {
SetCursor(hCur);
return 0;
}
else
{
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgID, wParam, IParam);
}
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)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(hIns,(char*)IDC_CURSOR1);
wc.hIcon = LoadIcon(hIns,(char*)IDI_ICON1);
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Main";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
char szTitele[256] = { 0 }; //!!
LoadString(hIns, IDS_WND, szTitele, 256);//!!
HWND hWnd = CreateWindowEx(0, "Main", szTitele, WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL
, hIns
, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
return 0;
}
加速建资源
添加 资源添加加速键表,增加命令ID对应的加速键
使用
加载加速键表
HACCEL LoadAccelerators(
HINSTANCE hInstance, //handle to module
LPCTSTR ipTableName //accelerator table name
);返回加速键表句柄
翻译加速键
int TranslateAccelerator(
HWND hWnd,//处理消息的窗口句柄
HACCEL hAccTable, //加速键表句柄
LPMSG ipMsg //消息
);如果是加速键,返回非零
探究原理
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,ID_NEW|||1,…);//ID_NEW是窗口菜单的ID
return 1;
}
}
在WM_COMMMAND中相应消息,消息参数
wPARAM : HIWORD 为1表示加速键,为0表示菜单。 //高两字节
LOWORD为命令ID。//低两字节
用于区分
IParam : 为0
#include <windows.h>
#include "resource.h"
HINSTANCE g_hInstance = 0;
void OnCommand(HWND hwnd, WPARAM wParam) {
switch (LOWORD(wParam))
{
case ID_NEW:
if (HIWORD(wParam) == 0)
MessageBox(hwnd, "新建菜单项被点击", "Infor", MB_OK);
else if (HIWORD(wParam) == 1)
MessageBox(hwnd, "CTRL+M被点击", "Infor", MB_OK);
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam)
{
switch (msgID) {
case WM_COMMAND://!!
OnCommand(hWnd, wParam);
break;
case WM_SETCURSOR:
{
HCURSOR hCur = LoadCursor(g_hInstance, (char*)IDC_CURSOR2);
if (LOWORD(IParam) == HTCLIENT) {
SetCursor(hCur);
return 0;
}
else
{
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgID, wParam, IParam);
}
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)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(hIns,(char*)IDC_CURSOR1);
wc.hIcon = LoadIcon(hIns,(char*)IDI_ICON1);
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Main";
wc.lpszMenuName = (CHAR*)IDR_MENU1;//!!!
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
char szTitele[256] = { 0 };
LoadString(hIns, IDS_WND, szTitele, 256);
HWND hWnd = CreateWindowEx(0, "Main", szTitele, 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)) {//!!
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
return 0;
}