說明:翻譯時忽略了在mfc4.0以前版本中的所採用的方法。
[問題敘述]:mfc實現的cdialogbar在floating狀態的時候是不允許改變大小的。如果dialog bar包含有需要動態改變大小的控制項,我們就可以使用下面介紹的方法來改變dialog bar的大小。
[方法]:在mfc4.0以後,control bar就內建了對可變大小的支援。但是,dialog bar並不能通過預設的行為來獲得這個支援。為了讓dialog bar能改變大小,我們需要:
1. 建立dialog bar的時候加上cbrs_size_dynamic風格。
2. 新增**,過載calcdynamiclayout()函式。
在mfc4.0及以後的高版mfc中,control bar支援新的cbrs_size_dynamic風格,cbrs_size_dynamic風格允許乙個浮動的control bar在使用者拖動邊框的時候能動態的改變大小。還增加了虛函式ccontrolbar::calcdynamiclayout() 來控制control bar的大小。
不管control bar是在停靠還是浮動狀態,當乙個浮動的的control bar的邊框拖動時,具有cbrs_size_dynamic 風格的control bar就會呼叫calcdynamiclayout() 函式。ccontrolbar預設呼叫calcfixedlayout(), 而這個函式阻止了control bar物件改變大小,除非我們過載calcdynamiclayout()函式。cdialogbar沒有過載calcdynamiclayout(), 所以在預設情況下它是不能改變大小的。
因此,建立乙個可變大小的dialog bar我們需要
1 從 cdialogbar 繼承乙個類來過載calcdynamiclayout()函式,可以根據我們需要的行為決定是否為這個類增加乙個成員變數。
2 建立乙個具有 cbrs_size_dynamic風格的例項,最常見的方法是cmainframe::oncreate()函式裡建立:
if (!m_wnddialogbar.create(this, idd_dialogbar, cbrs_top | cbrs_size_dynamic, 777))
m_wnddialogbar.enabledocking(cbrs_align_any);
dockcontrolbar(&m_wnddialogbar);
注意:idd_dialogbar對話方塊資源必須要具有ws_child風格,並且不能具有其他的任何風格。
下面是示例**:
/* compile options needed: default
*/ // resizabledlgbar.h : header file
// class cresizabledlgbar : public cdialogbar
}afx_virtual
virtual csize calcdynamiclayout( int nlength, dword dwmode );
// implementation
public:
// generated message map functions
protected:
//}afx_msg
declare_message_map()
};/
// resizabledlgbar.cpp : implementation file
// #include "stdafx.h"
#include "resizabledlgbar.h"
// cresizabledlgbar construction/destruction
bool cresizabledlgbar::create( cwnd* pparentwnd, uint nidtemplate,
uint nstyle, uint nid, bool bchange)
bool cresizabledlgbar::create( cwnd* pparentwnd,
lpctstr lpsztemplatename, uint nstyle,
uint nid, bool bchange)
// overloaded functions
csize cresizabledlgbar::calcdynamiclayout(int nlength, dword dwmode)
if (dwmode & lm_mruwidth)
return m_sizefloating;
// in all other cases, accept the dynamic length
if (dwmode & lm_lengthy)
return csize(m_sizefloating.cx, (m_bchangedockedsize) ?
m_sizefloating.cy = m_sizedocked.cy = nlength :
m_sizefloating.cy = nlength);
else
return csize((m_bchangedockedsize) ?
m_sizefloating.cx = m_sizedocked.cx = nlength :
m_sizefloating.cx = nlength, m_sizefloating.cy);
}
建立可變大小的CDialog Bar
說明 翻譯時忽略了在mfc4.0以前版本中的所採用的方法。問題敘述 mfc實現的cdialogbar在floating狀態的時候是不允許改變大小的。如果dialog bar包含有需要動態改變大小的控制項,我們就可以使用下面介紹的方法來改變dialog bar的大小。方法 在mfc4.0以後,cont...
錯誤 可變大小的物件不能被初始化
c語言中定義了32個關鍵字。include include void main 非法 編譯階段不能用到變數 printf 輸出為 c n a 0 編譯 qust qust k42jz test gcc test const.c o test const test const.c 在函式 main 中...
C STL中vector(可變大小陣列)用法總結
標準庫型別vector表示某種型別物件的集合,集合中每個物件都有乙個與之對應的索引,用以訪問物件。要想使用vector,必須包含標頭檔案vector,並且需要宣告using std vector。hljs cpp 建立和初始化vector物件 建立乙個包含t型別元素的空vector vector v...