EditBox や Button を貼り付ける



ウインドウに EditBox や Button を貼り付けてタイマ割り込みでカウントします。
上の EditBox がタイマのカウントで、下の EditBox がタイマの割り込み間隔です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 空のプロジェクト(Button)を作成して下さい。
    次のメニューを作成して下さい。
    ID キャプション
    IDR_MENU1 FILE(&F)
    IDM_START 開始(&S)
    IDM_STOP 停止(&P)
    IDM_RESET 初期化(&R)
    IDM_END 終了(&E)
  2. #define と Global Area の定義です。
    ウインドウに貼り付ける EditBox と Button のハンドルを定義します。
    ID_TIMER はタイマのIDで、バッティングしなければ何でも良いのですが (WM_APP + 0) を使うことが推奨されています。
    COUNT はタイマ割り込みでカウントする領域です。
    STEP はタイマ割り込みの間隔です。
        //#define     ID_TIMER    32767
        #define     ID_TIMER    (WM_APP + 0)
    
        HINSTANCE   g_hInst;
        HWND        g_hEdit1;           //Edit Handle
        HWND        g_hEdit2;           //Edit Handle
        HWND        g_hButtom1,g_hButtom2,g_hButtom3,g_hButtom4;
    
        int         COUNT= 0;
        int         STEP= 500;
        char        work[20];
        
  3. WinMain() は何時もと同じですが、g_hInst を設定するのを忘れないで下さい。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
        {   MSG     msg;
    
            g_hInst = hInst;
            WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,
                              0L,0L,hInst,NULL,NULL,
                              (HBRUSH)GetStockObject(LTGRAY_BRUSH),
                              MAKEINTRESOURCE(IDR_MENU1),NAME,NULL
                            };
                    :
        
  4. WM_CREATE: でアプリケーションの初期化を行います。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {
            switch(msg)
            {   case WM_CREATE:
                    InitAll(hWnd);
                    break;
        
  5. メニューの設定です。
    今回はウインドウに貼り付けた Button をメニューと関連づけているので、Button をクリックしたときも メニューと同じように機能します。
    IDM_START: で Timer を設定してカウントを開始します。
    IDM_STOP: で Timer を停止します。
    IDM_RESET: でカウンタをリセットします。
    IDM_END: でプログラムを終了します。
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDM_START:
                        GetWindowText(g_hEdit2,work,20);
                        STEP= atoi(work);
                        wsprintf(work,"%10d",STEP);
                        SetWindowText(g_hEdit2,work);
                        SetTimer(hWnd,ID_TIMER,STEP,NULL);
                        break;
                    case IDM_STOP:
                        KillTimer(hWnd,ID_TIMER);
                        break;
                    case IDM_RESET:
                        COUNT= 0;
                        wsprintf(work,"%10d",COUNT);
                        SetWindowText(g_hEdit1,work);
                        break;
                    case IDM_END:
                        SendMessage(hWnd, WM_CLOSE, 0, 0L);
                        break;
                }
                break;
        
  6. WM_TIMER: タイマ割り込みでカウントアップします。
            case WM_TIMER:
                COUNT++;
                wsprintf(work,"%10d",COUNT);
                SetWindowText(g_hEdit1,work);
                break;
        
  7. アプリケーションの初期化を行う InitAll() 関数です。
    Main Window に EditBox と Button を貼り付けます。
    Dialog Box の場合にはビジュアル的に指示できますが、ウインドウの時はソースコードを直接書きます。
    CreateWindow() で EditBox と Button のウインドウを作成して、そのハンドルを保存します。
    ウインドウの種類と WS_CHILD | WS_VISIBLE を指定して、左上座標と幅と高さを指示して下さい。
    SetWindowText() でキャプションを表示します。
        void InitAll(HWND hWnd)
        {
            g_hEdit1 = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE,
                            50, 20, 80, 24, hWnd, NULL, g_hInst, NULL);
            g_hEdit2 = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE,
                            50, 60, 80, 24, hWnd, NULL, g_hInst, NULL);
            g_hButtom1 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            50, 120, 60, 20, hWnd, (HMENU)IDM_START, g_hInst, NULL);
            g_hButtom2 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                           130, 120, 60, 20, hWnd, (HMENU)IDM_STOP, g_hInst, NULL);
            g_hButtom3 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            50, 150, 60, 20, hWnd, (HMENU)IDM_RESET, g_hInst, NULL);
            g_hButtom4 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                           130, 150, 60, 20, hWnd, (HMENU)IDM_END, g_hInst, NULL);
            wsprintf(work,"%10d",STEP);
            SetWindowText(g_hEdit2,work);
            SetWindowText(g_hButtom1,"開始");
            SetWindowText(g_hButtom2,"停止");
            SetWindowText(g_hButtom3,"初期化");
            SetWindowText(g_hButtom4,"終了");
        }
        
  8. ビルドに続いて実行を行います。
    [開始]をクリックまたは、メニューから[開始]を選ぶとカウントが始まります。
    [停止]でカウントが停止します。
    二段目の EditBox で割り込み間隔を設定することが出来ます。
    [初期化]ボタンでカウンタをクリアします。
    ボタンと同じ機能がメニューにも設定されています。

超初心者のプログラム入門(Win32API C++)