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

// atlctrls.h内
typedef CTrackBarCtrlT<ATL::CWindow>   CTrackBarCtrl;
			

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

 WTLのCTrackBarCtrlクラスは、MFCのCSliderCtrlクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CTrackBarCtrlクラスを使用する例です。 トラックバーを左に移動するほどダイアログの透明度を高くして表示します。 なお、このプログラムは半透明機能(SetLayeredWindowAttributes())を使用するため、 Windows2000以降で実行する必要があります。


// stdafx.h内
#define _WIN32_WINNT  0x0500

#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 };

    CTrackBarCtrl m_track_layer;  // トラックバー

    // メッセージマップ
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        MSG_WM_HSCROLL(OnHScroll)
        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);

        // 拡張ウィンドウスタイル設定
        ModifyStyleEx(0, WS_EX_LAYERED);

        // コントロール設定
        m_track_layer = GetDlgItem(IDC_SLIDER_LAYER);

        m_track_layer.SetRange(0, 255);
        m_track_layer.SetTicFreq(15);
        m_track_layer.SetPageSize(15);
        m_track_layer.SetLineSize(1);

        m_track_layer.SetPos(255);
        SetLayer(m_track_layer.GetPos());

        return TRUE;
    }

    void OnHScroll(int nCode, short nPos, HWND hWnd){
        CTrackBarCtrl trackbar = hWnd;
        SetLayer(trackbar.GetPos());
    }

    void SetLayer(BYTE byteAlpha){
        HMODULE hDll = LoadLibrary(_T("user32"));
        if(hDll){
            typedef BOOL (WINAPI *PSLWA) (HWND, COLORREF, BYTE, DWORD);
            PSLWA pSetLayeredWindowAttributes
                = (PSLWA)GetProcAddress(hDll, "SetLayeredWindowAttributes");

            if(pSetLayeredWindowAttributes != NULL)
                pSetLayeredWindowAttributes(m_hWnd, 0, byteAlpha, LWA_ALPHA);

            FreeLibrary(hDll);
        }
    }

    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)
{
    // Windowsのバージョンチェック
    OSVERSIONINFO vi = {sizeof(OSVERSIONINFO)};
    GetVersionEx(&vi);
    if(vi.dwPlatformId != VER_PLATFORM_WIN32_NT || vi.dwMajorVersion < 5){
        AtlMessageBox(NULL, _T("OSが半透明機能に対応していません。"),
            _T("エラー"), MB_OK | MB_ICONERROR);
        return 0;
    }

    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
トラックバー IDC_SLIDER_LAYER

 次に、stdafx.h内では、CTrackBarCtrlクラスを使用するためにatlctrls.hヘッダをインクルードします。 また、今回の例ではSetLayeredWindowAttributes()APIを使用するので、 _WIN32_WINNT を 0x0500 に定義します。

 CMainDlgクラスでは、まず、トラックバーコントロール用にCTrackBarCtrlクラスのインスタンスをメンバ変数として宣言します。 これを使うためには、WM_INITDIALOGメッセージハンドラでコントロールのハンドルを代入する必要があります。

 次に、WM_INITDIALOGメッセージハンドラで拡張ウィンドウスタイルに WS_EX_LAYEREDを追加し、 その後トラックバーコントロールの初期設定をします。 ここでは、範囲(最小値 0、最大値255)、 目盛りマークの刻み(15毎に目盛りマークを表示)、 ページサイズ([PageUp][PageDown]キーを押した時に15ずつ移動)、 ラインサイズ(矢印キーを押したときに 1 ずつ移動) を設定しています。 さらに、つまみの初期位置を255とし、その位置をSetLayer()に渡しています。 これはデフォルトで不透明なダイアログを表示することを意味します。

 次に、WM_HSCROLLメッセージハンドラを追加します。 トラックバーコントロールはスクロールバーと同様、 つまみを移動するとWM_HSCROLLメッセージを親ウィンドウに送ります。 WM_HSCROLLメッセージハンドラでは、トラックバーコントロールの現在位置を取得し、 SetLayer()関数に渡しています。

SetLayer()関数では、user32.dllから SetLayeredWindowAttributes()APIのアドレスを取得し、 ダイアログを透明度を変更しています。

 最後に、_tWinMain()内でGetVersionEx()を呼び出すことによってWindowsのバージョンチェックをします。