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

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

新規登録して質問してみよう
ただいま回答率
85.47%
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

0回答

455閲覧

コンボボックスをクリックした後、ウィンドウがキーボードからの入力に応答しない。

1999kazu

総合スコア1

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/12/12 08:29

編集2022/12/12 08:37

前提

Visual c++を使ってデスクトップアプリケーションを作っています。
現時点での具体的な機能は、
・キーボードから入力したキーの値(1,2,3,4に限定)をテキストファイルに出力する。このとき、入力したキーをウィンドウ上に表示する。
・iniファイルから指定したキーの値を取得し、コンボボックスに詰めてウィンドウ上に表示する。
・ユーザーがコンボボックスからある項目を選択したらそのキーの値をiniファイルから読み込み、上記のテキストファイルにそのキーの値を書き込む。

質問

ウィンドウ上のコンボボックスをクリックした後、キーボードを押しても入力したキーがウィンドウ上に出力されません。
原因と解決策が知りたいです。
※コンボボックスをクリックするまでは問題なく入力キーを出力できます。

実現したいこと

・コンボボックスをクリックした後も問題なくキーの入力ができる。

発生している問題・エラーメッセージ

警告やエラーは出ていないです。

該当のソースコード

c++

1#include<windows.h> 2#include<stdio.h> 3#include<tchar.h> 4 5#include <commctrl.h> 6 7#include <iostream> 8#include <fstream> 9#include <sstream> 10#include <string> 11#include <iomanip> 12 13#include <stdlib.h> 14using namespace std; 15 16#pragma comment(lib,"Gdiplus.lib") 17#include <ole2.h> 18#include <gdiplus.h> 19using namespace Gdiplus; 20 21 22#define STRLEN 256 23 24LRESULT CALLBACK windowfunc(HWND, UINT, WPARAM, LPARAM); 25 26 27static const char TSize = 12; 28static const char THeight = TSize + 4; 29 30static const TCHAR szWinName[] = _T("Test"); 31HINSTANCE hInst; 32 33// ファイル操作用変数 34HANDLE hfile; 35bool file_open(); // ファイルオープンのための関数 36bool file_write(); // ファイルへ書き込むための関数 37 38// その他関数 39char DispNumber(short int); // 実験回数を保持するための関数 40bool ResultGrade(char); // 評価結果を保持するための関数 41bool ComboboxFunc(HWND, LPARAM); // iniファイルの読み込み 42 43// その他変数 44short int numberOfTimes; // 実験回数を保持する変数 45char char_grade[STRLEN]; // 評価結果の保存用変数 46char Result[STRLEN]; // 全評価結果を保持する変数 47short int IndexResult; // Result[]のインデックス番号 48short int i; // 評価結果保存用配列のインデックス番号 49 50// WM_COMMAND 51bool CommandFunc(HWND, WPARAM); // WM_COMMANDメッセージ内の処理 52bool LateIniFunc(HWND, WPARAM); // コンボボックスの項目が押された時の処理 53 54// テキストファイルへの書き込み用変数 55DWORD dwWriteSize; 56const char* IpBuffer; 57char latedata[STRLEN]; 58 59 60// コンボボックス用ID 61#define ID_LATEINI 10 62 63 64//WinMain関数 65int WINAPI WinMain(_In_ HINSTANCE hThisInst, _In_opt_ HINSTANCE hPrevInst, _In_ LPSTR lpszArgs, _In_ int nWinMode) 66{ 67 HWND hwnd; 68 MSG msg; 69 WNDCLASSEX wcl; 70 71 //ウィンドウクラスの定義 72 wcl.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX構造体のサイズ 73 wcl.style = 0; //ウィンドウクラススタイル 74 wcl.lpfnWndProc = windowfunc; //ウィンドウ関数 75 wcl.cbClsExtra = 0; //ウィンドウクラスのエキストラ 76 wcl.cbWndExtra = 0; //ウィンドウインスタンスのエキストラ 77 wcl.hInstance = hThisInst; //このプログラムのインスタンスへのハンドル 78 wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //アイコンへのハンドル 79 wcl.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルへのハンドル 80 wcl.hbrBackground = (HBRUSH)COLOR_WINDOW; //背景ブラシへのハンドル 81 wcl.lpszMenuName = NULL; //メニュー 82 wcl.lpszClassName = szWinName; //ウィンドウクラス名 83 wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //スモールアイコンへのハンドル 84 85 //ウィンドウクラスの登録 86 if (!RegisterClassEx(&wcl)) { 87 return(0); 88 } 89 90 //ウィンドウの生成 91 hwnd = CreateWindow( 92 szWinName, //ウィンドウクラス名 93 szWinName, //ウィンドウ名 94 WS_OVERLAPPEDWINDOW, //ウィンドウスタイル 95 CW_USEDEFAULT, //x座標 96 CW_USEDEFAULT, //y座標 97 CW_USEDEFAULT, //幅 98 CW_USEDEFAULT, //高さ 99 HWND_DESKTOP, //親ウィンドウへのハンドル 100 NULL, //メニューへのハンドル 101 hThisInst, //このプログラムのインスタンスへのハンドル 102 NULL //追加引数 103 ); 104 105 //ウィンドウの表示 106 ShowWindow(hwnd, nWinMode); 107 UpdateWindow(hwnd); 108 109 //インスタンスハンドルの保存 110 hInst = hThisInst; 111 112 113 //メッセージループの生成 114 while (GetMessage(&msg, NULL, 0, 0)) { 115 TranslateMessage(&msg); 116 DispatchMessage(&msg); 117 } 118 119 return((int)msg.wParam); 120} 121 122LRESULT CALLBACK windowfunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 123{ 124 HDC hdc; 125 PAINTSTRUCT ps; 126 short int Grade; 127 int id; 128 129 char tcRe[32]; 130 const char* str = "Please press 1 or 2 or 3 or 4..."; 131 const char* str_ = "(不可: 1, 可: 2, 良: 3, 優: 4)"; 132 const char* str1 = "--> 1 was pressed!"; 133 const char* str2 = "--> 2 was pressed!"; 134 const char* str3 = "--> 3 was pressed!"; 135 const char* str4 = "--> 4 was pressed!"; 136 137 switch (msg){ 138 case WM_CREATE: 139 // テキストファイルのオープン 140 file_open(); 141 // 変数の初期化 142 numberOfTimes = 0; 143 i = 0; 144 // iniファイルの値を読み取り、コンボボックスを作成 145 ComboboxFunc(hwnd, lparam); 146 break; 147 148 case WM_PAINT: 149 hdc = BeginPaint(hwnd, &ps); 150 TextOut(hdc, 0, 0, str, (int)strlen(str)); 151 TextOut(hdc, 0, 20, str_, (int)strlen(str_)); 152 EndPaint(hwnd, &ps); 153 break; 154 155 case WM_COMMAND: 156 // コンボボックスの項目が選択されたときの処理 157 CommandFunc(hwnd, wparam); 158 break; 159 160 161 case WM_CHAR: 162 switch (wparam) { 163 case VK_ESCAPE: 164 PostQuitMessage(0); 165 break; 166 167 case '1': 168 Grade = 1; 169 char_grade[i] = '1'; 170 i += 1; 171 hdc = GetDC(hwnd); 172 SetTextColor(hdc, RGB(30, 30, 30)); 173 TextOut(hdc, 10, 40, str1, lstrlen(str2)); 174 ReleaseDC(hwnd, hdc); 175 break; 176 177 case '2': 178 Grade = 2; 179 char_grade[i] = '2'; 180 i += 1; 181 hdc = GetDC(hwnd); 182 SetTextColor(hdc, RGB(30, 30, 30)); 183 TextOut(hdc, 10, 40, str2, lstrlen(str2)); 184 ReleaseDC(hwnd, hdc); 185 break; 186 187 case '3': 188 Grade = 3; 189 char_grade[i] = '3'; 190 i += 1; 191 hdc = GetDC(hwnd); 192 SetTextColor(hdc, RGB(30, 30, 30)); 193 TextOut(hdc, 10, 40, str3, lstrlen(str2)); 194 ReleaseDC(hwnd, hdc); 195 break; 196 197 case '4': 198 Grade = 4; 199 char_grade[i] = '4'; 200 i += 1; 201 hdc = GetDC(hwnd); 202 SetTextColor(hdc, RGB(30, 30, 30)); 203 TextOut(hdc, 10, 40, str4, lstrlen(str2)); 204 ReleaseDC(hwnd, hdc); 205 break; 206 207 208 209 default: 210 MessageBox(hwnd, "1, 2, 3, 4いずれかのキーを押してください。", NULL, MB_OK); 211 //hdc = GetDC(hwnd); 212 //wsprintf(tcRe, "%d", (int)wparam); 213 //SetTextColor(hdc, RGB(200, 200, 200)); //文字の色を設定 214 //SetBkColor(hdc, RGB(0, 0, 0)); //文字の背景色を設定 215 //TextOut(hdc, 10, 80, tcRe, lstrlen(tcRe)); 216 //ReleaseDC(hwnd, hdc); 217 } 218 return 0; 219 220 case WM_KEYUP: 221 // 何らかのキーが押されたときに発生するイベント 222 break; 223 224 case WM_KEYDOWN: 225 switch (wparam) { 226 // Enterを押すと終了確認メッセージ送信 227 case VK_RETURN: 228 if (MessageBox(hwnd, "終了してもよいですか?", "終了確認", MB_YESNO | MB_ICONQUESTION) == IDYES) { 229 PostQuitMessage(0); 230 } 231 return 0; 232 } 233 break; 234 235 case WM_DESTROY: 236 // テキストファイルに遅延時間を書き込む 237 IpBuffer = latedata; 238 WriteFile(hfile, IpBuffer, lstrlen(IpBuffer), &dwWriteSize, NULL); 239 // ファイルへ評価結果を書き込む 240 file_write(); 241 // ファイルのクローズ 242 CloseHandle(hfile); 243 244 PostQuitMessage(0); 245 return 0; 246 247 default: 248 return (DefWindowProc(hwnd, msg, wparam, lparam)); 249 250 } 251 return(0); 252} 253 254// ファイルのオープン 255bool file_open() { 256 hfile = CreateFile( 257 _T("Result.text"), // ファイルの名前 258 GENERIC_WRITE, // 書き込みモード 259 0, // 共有モード 260 NULL, // セキュリティ 261 CREATE_ALWAYS, // 上書き保存 262 FILE_ATTRIBUTE_NORMAL, 263 NULL 264 ); 265 if (hfile == INVALID_HANDLE_VALUE) { 266 MessageBox(NULL, _T("ファイルの作成に失敗しました。"), _T("エラー"), MB_OK); 267 return 1; 268 } 269 return true; 270} 271 272// 評価結果をファイルへ書き込む 273bool file_write() { 274 275 DWORD dwWriteSize; 276 const char* IpBuffer; 277 278 IpBuffer = char_grade; 279 280 // ファイルに書き込む 281 WriteFile(hfile, IpBuffer, lstrlen(IpBuffer), &dwWriteSize, NULL); 282 283 return true; 284} 285 286 287// 評価結果を保存 288bool ResultGrade(char char_grade) { 289 290 Result[IndexResult] = char_grade; 291 IndexResult += 1; 292 293 294 return true; 295} 296 297 298// コンボボックス作成, iniファイルの読み込み 299bool ComboboxFunc(HWND hwnd, LPARAM lparam) { 300 301 HWND latedatacombo; 302 303 304 stringstream ss, tt; 305 string s, t; 306 307 // 実行ファイルのパスを取得 308 char Path[MAX_PATH + 1]; 309 char settingpath[MAX_PATH + 1]; 310 settingpath[0] = '\0'; 311 312 if (0 != GetModuleFileName(NULL, Path, MAX_PATH)) { 313 char drive[MAX_PATH + 1], dir[MAX_PATH + 1], fname[MAX_PATH + 1], ext[MAX_PATH + 1]; 314 // ドライブ名, ディレクトリパス名, ファイル名, 拡張子 315 _splitpath_s(Path, drive, sizeof(drive), dir, sizeof(dir), 316 fname, sizeof(fname), ext, sizeof(ext)); 317 _stprintf_s(settingpath, MAX_PATH + 1, _T("%s%ssetting.ini"), drive, dir); 318 319 } 320 321 TCHAR latename[STRLEN], latedata[STRLEN]; 322 latename[0] = '\0'; 323 latedata[0] = '\0'; 324 325 // iniファイルの読み込み 326 GetPrivateProfileString(_T("setting"), _T("latedataname"), _T("error"), latename, sizeof(latename), settingpath); 327 328 ss << latename; 329 330 // 遅延データ選択用コンボボックスの作成 331 latedatacombo = CreateWindow( 332 _T("COMBOBOX"), 333 NULL, 334 WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 335 400, 336 50, 337 600, 338 350, 339 hwnd, 340 (HMENU)ID_LATEINI, 341 ((LPCREATESTRUCT)(lparam))->hInstance, 342 NULL 343 ); 344 345 // 遅延データのキーをコンボボックスに詰めていく 346 int i = 0; 347 while (getline(ss, s, ',')) { 348 char* cstr = new char[s.size() + 1]; 349 char_traits<char>::copy(cstr, s.c_str(), s.size() + 1); 350 SendMessage(latedatacombo, CB_INSERTSTRING, i, (LPARAM)cstr); 351 i++; 352 } 353 SendMessage(latedatacombo, CB_SETCURSEL, 0, 0); 354 return true; 355} 356 357 358// WM_COMMANDメッセージ内の処理 359bool CommandFunc(HWND hwnd, WPARAM wparam) { 360 switch (LOWORD(wparam)){ 361 case ID_LATEINI: 362 LateIniFunc(hwnd, wparam); 363 break; 364 default: 365 break; 366 } 367 368 return true; 369} 370 371// コンボボックスが押された時の処理 372bool LateIniFunc(HWND hwnd, WPARAM wparam) { 373 374 if (HIWORD(wparam) == CBN_SELCHANGE) { 375 //コンボボックスで現在選択されている項目のインデックスを取得 376 int intCurrentIndex = SendMessage(GetDlgItem(hwnd, (int)ID_LATEINI), CB_GETCURSEL, 0, 0); 377 378 // コンボボックスの一覧内の文字列の長さを取得 379 int intTxtLen = SendMessage(GetDlgItem(hwnd, (int)ID_LATEINI), CB_GETLBTEXTLEN, intCurrentIndex, 0); 380 381 if (intTxtLen != CB_ERR){ 382 char* pszBuf = new char[intTxtLen + 1]; 383 // コンボボックスの一覧から選択した項目の文字列を取得 384 if (SendMessage(GetDlgItem(hwnd, (int)ID_LATEINI), CB_GETLBTEXT, intCurrentIndex, (LPARAM)pszBuf) != CB_ERR){ 385 char Path[MAX_PATH + 1]; 386 char settingpath[MAX_PATH + 1]; 387 settingpath[0] = '\0'; 388 if (0 != GetModuleFileName(NULL, Path, MAX_PATH)){ 389 char drive[MAX_PATH + 1], dir[MAX_PATH + 1], fname[MAX_PATH + 1], ext[MAX_PATH + 1]; 390 _splitpath_s(Path, drive, sizeof(drive), dir, sizeof(dir), 391 fname, sizeof(fname), ext, sizeof(ext)); 392 _stprintf_s(settingpath, MAX_PATH + 1, _T("%s%ssetting.ini"), drive, dir); 393 } 394 // iniファイルから選択したキーの遅延時間を取得しlatedataに保存 395 GetPrivateProfileString(pszBuf, _T("data"), _T("error"), latedata, sizeof(latedata), settingpath); 396 } 397 delete[] pszBuf; 398 399 } 400 } 401 return true; 402} 403

iniファイルの中身

setting.ini

1[setting] 2latedataname=min8-1,min8-2,min8-3 3[min8-1] 4data=8,20,14,30,10,16,8,25,18,12 5[min8-2] 6data=8,16,8,30,20,14,12,10,25,18 7[min8-3] 8data=8,12,20,16,18,25,30,14,8,10

補足情報(FW/ツールのバージョンなど)

開発環境: Visual Studio 2019
OS: Windows 10
文字セット: マルチバイト文字

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

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

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

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

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

fana

2022/12/12 08:55

単純に,コンボボックスにフォーカスがあるから,みたいな話ではなく?
1999kazu

2022/12/12 09:16

回答ありがとうございます。 フォーカスという概念を知りませんでした。 関数SetFocus(HWND)をコンボボックスでの操作を記述する関数内に追加することで解決しました。 ありがとうございました。
fana

2022/12/12 09:43

それでは,自己解決の形にしてください.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問