質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1651閲覧

Win32APIをC++で使用する場合LPSTR型変数に何を代入すればいいかがわからない

fue

総合スコア4

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/20 11:30

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2022/02/20 11:50 編集

(質問文に書かれていたのを見逃していたので伏せる)
guest

回答1

0

ベストアンサー

こんな感じで如何でしょうか?

C++

1 2void InitializeMenuItem(HMENU hmenu, const char* lpszItemName, int nId) 3{ 4 MENUITEMINFO mii; 5 6 char szItemName[256]; 7 strcpy( szItemName, lpszItemName ); 8 UINT cch = strlen(szItemName); 9 10 mii.cbSize = sizeof(MENUITEMINFO); 11 mii.fMask = MIIM_ID | MIIM_TYPE; 12 mii.fType = MFT_STRING; 13 mii.wID = nId; 14 //mii.dwTypeData = lpszItemName; 15 mii.dwTypeData = szItemName; 16 mii.cch = cch; 17 18 InsertMenuItem(hmenu, nId, FALSE, &mii); 19} 20

投稿2022/02/20 11:48

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fue

2022/02/20 12:09

ありがとうございます。行けました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問