非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

かけ算・わり算計算機コマンド版(2)

「かけ算・わり算計算機コマンド版」を拡張して

  • Windows ではウィンドウにシフトによって乗算・除算を行う様子を表示する
  • X68000 ではグラフィックスでシフトによって乗算・除算を行う様子を表示する

プログラムを作っていきます。

そのため ChatGPT で

  • Windows のウィンドウを使うプログラムで、ウィンドウへの入力にコンソールを使うことはできますか
  • テキストボックスをコンソールのように使うことはできますか

と入力すると、以下のようなサンプルを作ってくれましたがそのままでは動かないので修正していく必要があります。

#include <windows.h>
#include <string>

#define ID_INPUT 1001
#define ID_OUTPUT 1002

HWND hInput, hOutput;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_CREATE:
        // 出力用(読み取り専用、複数行)
        hOutput = CreateWindow(L"EDIT", NULL,
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_READONLY | WS_VSCROLL,
            10, 10, 460, 300,
            hwnd, (HMENU)ID_OUTPUT, NULL, NULL);

        // 入力用
        hInput = CreateWindow(L"EDIT", NULL,
            WS_CHILD | WS_VISIBLE | WS_BORDER,
            10, 320, 460, 25,
            hwnd, (HMENU)ID_INPUT, NULL, NULL);
        break;

    case WM_COMMAND:
        if (LOWORD(wParam) == ID_INPUT && HIWORD(wParam) == EN_CHANGE) {
            // Enterキーを検出するためにEN_CHANGEではなくWM_KEYDOWNを使う
        }
        break;

    case WM_KEYDOWN:
        if (GetFocus() == hInput && wParam == VK_RETURN) {
            wchar_t buffer[256];
            GetWindowText(hInput, buffer, 256);

            // 処理:大文字にして表示する(仮の出力処理)
            std::wstring result = L"> ";
            result += buffer;
            result += L"\r\n";

            // 現在の出力を取得
            int len = GetWindowTextLength(hOutput);
            SendMessage(hOutput, EM_SETSEL, len, len);
            SendMessage(hOutput, EM_REPLACESEL, 0, (LPARAM)result.c_str());

            // 入力欄をクリア
            SetWindowText(hInput, L"");

            return 0;
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }

    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
    const wchar_t CLASS_NAME[] = L"MyConsoleWindow";

    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, L"GUI Console",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 400,
        NULL, NULL, hInstance, NULL
    );

    ShowWindow(hwnd, nCmdShow);

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}