WTRL入門(3)---ツールバーとステータスバー

10764 ワード

ソースコードのダウンロード:http://download.csdn.net/source/3522797
Toolbars and Stuts Bars in a Frame
CFrame WindowImplは三つのHWNDオブジェクトを含み、そのうちの一つはm_hWndClientは前の節にもう話しました。他の二つのm_。hWndToolBarはツールバーのハンドルを表します。m_hWndStatusBarはステータスバーに使用されます。CFrame WindowImplは一つのツールバーだけをサポートしています。MFCのように複数のドッキング可能なツールバーを直接サポートすることはできません。このような効果を実現するにはRebarが必要です。CFrame WindowImpl:OnSize()はUpdateLayout()を呼び出して2つのことをします:1、位置付けbars;2、ビュー領域を塗りつぶしてビューウィンドウを拡大縮小します。UpdateLayout()UpdateBarsPositionを呼び出して実際の作業を実行します。WMのみを送信します。SIZEは作成されたツールバーとステータスバーに、デフォルトの処理はツールバーをFrameウィンドウの先端に移動し、ステータスバーをFrameウィンドウの下端に移動します。アプリWizardは、ツールバーとステータスバーを自動的に生成することができます。
How CMainFrame creates the bars
アプリWizardは自動的にいくつかのコードを生成し、Barsを作成し、CUpdateUIにtoolbarを更新するというbuttonsを教えます。
	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		//         IDR_MAINFRAME        
		CreateSimpleToolBar();

		CreateSimpleStatusBar();

		m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);

		UIAddToolBar(m_hWndToolBar);
		UISetCheck(ID_VIEW_TOOLBAR, 1);
		UISetCheck(ID_VIEW_STATUS_BAR, 1);

		// register object for message filtering and idle updates
		CMessageLoop* pLoop = _Module.GetMessageLoop();
		ATLASSERT(pLoop != NULL);
		pLoop->AddMessageFilter(this);
		pLoop->AddIdleHandler(this);

		return 0;
	}
次はCFrame WindowImpl:CreateSimpleToolBar()のソースコードです。
	BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
	{
		if(nResourceID == 0)
			nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
#ifndef _WIN32_WCE
		ATLASSERT(!::IsWindow(m_hWndToolBar));
		m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
		return (m_hWndToolBar != NULL);
#else // CE specific
		HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);
		return (hWnd != NULL);
#endif // _WIN32_WCE
	}
nResourceIDツールバーのリソースID。デフォルトの値0は使用を意味します。DECLARE_FRAME_WND_CLASS macroが指定するリソース。アプリWizardが自動的に生成されたものです。IDR_MAINFRAME.dwStyleツールバーのスタイル。 標準値ATL_SIMPLE_TOOLBAR_STYLE , toolTip。nIDWindow ID for the toolbar,you will usualy use the default value.CreateSimpleToolBar()は、このツールバーが作成されているかどうかを確認し、CreateSimpleToolBarCtrl()を呼び出してコントロールを作成し、m_hWndToolBar。 CreateSimpleToolBarCtrl()に戻ってリソースを読み取り、ボタンを作成し、toolbarウィンドウハンドルに戻る。以下はCreateSimpleToolBar :です。
BOOL CFrameWindowImpl::CreateSimpleStatusBar(
    LPCTSTR lpstrText,
    DWORD dwStyle = ... SBARS_SIZEGRIP,
    UINT nID = ATL_IDW_STATUS_BAR)
{
    ATLASSERT(!::IsWindow(m_hWndStatusBar));
    m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID);
    return (m_hWndStatusBar != NULL);
}
ステータスバーが作成されているかどうかを確認し、CreateStatus Windowを呼び出してステータスバーを作成し、ステータスバーをhWndStatus Barに保存します。
Showng and hiding the barsCMainFrameは、ツールバーとステータスバーを表示/隠すための「ビュー」メニューの下に2つのコマンドがあります。ツールバーのコマンド応答コードは以下の通りです。
//           ,           ,  UpdateLayout       (   )         
LRESULT CMainFrame::OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, 
                                  HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    BOOL bVisible = !::IsWindowVisible(m_hWndToolBar);
    ::ShowWindow(m_hWndToolBar, bVisible ? SW_SHOWNOACTIVATE : SW_HIDE);
    UISetCheck(ID_VIEW_TOOLBAR, bVisible);
    UpdateLayout();
    return 0;
}
Bulilt-in feature s of the bars
MFCはツールバーとステータスバーにいくつかの良い特性を提供します。WTRLのCFrameWindowImplは、tooltipおよびflyhelpのような対応する特性も実現されている。CFrameWindowImplBaseには、これらの特性を実現するための2つのメッセージ処理がある。OnMenuSelect()は、メッセージWM_MENUSELECTを処理し、MFCのようにflyhelp文字列を検索する(文字列リソースから現在選択されているメニュー項目と同じIDの文字列を読み込み、「」文字を検索し、前の文字列をflyhelp文字列とする)。OnToolTipTextA() OnToolTipTextW() TTN_GETDISPINFOAおよびTTN_GETDISPINFOWは、それぞれツールバーボタンに してTooltipテキストを し、OnMenuSelectと じ で をロードするが、その の はToolTip textとして される。 :WTRF 7.0/7.1では、OnMenuSelect()およびOnToolTipTextA()は、DBCS( バイト セット)ではなく、 であり、 には、DBCSのlead/tril(プリアンブル/ )バイトを しない。
Creating a toolbar with a different style
CreateSimpleToolBar()の2 のパラメータの を することで、ツールバーのスタイルを することができます。
CreateSimpleToolBar ( 0, ATL_SIMPLE_TOOLBAR_STYLE | 
                               TBSTYLE_FLAT | TBSTYLE_LIST );
