C++でWin32APIを使ってメニューを作成するinitialzeMenuItemという関数を作成しました。しかしC++では二重引用符で囲んだリテラルの型はconst char*になると思うのでLPSTRのようなchar*型のリテラルを代入しなければいけない変数に"ファイル"などを代入してしまうと型const char*の値をLPSTRのエンティティに代入できませんと出てきてしまいます。
C++で"ファイル"のような形で直接リテラルを代入するにはどうすればいいのでしょうか?コンパイラはVisual C++で文字セットの設定はマルチバイト文字セットを使用しています。
C++
1#include <windows.h> 2#include <tchar.h> 3 4#define ID_FILE 10 5#define ID_HELP 20 6 7LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 8 9 10void InitializeMenuItem(HMENU hmenu, const char* lpszItemName, int nId) 11{ 12 MENUITEMINFO mii; 13 14 mii.cbSize = sizeof(MENUITEMINFO); 15 mii.fMask = MIIM_ID | MIIM_TYPE; 16 mii.fType = MFT_STRING; 17 mii.wID = nId; 18 mii.dwTypeData = lpszItemName; 19 20 InsertMenuItem(hmenu, nId, FALSE, &mii); 21} 22 23int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) 24{ 25 TCHAR szAppName[] = TEXT("sample"); 26 HWND hwnd; 27 MSG msg; 28 WNDCLASSEX wc; 29 30 wc.cbSize = sizeof(WNDCLASSEX); 31 wc.style = 0; 32 wc.lpfnWndProc = WindowProc; 33 wc.cbClsExtra = 0; 34 wc.cbWndExtra = 0; 35 wc.hInstance = hinst; 36 wc.hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); 37 wc.hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED); 38 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 39 wc.lpszMenuName = NULL; 40 wc.lpszClassName = szAppName; 41 wc.hIconSm = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); 42 43 if (RegisterClassEx(&wc) == 0) 44 return 0; 45 46 hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL); 47 if (hwnd == NULL) 48 return 0; 49 50 ShowWindow(hwnd, nCmdShow); 51 UpdateWindow(hwnd); 52 53 while (GetMessage(&msg, NULL, 0, 0) > 0) { 54 TranslateMessage(&msg); 55 DispatchMessage(&msg); 56 } 57 58 return (int)msg.wParam; 59} 60 61LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 62{ 63 switch (uMsg) { 64 65 case WM_CREATE: { 66 HMENU hmenu; 67 68 hmenu = CreateMenu(); 69 70 InitializeMenuItem(hmenu, "ファイル(&F)", ID_FILE); 71 InitializeMenuItem(hmenu, "ヘルプ", ID_HELP); 72 73 SetMenu(hwnd, hmenu); 74 75 return 0; 76 } 77 78 case WM_COMMAND: { 79 int nId = LOWORD(wParam); 80 81 if (nId == ID_FILE) 82 MessageBox(hwnd, TEXT("ファイルが選択されました。"), TEXT("OK"), MB_OK); 83 else if (nId == ID_HELP) 84 MessageBox(hwnd, TEXT("ヘルプが選択されました。"), TEXT("OK"), MB_OK); 85 else 86 ; 87 88 return 0; 89 } 90 91 case WM_DESTROY: 92 PostQuitMessage(0); 93 return 0; 94 95 default: 96 break; 97 98 } 99 100 return DefWindowProc(hwnd, uMsg, wParam, lParam); 101}

回答1件
あなたの回答
tips
プレビュー