【C++/Win32】Win32 を極めるための極意

この記事は約4分で読めます。

C++/Win32 でテキストエディタを作成する際に得た気付きやポイントをまとめたものです。

ダイアログに独自クラスを適用することはできるのか?

下記で可能です。これでダイアログでも通常ウィンドウで発生するメッセージ(例:WM_NCCALCSIZEなど)も処理できるようになります。

  • 独自クラス作成時の WNDCLASSEXW の cbWndExtraDLGWINDOWEXTRA を設定する
  • リソースエディタでダイアログのクラス名に独自クラス名を設定する
  • ダイアログのデフォルトプロシージャは DefDlgProc に渡す

    スタティック(静的)コントロールでキー入力を受け付けるコントロールは作成できるのか?

    可能です。スタティックコントロールにキー入力処理を追加しようとしても、実際にキーを入力するするとキンキンとビープ音が鳴ります。スタティックコントロールはキー入力を受け付けていないからですね。下記のようにスタティックコントロールの WM_GETDLGCODE で例えば DLGC_WANTALLKEYS(すべてのキーボード入力) を返すとキー入力してもビープ音が鳴らなくなります。

    LRESULT StaticClass::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        switch(message) {
            case WM_GETDLGCODE: return DLGC_WANTALLKEYS;
        }
        return ::DefSubclassProc(hWnd, message, wParam, lParam);
    }

    その他の戻り値は下記を参照してください。

    スタティック(静的)コントロールのスクロールバーは利用できるのか?

    利用できます。初期の状態ではスタティックコントロールにスクロールバーを表示しても、サム(つまみ)をドラッグすることができません。ドラッグできるようにするには、いくつかのウィンドウメッセージを DefSubclassProc ではなく、DefWindowProc に渡す必要があります。下記はその例です。これでスクロールバーが有効になります。

    LRESULT StaticClass::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        switch(message) {
            case WM_NCHITTEST:              return ::DefWindowProc(hWnd, message, wParam, lParam);
            case WM_NCLBUTTONDOWN:          return ::DefWindowProc(hWnd, message, wParam, lParam);
            case WM_NCLBUTTONUP:            return ::DefWindowProc(hWnd, message, wParam, lParam);
        }
        return ::DefSubclassProc(hWnd, message, wParam, lParam);
    }

    詳細は下記を参照してください。

    スクロールバーコントロールの設定値の制限は?

    SetScrollInfo で SCROLLINFO 構造体に設定する際の制限です。スクロールバーを自作する時に役に立ちます。

    nPage の制限

    nPage に設定可能な値です。

    0 から nMaxnMin + 1

    nPos の制限

    nPos に設定可能な値です。nMax が最大ではない点に注意です。

    nMin から nMax – max(nPage – 1, 0)

    詳細は下記を参照してください。

    コメント

    タイトルとURLをコピーしました