The Toolbar Editor
アプリWizardは にツールバーを してくれます。ヘルプボタンだけが されました。MFC のようにツールバーを できます。ここ ツールバーは の りです。
  • IDC_CP_COLORS: ビューの をCodeProjectの に する
  • IDC_BW_COLORS: ビューを に し、 の
  • ID_VIEW_STATUS_BAR: バーを または にする
  • ID_VIEW_TOOLBAR: ツールバーの /
  • の2つのボタンのIDは であり、バインディングコマンドメッセージはマクロCOMMAND_ID_HANDLER_EXを する。
    UI Updating Toolbar Butons
    アプリWizardで されたCMainFrameは、 のUI ( および ツールバーおよびステータスバーメニューボタン)を んでいます。
    BEGIN_UPDATE_UI_MAP(CMainFrame)
        UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
        UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
    END_UPDATE_UI_MAP()
    の プログラムはツールバーにもこの つのIDがありますので、マクロUPDUI_TOOLBAR, :を したいです。
    BEGIN_UPDATE_UI_MAP(CMainFrame)
        UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
        UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
    END_UPDATE_UI_MAP()
    また、ツールバーのボタンを するための2つの があります。AppWizardで されたコードはそれらを び すことができます。 
    Enbaling toolbar UI udatingCMainFrame::OnCreate() , :
    LRESULT CMainFrame::OnCreate( ... )
    {
    // ...
        m_hWndClient = m_view.Create(...);
     
        UIAddToolBar(m_hWndToolBar);
        UISetCheck(ID_VIEW_TOOLBAR, 1);
        UISetCheck(ID_VIEW_STATUS_BAR, 1);
    // ...
    }
    UIAddToolBar()は、ツールバーのハンドルをCUpdateUI, 。 OnIdle()に す。 :
    BOOL CMainFrame::OnIdle()
    {
        UIUpdateToolBar();
        return FALSE;
    }
    メッセージ・キューにメッセージがない 、CMessageLoop::Run()は、OnIdle()を び し ける。UIUpdateToolBar()は、Update UI mapを して、UPDUI_TOOLBARフラグのコールUISetCheck() , 。 : push menu , , CUpdateUIを し、メッセージWM_INITMENUPOPUPを し、メッセージが いたときに メニュー を した。メニューバーの には、UIAddMenuBar()UIUpdateMenuBar()。を します。
    Using a Rebar Instead of a Plain ToolbarCFrameWindowImplはRebarを して、 たちのプログラムをInternet Explorerのように せることをサポートしています。(Appwizardで しいプロジェクトを する 、Rebarを うことを します。) はAppwizarで したRebarの コードです。
    LRESULT CMainFrame::OnCreate(...)
    {
        HWND hWndToolBar = CreateSimpleToolBarCtrl ( m_hWnd, 
                               IDR_MAINFRAME, FALSE, 
                               ATL_SIMPLE_TOOLBAR_PANE_STYLE );
     
        CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
        AddSimpleReBarBand(hWndToolBar);
    // ...
    }
    まず なるスタイルATL_SIMPLE_TOOLBAR_PANE_STYLEを してtoolbarを し、ATL_SIMPLE_TOOLBAR_STYLEに べてATL_SIMPLE_TOOLBAR_PANE_STYLE CCS_NOPARENTALIGN, 。
    CreateSimpleReBar() Rebar, m_hWndToolBar, AddSimpleReBarBand() Rebar Band, Rebar, Band 。
    CMainFrame::OnViewToolBar()も なる。これはこのツールバーを むBandを しています。このRebarではなく、 のrebarを します。このToolbarだけではありません。 のツールバーがある は、AppwizardのコードのようにOnCreate() AddSimpleReBarBand()。 CFrameWindowImpl Rebar , 。で されます。
    Multi-Plane Sttus Bars
    WTRLは、 パネルを する バークラスCMultiPaneStatusBarCtrl。 UI , PopUP , flyby help 。
    CMainFrame
    を する。
    class CMainFrame : public ...
    {
    //...
    protected:
        CMultiPaneStatusBarCtrl m_wndStatusBar;
    };
    その 、OnCreate() bar UI
    m_hWndStatusBar = m_wndStatusBar.Create ( *this );
        UIAddStatusBar ( m_hWndStatusBar );
    CreateSimpleStatusBar() , m_hWndStatusBar。
    CMultiPaneStatusBarCtrl::SetPanes() :
    BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true);
    pPanes:パネルID nPanes :    bSetText:trueであれば、すべての に がすぐに されます。パネルIDsは、ID_DEFAULT_PANE flyby help , IDsであっても いと しています。デフォルトパネルがない 、WTRLはIDにマッチする をロードし、それらの を して、 するパネルの を じに します。MFCで するロジックと じです。bSetText パネルは を ちに するかどうか。 trueであれば、SetPanes()は に を し、  のままにします
    // Create the status bar panes.
    int anPanes[] = { ID_DEFAULT_PANE, IDPANE_STATUS, 
                      IDPANE_CAPS_INDICATOR };
     
        m_wndStatusBar.SetPanes ( anPanes, 3, false );
    IDPANE_STATUS “@@@@”, :“Running” “Stopped”。 MFC , 。IDPANE_CAPS_INDICATOR “CAPS”UI udating the panes
    ステータスバーのテキストを するためには、UIに き み、ルーティングを する があります。
    BEGIN_UPDATE_UI_MAP(CMainFrame)
            //...
            UPDATE_ELEMENT(1, UPDUI_STATUSBAR)  // clock status
            UPDATE_ELEMENT(2, UPDUI_STATUSBAR)  // CAPS indicator
        END_UPDATE_UI_MAP()
    のパラメータは の で、IDではありません。これらの を べ す がある 、 する に うようにパラメータを する があります。SetPanesにおいて 3のパラメータが されたのはfalseであり,したがってすべての が されたのは である。 は された の テキストを します。
    // Set the initial text for the clock status pane.
        UISetText ( 1, _T("Running") );
    UISetText()は、 のステータスバーUI である。 に、CMainFrame::OnIdle()に び しを する があります。 ,ステータスバーを き に できます。
    BOOL CMainFrame::OnIdle()
    {
        // ...
        UIUpdateToolBar();
        UIUpdateStatusBar();
        return FALSE;
    }
    UIUpdateStatusBar()を すると、UIUpdateStatusBar()は、CUpdateUIを した 、メニューテキストが されていません。この はWTRL 7.1にはまだ する。 に、 たちはCaps Lockの を して、2 の を したいです。UISetText()にあります。
    BOOL CMainFrame::OnIdle()
    {
        // Check the current Caps Lock state, and if it is on, show the
        // CAPS indicator in pane 2 of the status bar.
        if ( GetKeyState(VK_CAPITAL) & 1 )
            UISetText ( 2, CString(LPCTSTR(IDPANE_CAPS_INDICATOR)) );
        else
            UISetText ( 2, _T("") );
     
        UIUpdateToolBar();
        UIUpdateStatusBar();
        return FALSE;
    }
    OnIdle() , 。 :WTRL for MFC Programers、Part III-Toolbars and Stuts Bars