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を教えます。
Showng and hiding the bars
MFCはツールバーとステータスバーにいくつかの良い特性を提供します。WTRLの
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。
nID
Window 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 bars
CMainFrame
は、ツールバーとステータスバーを表示/隠すための「ビュー」メニューの下に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 barsMFCはツールバーとステータスバーにいくつかの良い特性を提供します。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