前言:在看MFC Windows程式設計的時候,覺得有些地方還沒掌握,覺得有必要把這些技能知識點記錄下來,所以整理了下,把這些讀書筆記發布出來,一來可以加深自己的理解,二來也可以貢獻點微不足道的力量
建立工具列方法:
1.CToolBar::Create建立工具列
m_wndToolbar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,AFX_IDW_TOOLBAR);
也可以:m_wndToolBar.Create(this);
m_wndToolBar.SetBarStyle((m_wndToolBar.GetBarStyle() & ~CBRS_TOP) | CBRS_BOTTOM);
調用CToolBar::LoadBitmap載入包含按鈕的命令
ID static UINT nButtonIDs[]={ ID_FILE_NEW, ID_FILE_OPEN, ...};
m_wndToolBar.Create(this);
m_wndToolBar.LoadBitmap(IDB_BITMAP);
m_wndToolbar.SetButtons(nButtonIDs,10);
CToolBar::SetSizes改變圖象和按鈕尺寸
2.從資源檔中載入--CToolbar::LoadToolBarCToolBar::SetButtonText改變按鈕表面的字串m_wndToolBar.Create(this);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
m_wndToolBar.SetButtonText(0,_T("New"));
m_wndToolBar.SetButtonText(1,_T("Open"));
m_wndToolBar.SetSizes(CSize(48,42),CSize(40,19));
TBBS_CHECKBOX建立一個複選按鈕TBBS_CHECKGROUP相當於TBBS_CHECKBOX | TBBS_GROUP這些屬性實用CToolBar::SetButtonStyle 把工具列添加選項按鈕,選中其中一個作為預設按鈕
int nState=m_wndToolBar.GetToolBarCtrl().GetState(ID_PART_LEFT);
m_wndToolBar.GetToolBarCtrl().SetState(ID_PART_LEFT,nState | TBSTATE_CHECKED);
只有調用工具列的CControlBar::EnableDocking和架構視窗的CFrameWnd::EnableDocking函數,並有各自的位標誌制定架構視窗一側作為工具列的安裝位置,工具列的可浮動和可擺放才有效
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
可使停放在父視窗的任一一側用CFrameWnd的成員函數DockControlBar和FloatControlBar使工具列浮動DockControlBar(&m_wndToolBar);
FloatControlBar(&m_wndToolBar,CPoint(x,y));
父視窗的座標系 TBBS_WRAPPED相當於斷行符號,後面的按鈕放在下一行
m_wndToolBar.SetButtonStyle(1,m_wndToolBar.GetButtonStyle(0)|TBBS_WRAPPED);
工具列的可見度:
1.CFrameWnd::OnBarCheck來隱藏或者顯示CFrameWnd::OnUpdateControlBarMenu來選中或取消其ID和工具列ID匹配的功能表項目
On_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR,OnUpdateControlBarMenu)
On_COMMAND_EX(ID_VIEW_STATUS_BAR,OnBarCheck)
編寫自己的命令和更新程式並用CFrameWnd::ShowControlBar隱藏或顯示,通過查看WS_VISIBLE確定是否顯示
ON_COMMAND(ID_VIEW_TOOLBAR,OnVieToolBar)ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR,OnUpdateViewToolBar)
void CMainFrame::OnViewToolBar()
{
ShowControlBar(&m_wndToolBar,(m_wndToolBar.GetStyle() & WS_VISIBLE)==0,FALSE);
}
void CMainFrame::OnUpdateViewToolBar(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck((m_wndToolBar.GetStyle() & WS_VISIBLE)?1:0);
}
僅僅修改WS_VISIBLE無法實現顯示隱藏,因為工具列的顯示隱藏時MFC會調整視圖的大小,適應架構視窗用戶端區域內的變化 CControlBar::OnUpdateCmdUI是個虛函數,主結構在CPU空閑時調用,重載更新那些沒有UI更新處理常式的控制項設定工具列永久化的兩個函數:CFrameWnd::SaveBarState和CFrameWnd::LoadBarStateSaveBarState把每個工具列的停放或浮動狀態,位置,方向和可見度寫到註冊表在主架構視窗的OnCreate中調用LoadBarState,在OnClose中調用SaveBarState 在工具列中添加其他按鈕控制項1.在TOOLBAR資源中添加一個按鈕分隔字元或者白按鈕,任一ID和映像
2.調用CToolBar::SetButtonInfo來增加預留位置的寬度,使之能容納控制項,在該空白處建立控制項SetButtonInfo(8,IDC_COMBOBOX,TBBS_SPEARATOR,nWidth);
CRect rect;
GetItemRect(8,&rect);
rect.botton=rect.top=nHeight;
m_wndComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST,rect,this,IDC_COMBOBOX);
HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);
該函數不是API函數,需要用LoadLibrary 和 GetProcAddress來擷取函數指標 //檢測Common Ctrl的版本void GetCommonCtrlVersion(DWORD &dwMajor,DWORD &dwMinor)
{
dwMajor=dwMinor=0;
HINSTANCE hLib=::LoadLibrary(_T("Contrl32.dll"));
if( hLib!=NULL )
{
DLLGETVERSIONPROC pDllGetVersion= (DLLGETVERSIONPROC )::GetProcAddress(hLib,_T("DllGetVersion"));
if( pDllGetVersion )
{
DLLVERSIONINFO dvi;
ZeroMemory(&dvi,sizeof(dvi));
dvi.cbSize=sizeof(dvi);
HRESULT hr=(*pDllGetVersion)(&dvi);
if( SUCCEEDED(hr) )
{ dwmajor=dvi.dwMajorVersion; dwMinor=dvi.dwMinorVersion; }
}
else
{ dwMajor=4; dwMor=0; }
::Freelibrary(hLib); }} DWORD dwMajor,dwMinor;GetComctlVersion(dwMajor,dwMinor);if( (dwMajor==4 && dwMinor>=70) || dwMajor>4 )
{ //the feature is supported}
else
{ //not supported}
在SDK的Windows程式中,通常使用WM_MENUSELECT訊息來更新狀態列的描述性文本狀態列通過建立狀態列static UINT nIndicator[]={ ID_SEPARATOR, ID_INDICATOR_INS};
m_wndStatusBar.Create(this);
m_wndStatusBar.Setindicators(nIndicators,2);
通過SetPaneInfo來調整窗格資訊
m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NOBORDERS,64);
可以通過訊息映射來更新狀態列的窗格
ON_UPDATE_COMMAND_UI(ID_INDICATORS,OnUpdateTime)
void CMainFrame::OnUpdateTime(CCmdUI *pCmdUI)
{ .... pCmdUI->SetText(...);}
在狀態列德文本前加一個“/t”,窗格文本置中對齊,兩個"/t/t",窗格靠右對齊建立ReBar首先建立ToolBarm_wndToolBar.CreateEx(this);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
m_wndReBar.Create(this);
m_wndReBar.AddBar(&m_wndToolBar);
可以使用AddBar的第2、3個參數指定標籤和背景
m_bitmap.LoadBitmap(IDB_BKGND);m_wndReBar.AddBar(&m_wndToolBar,_T("Main"),&m_bitmap);
後記:這是第8章講解工具列,狀態列的篇章.後面還有一些知識點,我也會不定時地發布出來,希望是自己得到提高