C++でWin32APIを使ってメニューを作成するinitialzeMenuItemという関数を作成しました。しかしC++では二重引用符で囲んだリテラルの型はconst char*になると思うのでLPSTRのようなchar*型のリテラルを代入しなければいけない変数に"ファイル"などを代入してしまうと型const char*の値をLPSTRのエンティティに代入できませんと出てきてしまいます。
C++で"ファイル"のような形で直接リテラルを代入するにはどうすればいいのでしょうか?コンパイラはVisual C++で文字セットの設定はマルチバイト文字セットを使用しています。
C++
#include <windows.h> #include <tchar.h> #define ID_FILE 10 #define ID_HELP 20 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void InitializeMenuItem(HMENU hmenu, const char* lpszItemName, int nId) { MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_STRING; mii.wID = nId; mii.dwTypeData = lpszItemName; InsertMenuItem(hmenu, nId, FALSE, &mii); } int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { TCHAR szAppName[] = TEXT("sample"); HWND hwnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hinst; wc.hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; wc.hIconSm = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); if (RegisterClassEx(&wc) == 0) return 0; hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL); if (hwnd == NULL) return 0; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { HMENU hmenu; hmenu = CreateMenu(); InitializeMenuItem(hmenu, "ファイル(&F)", ID_FILE); InitializeMenuItem(hmenu, "ヘルプ", ID_HELP); SetMenu(hwnd, hmenu); return 0; } case WM_COMMAND: { int nId = LOWORD(wParam); if (nId == ID_FILE) MessageBox(hwnd, TEXT("ファイルが選択されました。"), TEXT("OK"), MB_OK); else if (nId == ID_HELP) MessageBox(hwnd, TEXT("ヘルプが選択されました。"), TEXT("OK"), MB_OK); else ; return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
まだ回答がついていません
会員登録して回答してみよう