讀書筆記–MFC Windows程式設計(一)

來源:互聯網
上載者:User

前言:在看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章講解工具列,狀態列的篇章.後面還有一些知識點,我也會不定時地發布出來,希望是自己得到提高

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.