文字選択による結果表示

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <vector>

// 選択された文字列のインデックス
int selectedIndex = 0;

// 選択肢の文字列
std::vector<std::string> options = { "おはよう", "こんにちは", "こんばんは", "おやすみ" };

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC hdc = GetDC(hwnd);
    RECT rect;
    HFONT hFont;
    GetClientRect(hwnd, &rect);
    int lineHeight = (rect.bottom - rect.top) / options.size();

    switch (msg) {
    case WM_CREATE:
        // フォントの設定
        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);
        break;
    case WM_PAINT:
        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;
            // 選択肢の描画
            DrawText(hdc, options[i].c_str(), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        }
        EndPaint(hwnd, &ps);
        break;
    case WM_KEYDOWN:
        // 上キーが押されたら selectedIndex を減らし、下キーが押されたら増やして、ウィンドウを再描画
        if (wParam == VK_UP) {
            selectedIndex = (selectedIndex - 1 + options.size()) % options.size();
            InvalidateRect(hwnd, NULL, TRUE);
        }
        else if (wParam == VK_DOWN) {
            selectedIndex = (selectedIndex + 1) % options.size();
            InvalidateRect(hwnd, NULL, TRUE);
        }
        // Enterキーが押されたら選択結果を表示してウィンドウを閉じる
        else if (wParam == VK_RETURN) {
            std::cout << "選択されたのは: " << options[selectedIndex] << std::endl;
            DestroyWindow(hwnd);
        }
        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);

    // メッセージループ
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}