| CDialogBar使用手記關(guān)鍵詞: CDialogBar
 調(diào)試了兩天CDialogBar,終于搞定了。其中參考了CSDN上的幾篇文章(CSDN還是不錯(cuò)的)。 現(xiàn)在把調(diào)試心得寫(xiě)出來(lái)。 ――――――――――――――――――――――――――― 以下一部分文章來(lái)自于CSDN的houen_study,我稍稍修改了一下文字:) 那就使用CDialogBar就可以擁有和CDialog一樣的方便和快捷。 步驟1:添加一個(gè)CDialogBar派生類(lèi) 在資源中添加一個(gè)對(duì)話框,再采用類(lèi)向?qū)?lái)添加類(lèi),找不到CDialogBar作為基類(lèi)吧,可以先用CDialog作為基類(lèi)產(chǎn)生一個(gè),然后把所以的“CDialog”替換為“CDialogBar”,替換完成了。編譯一下,^_^有錯(cuò)誤吧!?。ó?dāng)然有錯(cuò)誤,CDialogBar是從CControlBar中繼承過(guò)來(lái)的,不是從CDialogBar繼承過(guò)來(lái)的,不能直接替換)請(qǐng)看步驟2。 步驟2:解決編譯錯(cuò)誤并完善該類(lèi) 其實(shí)錯(cuò)誤就是構(gòu)著函數(shù)調(diào)用基類(lèi)時(shí)有問(wèn)題,: CDialogBar(/*CDlgBar::IDD, pParent*/) 象這樣注釋掉就可以了,添加一個(gè)類(lèi)似OnInitDialog的函數(shù),在CDialogBar中是不存在OnInitDialog的消息的,至少我還不知道。 因?yàn)槌跏蓟窃趧?chuàng)建后調(diào)用的,所以我們就重寫(xiě)virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID);這個(gè)函數(shù)。注意哦用向?qū)砑拥?/span>Create函數(shù)的參數(shù)是不對(duì)的喔,要按照上面的修改過(guò)來(lái)。 下面是實(shí)現(xiàn)代碼(很簡(jiǎn)單的) BOOL CDlgXXX::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID) { // TODO: Add your specialized code here and/or call the base class BOOL bRes= CDialogBar::Create(pParentWnd,nIDTemplate,nStyle,nID ); InitDialogBar();//在類(lèi)中添加一個(gè)成員函數(shù)就可以了 return bRes; } BOOL CDlgXXX::InitDialogBar() { UpdateData(FALSE);//這個(gè)一定要啊,這樣就會(huì)有和CDialog一樣的數(shù)據(jù)交換效果了 
 return TRUE; } 其實(shí)你也可以不用添加成員函數(shù),只用類(lèi)向?qū)砑右粋€(gè)OnInitDialog ()函數(shù),然后把CDialogBar::OnInitDialog();這句話注釋掉,呵呵,因?yàn)?/span>CControlBar沒(méi)有OnInitDialog()。然后添加UpdateData(FALSE);這句話就可以了,在UpdateData后面添加其他的控件初始化的工作就可以了。最后不要忘記在Create函數(shù)中顯式的調(diào)用OnInitDialog()函數(shù)。 步驟3:創(chuàng)建和使用 在CMainFrame的OnCreate函數(shù)中就可以創(chuàng)建和使用了 if (!m_barAttrib.Create(this,IDD_DLG_COM_ATTRIB, CBRS_RIGHT|CBRS_GRIPPER, XXX)) { TRACE0("Failed to create dialogbar\n"); return -1; } XXX是一個(gè)資源id手工直接在資源的.h文件中添加一條。 步驟4:在添加CDialogBar上添加控件 在你創(chuàng)建的Dialog上面放一個(gè)按鈕,運(yùn)行程序試一試,怎么按鈕是灰色的,即使在Dialog中添加了響應(yīng)事件,也沒(méi)有用。這個(gè)問(wèn)題困擾了我好長(zhǎng)時(shí)間,最后在CSDN上找到答案。按鈕消息不是發(fā)到Dialog上,而是直接發(fā)給CMainFrame上,也就是說(shuō)cdialogbar上面的按鈕消息只有映射到CMainframe上面才好使。這回你在CMainframe上面處理消息看看,滿意了吧。 在CSDN上有人是這么做的: ---------------------------------------------------- 這個(gè)問(wèn)題我也遇到過(guò),dialogbar上的控件消息可以直接由Mainframe類(lèi)處理,如果通過(guò)派生CDialogBar類(lèi)來(lái)處理消息的話有時(shí)確實(shí)會(huì)出現(xiàn)明明映射了消息處理函數(shù),但控件就是灰色。 我是這么解決的,在MainFrame里為控件再做一次消息映射,但處理函數(shù)里什么都不做,這樣控件一定是已經(jīng)enable了,這時(shí)候如果在DialogBar派生類(lèi)里也做了消息映射那么你的處理函數(shù)就已經(jīng)起作用了。 也就是說(shuō)在dialogbar派生類(lèi)處理控件消息比在mainframe中處理優(yōu)先級(jí)高,但在mainframe中有處理函數(shù)一定會(huì)將控件enable。 ------------------------------------------------------------- 但是當(dāng)我想改變按鈕狀態(tài)的時(shí)候,又出現(xiàn)問(wèn)題了,如何修改按鈕的屬性都不行,呵呵,又搞不定了:),繼續(xù)看。。。。。。 步驟5:如何使CDialogBar上的按鈕變灰 
 用下面的方法可以實(shí)現(xiàn): 先在MainFrm.h中加入一個(gè)變量: bool ENABLE; 并手工加入一個(gè)消息函數(shù)聲明: afx_msg void OnupdataButton(CCmdUI *pCmdUI); 然后在MainFrm.cpp中: 先在初始化中加入: ENABLE=true; 手工加入一個(gè)消息映射: ON_UPDATE_COMMAND_UI(IDC_BUTTON1,OnupdataButton) 再寫(xiě)函數(shù)的實(shí)現(xiàn)代碼: void CMainFrame::OnupdataButton(CCmdUI *pCmdUI) { if(ENABLE) { pCmdUI->Enable(0); } Else { pCmdUI->Enable(1); } } 在你想改變此按鈕的是否禁用處只要寫(xiě)ENABLE=!ENABLE;就可以了。呵呵,如果想控制多個(gè)按鈕的話,就需要設(shè)定多個(gè)BOOL型變量,分別寫(xiě)消息函數(shù)。 | 
|  | 
來(lái)自: langzi6606 > 《我的圖書(shū)館》