LoginSignup
5
5

More than 5 years have passed since last update.

【Win32】ウィンドウにテキストボックスを設置する

Last updated at Posted at 2015-08-18

ウィンドウにテキストボックスを設置するサンプルです。
Xcode、.Net、Web などでの構築に慣れてしまうと Win32 プログラミングがとても億劫に思えます。 HTMLならば INPUT タグを書くだけなのに Win32 だと一苦労です。
Microsoftは今後 Windows ストアアプリへ移行したいようだし Win32 は枯れつつある技術であることは確かです。しかしコンピュータ動作の基本概念を理解するには良い学習材料になります。

Win32ウィンドウプログラミングでは、_tWinMain() がメイン関数となりますが、単にそれは WinMain() をdefineでラップしたものです。

下のサンプルコードを実行すると「ようこそ!」というメッセージボックスが表示されます。
フォーム上にはテキストボックスのみ設置されます。

テキストボックスのイベントは、WndProc() にコールバックされるので、その中に処理を書くことになります。

sample.cpp

#include "stdafx.h"
#include "sample.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在のインターフェイス
TCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーのテキスト
TCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれる関数の宣言を転送します:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

//エディットボックスのハンドル
HWND hEdit;

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    MSG msg;
    HACCEL hAccelTable;

    // グローバル文字列を初期化しています。
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_T01, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // アプリケーションの初期化を実行します:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_T01));
    MessageBox(NULL, L"ようこそ!", L"メッセージ", MB_OK);

    // メイン メッセージ ループ:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}

//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_T01));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_T01);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

//
//   関数: InitInstance(HINSTANCE, int)
//
//   目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
//
//   コメント:
//
//        この関数で、グローバル変数でインスタンス ハンドルを保存し、
//        メイン プログラム ウィンドウを作成および表示します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

   hWnd = CreateWindow(
                    szWindowClass, 
                    szTitle,                // ウィンドウに表示するタイトル  
                    WS_OVERLAPPEDWINDOW,    // ウィンドウのスタイル
                    CW_USEDEFAULT,          // ウィンドウのx位置(システム標準値を使用)
                    0,                      // ウィンドウのy位置(システム標準値を使用)
                    640,                    // ウィンドウの幅
                    400,                    // ウィンドウの高さ
                    NULL, 
                    NULL, 
                    hInstance, 
                    NULL
    );

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HFONT hFnt;     //フォントのハンドル
    TCHAR strBuffer[1024];

    switch (message)
    {
    case WM_CREATE:
        //エディットボックスの定義
        hEdit=CreateWindow(
                _T("EDIT"),             //ウィンドウクラス名
                NULL,                   //キャプション
                WS_CHILD | WS_VISIBLE | WS_BORDER |
                        WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL |
                        ES_LEFT | ES_MULTILINE,         //スタイル指定
                10,10,                  //位置 x、y
                480,300,                //幅、高さ
                hWnd,                   //親ウィンドウ
                (HMENU)1,               // メニューハンドルまたは子ウィンドウID
                hInst,                  //インスタンスハンドル
                NULL);                  //その他の作成データ

        //テキストエディットのフォント作成
        hFnt = CreateFont(14, 0, 0, 0,
                FW_NORMAL, FALSE, FALSE, 0, 
                SHIFTJIS_CHARSET, 
                OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS, 
                DEFAULT_QUALITY, FIXED_PITCH, _T("System")); 
        //テキストエディットのフォント変更のメッセージを送信
        SendMessage(hEdit, WM_SETFONT, (WPARAM)hFnt, MAKELPARAM(FALSE, 0));

        return 0;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);

        wsprintf(strBuffer, L"%d/%x\n",wmId, wmEvent);
        OutputDebugString(strBuffer);

        // 選択されたメニューの解析:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスのメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5