#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <vector>
// 選択された文字列のインデックス
int selectedIndex = 0;
// 選択肢の文字列
std::vector<std::string> options = { "おはよう", "こんにちは", "こんばんは", "おやすみ" };
int key_mode;
void key_sel_paint(HWND hwnd);
void key_sel_keydown(HWND hwnd, WPARAM wParam);
void display_mode(int sel);
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE:
break;
case WM_PAINT:
switch (key_mode) {
case 1:
key_sel_paint(hwnd);
break;
}
break;
case WM_KEYDOWN:
switch (key_mode) {
case 1:
key_sel_keydown(hwnd, wParam);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int main() {
// ウィンドウクラスの登録
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = GetModuleHandle(NULL);
wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 255)); // 背景色を青に設定
wc.lpszClassName = "MyWindowClass";
RegisterClass(&wc);
// ウィンドウ作成
HWND hwnd = CreateWindow("MyWindowClass", "選択してください", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, GetModuleHandle(NULL), NULL);
// ウィンドウ表示
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
display_mode(1);
// メッセージループ
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
void display_mode(int sel) {
switch (sel) {
case 1:
key_mode = 1;
break;
}
}
void key_sel_paint(HWND hwnd) {
//key_mode = 0;
PAINTSTRUCT ps;
HDC hdc = GetDC(hwnd);
RECT rect;
HFONT hFont;
GetClientRect(hwnd, &rect);
int lineHeight = (rect.bottom - rect.top) / options.size();
// フォントの設定
hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
SelectObject(hdc, hFont);
hdc = BeginPaint(hwnd, &ps);
for (size_t i = 0; i < options.size(); ++i) {
// 選択された文字列と背景色を設定
if (selectedIndex == i) {
SetBkColor(hdc, RGB(255, 255, 0)); // 背景色を黄色に設定
SetTextColor(hdc, RGB(0, 0, 255)); // 文字色を青色に設定
}
else {
SetBkColor(hdc, RGB(0, 0, 255)); // 背景色を青色に設定
SetTextColor(hdc, RGB(0, 255, 255)); // 文字色を水色に設定
}
// 選択肢の表示位置を設定
rect.top = i * (lineHeight - 30);
rect.bottom = (i + 1) * lineHeight;
//InvalidateRect(hwnd, NULL, NULL);
//UpdateWindow(hwnd);
// 選択肢の描画
DrawText(hdc, options[i].c_str(), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
EndPaint(hwnd, &ps);
}
void key_sel_keydown(HWND hwnd,WPARAM wParam) {
// 上キーが押されたら selectedIndex を減らし、下キーが押されたら増やして、ウィンドウを再描画
if (wParam == VK_UP) {
selectedIndex = (selectedIndex - 1 + options.size()) % options.size();
InvalidateRect(hwnd, NULL, NULL);
UpdateWindow(hwnd);
}
else if (wParam == VK_DOWN) {
selectedIndex = (selectedIndex + 1) % options.size();
InvalidateRect(hwnd, NULL, NULL);
UpdateWindow(hwnd);
}
// Enterキーが押されたら選択結果を表示してウィンドウを閉じる
else if (wParam == VK_RETURN) {
std::cout << "選択されたのは: " << options[selectedIndex] << std::endl;
DestroyWindow(hwnd);
}
}