建立可變大小的CDialog Bar

2021-04-15 15:48:55 字數 2691 閱讀 3900

說明:翻譯時忽略了在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...