ホーム ATL/WTL
アップダウン
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2004/02/07
PR
 WTLではコモンコントロールのアップダウン(またはスピンボタン)コントロールをCUpDownCtrlT というテンプレートクラスでカプセル化しています。 テンプレート引数にはクラスを指定しますが、 そのクラスはCUpDownCtrlTクラスの基底クラスとして使用されます。 atlctrls.hヘッダではtypedefによって次のように宣言されています。

// atlctrls.h内
typedef CUpDownCtrlT<ATL::CWindow>   CUpDownCtrl;
			

これは、CUpDownCtrlクラスはCWindowクラスの派生クラスであることを意味します。

 WTLのCUpDownCtrlクラスは、MFCのCSpinButtonCtrlクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CUpDownCtrlクラスを使用する例です。 RGBそれぞれのアップダウンコントロールを操作して色を作成します。


// stdafx.h内
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <atlcrack.h>
#include <atlmisc.h>
#include <atlctrls.h>  // コントロール用クラスを使用するため
			

// maindlg.h内
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

    CUpDownCtrl m_updown_r;   // [R]用
    CUpDownCtrl m_updown_g;   // [G]用
    CUpDownCtrl m_updown_b;   // [B]用

    CRect m_rect;             // 色表示用矩形

    // メッセージマップ
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_PAINT(OnPaint)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_HANDLER_EX(IDC_EDIT_R, EN_CHANGE, OnEditChangeR)
        COMMAND_HANDLER_EX(IDC_EDIT_G, EN_CHANGE, OnEditChangeG)
        COMMAND_HANDLER_EX(IDC_EDIT_B, EN_CHANGE, OnEditChangeB)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    END_MSG_MAP()

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){
        // スクリーンの中央に配置
        CenterWindow();

        // 大きいアイコン設定
        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
        SetIcon(hIcon, TRUE);
        
        // 小さいアイコン設定
        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
        SetIcon(hIconSmall, FALSE);

        // コントロール設定
        m_updown_r = GetDlgItem(IDC_SPIN_R);
        m_updown_g = GetDlgItem(IDC_SPIN_G);
        m_updown_b = GetDlgItem(IDC_SPIN_B);

        m_updown_r.SetRange(0, 255);
        m_updown_g.SetRange(0, 255);
        m_updown_b.SetRange(0, 255);

        // 色表示用矩形を取得
        CStatic view = GetDlgItem(IDC_STATIC_VIEW);
        view.GetWindowRect(m_rect);
        ScreenToClient(m_rect);

        return TRUE;
    }

    void OnPaint(HDC /*hDC*/){
        CPaintDC dc(m_hWnd);

        CBrush brush;
        brush.CreateSolidBrush(RGB(m_updown_r.GetPos(),
            m_updown_g.GetPos(), m_updown_b.GetPos()));

        dc.FillRect(m_rect, brush);
    }

    void CheckAndUpdate(CUpDownCtrl& updown){
        if(updown.m_hWnd != NULL){
            // 範囲チェック
            BOOL bError;
            updown.GetPos(&bError);
            if(bError)
                updown.SetPos(255);
        }
        InvalidateRect(m_rect);
    }

    void OnEditChangeR(UINT uNotifyCode, int nID, HWND hWndCtl){
        CheckAndUpdate(m_updown_r);
    }

    void OnEditChangeG(UINT uNotifyCode, int nID, HWND hWndCtl){
        CheckAndUpdate(m_updown_g);
    }

    void OnEditChangeB(UINT uNotifyCode, int nID, HWND hWndCtl){
        CheckAndUpdate(m_updown_b);
    }

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){
        EndDialog(nID);
    }
};
			

// Control.cpp内
#include "stdafx.h"

#include "resource.h"

#include "maindlg.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
    HRESULT hRes = ::CoInitialize(NULL);
    ATLASSERT(SUCCEEDED(hRes));

    ::DefWindowProc(NULL, 0, 0, 0L);

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    int nRet = 0;
    // BLOCK: アプリケーション実行
    {
        CMainDlg dlgMain;
        nRet = dlgMain.DoModal();
    }

    _Module.Term();
    ::CoUninitialize();

    return nRet;
}
			

 まず、リソースを作成します。ダイアログにスタティック、エディット、アップダウンコントロールを配置し、 リソースIDを次のように指定します。 なお、エディットコントロールの[スタイル]ではデフォルトに加え[番号]にチェックを入れ、 アップダウンコントロールの[スタイル]ではデフォルトに加え[配置]で[右端]を選択し、 [自動関連付け]、[数値の自動表示]、[桁区切りなし]、[ワードラップ]にチェックを入れます。 さらに色表示用のスタティックコントロールのプロパティでは[可視]のチェックをはずします。

コントロール名 リソースID
スタティック([R]ラベル用) IDC_STATIC(デフォルトのまま)
スタティック([G]ラベル用) IDC_STATIC(デフォルトのまま)
スタティック([B]ラベル用) IDC_STATIC(デフォルトのまま)
エディット([R]用) IDC_EDIT_R
エディット([G]用) IDC_EDIT_G
エディット([B]用) IDC_EDIT_B
アップダウン([R]用) IDC_SPIN_R
アップダウン([G]用) IDC_SPIN_G
アップダウン([B]用) IDC_SPIN_B
スタティック(色表示用) IDC_STATIC_VIEW

アップダウンコントロールの[自動関連付け]にチェックを入れることで、 Zオーダーを基にアップダウンコントロールの直前のコントロールに自動的に関連付けられます。 今回の例では、[R]用エディットコントロールの次に[R]用アップダウンコントロールを配置することで、 [R]用エディットコントロールと[R]用アップダウンコントロールが関連付けられます。 同様に、[G]用、[B]用のコントロールも順番に配置します。

 次に、stdafx.h内では、CUpDownCtrlクラスを使用するためにatlctrls.hヘッダをインクルードします。

 CMainDlgクラスでは、まず、アップダウンコントロール用にCUpDownCtrlクラスのインスタンスをメンバ変数として宣言します。 これを使うためには、WM_INITDIALOGメッセージハンドラでコントロールのハンドルを代入する必要があります。 また、色を表示する矩形を表すCRectクラスのインスタンスもメンバ変数として宣言しておきます。

 次に、WM_INITDIALOGメッセージハンドラでアップダウンコントロールの範囲を設定します。 また、色表示用のスタティック矩形を取得します。

 次に、通知コードがEN_CHANGEのエディットコントロール用コマンドメッセージハンドラを[R][G][B]それぞれ追加します。 このハンドラはエディットコントロールの内容が変更された時 (直接値を入力した時とアップダウンコントロールで値を変更した時) に呼び出されます。 このハンドラではCheckAndUpdate()という独自の関数を呼び出し、 GetPos()によって値の範囲が正当であるかどうかチェックしてから色表示用矩形を更新します。

 最後に、WM_PAINTメッセージハンドラを追加して、色を描画します。