LPARAM在LB或CB中输出chines字符
LPARAM outputs chines characters in the LB or CB
我正在开发我的第一个win32 GUI应用程序,我想向ListBox发送消息以添加文本,但文本在ListBox中显示为中文字符。组合框也发生了同样的事情这是代码:
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include "resource.h"
#define DEFAULT_BUTTON_WIDTH 100
#define DEFAULT_BUTTON_HEIGHT 20
HINSTANCE GlobalInstance;
HWND Window;
HWND bCreateWall;
HMENU Menu;
HMENU PopupMenu;
LRESULT CALLBACK MapDetailsDlgProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
switch (msg)
{
case WM_INITDIALOG:
{
SetDlgItemText (hWnd, IDC_MAP_DETAILS_NAME, L"Map Name");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_ADDSTRING,0, (LPARAM)"Erase Me");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_RESETCONTENT,0, 0);
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_ADDSTRING,0, (LPARAM)"Exit");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_ADDSTRING,0, (LPARAM)"Get Fragged");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_SETCURSEL,0, 1);
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_TYPE, CB_ADDSTRING,0, (LPARAM)"Erase Me");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_TYPE, CB_RESETCONTENT,0, 0);
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_TYPE, CB_ADDSTRING,0, (LPARAM)"Single Player");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_TYPE, CB_ADDSTRING,0, (LPARAM)"Multi Player");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_TYPE, CB_SETCURSEL,0, 1);
} break;
case WM_COMMAND:
{
if (wParam == IDOK)
{
long level_rule = SendDlgItemMessage (hWnd,IDC_MAP_DETAILS_LEVEL_RULES, LB_GETCURSEL, 0, 0);
long level_type = SendDlgItemMessage (hWnd,IDC_MAP_DETAILS_LEVEL_TYPE, CB_GETCURSEL, 0, 0);
char temp[500];
sprintf (temp, "Level Type: %irnLevel Rule: %irnOK Button!",level_type, level_rule);
MessageBox (hWnd, (LPCWSTR)temp, L"OK", MB_OK);
EndDialog (hWnd, 0);
}else if (wParam == IDCANCEL)
{
MessageBox (hWnd, L"Cancel Button!", L"Cancel", MB_OK);
EndDialog (hWnd, 0);
}
} break;
}
return (0);
}
void WMCommand(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (lParam == (LPARAM)bCreateWall) MessageBox (Window, L"You PressedbCreateWall", L"Congrats!", MB_OK);
else if (wParam == ID_FILE_EXIT) PostQuitMessage(0);
else if (wParam == ID_DRAWING_WIREFRAME)
{
CheckMenuItem (Menu, ID_DRAWING_WIREFRAME, MF_CHECKED);
CheckMenuItem (Menu, ID_DRAWING_SOLID, MF_UNCHECKED);
}
else if (wParam == ID_DRAWING_SOLID)
{
CheckMenuItem (Menu, ID_DRAWING_SOLID, MF_CHECKED);
CheckMenuItem (Menu, ID_DRAWING_WIREFRAME, MF_UNCHECKED);
}
else if (wParam == ID_MAP_DETAILS) DialogBox (GlobalInstance,MAKEINTRESOURCE(IDD_MAP_DETAILS), NULL, (DLGPROC)MapDetailsDlgProc);
else if (wParam == ID_POPUP_MOVE) MessageBox (Window, L"Move", L"Click", MB_OK);
else if (wParam == ID_POPUP_DELETE) MessageBox (Window, L"Delete", L"Click",MB_OK);
else if (wParam == ID_POPUP_TEXTURE) MessageBox (Window, L"Texture", L"Click",MB_OK);
else if (wParam == ID_POPUP_DUPLICATE) MessageBox (Window, L"Duplicate",L"Click", MB_OK);
}
void DisplayPopupMenu(long x, long y)
{
HMENU temp = GetSubMenu(PopupMenu, 0);
TrackPopupMenu(temp, TPM_LEFTALIGN|TPM_RIGHTBUTTON, x, y, 0, Window, NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: PostQuitMessage(0); break;
case WM_COMMAND: WMCommand (hWnd, msg, wParam, lParam); break;
case WM_RBUTTONUP: DisplayPopupMenu(LOWORD(lParam), HIWORD(lParam)); break;
}
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString,int CmdShow)
{
GlobalInstance = hInstance;
WNDCLASS wc;
MSG msg;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = L"ME";
wc.lpszMenuName = NULL;
wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass(&wc))
{
MessageBox (NULL,L"Error: Cannot Register Class",L"ERROR!", MB_OK);
return (0);
}
Window = CreateWindow(L"ME", L"Map Editor", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, 640, 480, NULL, NULL, hInstance, NULL);
if (Window == NULL)
{
MessageBox (NULL,L"Error: Failed to Create Window", L"ERROR!", MB_OK);
return (0);
}
bCreateWall = CreateWindow(L"BUTTON", L"Create Wall", WS_CHILD | WS_VISIBLE,0, 100, DEFAULT_BUTTON_WIDTH, DEFAULT_BUTTON_HEIGHT, Window,NULL, hInstance, NULL);
Menu = LoadMenu (hInstance, MAKEINTRESOURCE(IDR_MENU));
SetMenu (Window, Menu);
PopupMenu = LoadMenu (hInstance, MAKEINTRESOURCE(IDR_POPUP_MENU));
while (1)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage (&msg);
}
}
return (1);
}
我认为问题出在(lparam)上
我该如何解决这个问题????
在我看来,您使用的是Unicode API,因此您必须使用L""
语法传递UTF-16字符串:
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_ADDSTRING,0, (LPARAM) L"Erase Me");
SendDlgItemMessage (hWnd, IDC_MAP_DETAILS_LEVEL_RULES, LB_ADDSTRING,0, (LPARAM) L"Exit");
上也是如此
这是我通过艰苦的方式学到的东西:Unicode字符串(LB_ADDSTRING消息的LPARAM)必须位于双字边界上。
如果要从未对齐的变量添加,请先将其复制到缓冲区。
有两天我再也回不来了。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- LPARAM在LB或CB中输出chines字符