在用vc開發應用程式時,經常會要做一些可以改變大小的對話方塊,而這個時候就要求對話方塊上的控制項會隨著對話方塊大小的改變而改變自己的位置和大小。如果控制項比較少,那可以在對話方塊的onsize()事件裡面新增**,通過計算來調整各個控制項的位置和大小;但是,如果對話方塊上的控制項比較多的話,那這將是一件非常痛苦的事情!要是程式中又有很多可以改變大小的對話方塊,那乙個乙個的onsize()寫下來,那會使程式設計師崩潰的!
為了解決這個問題,我寫了乙個自動改變控制項位置和大小的對話方塊類clxdialog。從這個類繼承的對話方塊類,只要在oninitdialog()裡對控制項做一些簡單的設定,對話方塊上的控制項就會隨著對話方塊大小的改變而改變自己的位置和大小(當然,別忘了把對話方塊的border屬性改為resizing)。
為了儲存控制項資訊,我定義了乙個結構:
typedef struct _dlgcontroltag
dlgctlinfo, *pdlgctlinfo;
這裡要對結構中的iflag和ipercent進行一些解釋。其中iflag是下面的列舉值:
enum
;ipercent表示改變值佔對話方塊改變值的百分比。例如,乙個控制項的ipercent值為100,iflag值為movex,那麼當對話方塊的寬度改變100個單位的時候,這個控制項就在x方向移動100個單位;又如,乙個控制項的ipercent值為100,iflag值為elasticxy,那麼當對話方塊的寬度和高度分別改變100個單位的時候,控制項的高度和寬度也相應的改變100個單位。
下面是設定控制項資訊的函式:
bool setcontrolproperty(pdlgctlinfo lp, int nelements);
使用起來非常簡單,在對話方塊的oninitdialog()函式裡面新增類似下面的**就行了:
// 控制項資訊陣列
static dlgctlinfo dcmenugroup = ,,
,,,,
,,,,
,,,,
};// 設定控制項資訊
setcontrolproperty(dcmenugroup, sizeof(dcmenugroup)/sizeof(dlgctlinfo));
下面就是使用上面這段**的對話方塊改變大小前後的效果圖:
對兩張截圖的比較我們可以很容易的理解上面那段**。
我還提供了乙個函式:
void showsizeicon(bool bshow = true);
來設定是否顯示對話方塊右下角表示可以改變大小的圖示。這個圖示是從系統中讀取的,我上面的截圖是windows2000下的,在windowsxp中就會自動變成xp風格的。
好了,閒話不多說了,下面貼出該對話方塊類clxdialog的源**,裡面有詳細的注釋:
lxdialog.h檔案:
//// 自動改變控制項位置和大小的對話方塊類
// 檔名:lxdialog.h
//class clxdialog : public cdialog
dlgctlinfo, *pdlgctlinfo;
enum
;// 設定控制項資訊
bool setcontrolproperty(pdlgctlinfo lp, int nelements);
// 是否在對話方塊右下角顯示表示可改變大小的圖示
void showsizeicon(bool bshow = true);
protected:
virtual bool oninitdialog();
afx_msg void onsize(uint ntype, int cx, int cy);
afx_msg void onsizing(uint nside, lprect lprect);
declare_message_map()
private:
int m_iclientwidth; // 對話方塊client區域的寬度
int m_iclientheight; // 對話方塊client區域的高度
int m_iminwidth; // 對話方塊的最小寬度
int m_iminheight; // 對話方塊的最小高度
pdlgctlinfo m_pcontrolarray; // 控制項資訊陣列指標
int m_icontrolnumber; // 設定控制項資訊的控制項個數
bool m_bshowsizeicon; // 是否顯示表示可改變大小的圖示
cstatic m_wndsizeicon; // 放圖示的靜態控制項
// 儲存圖示的bitmap
cbitmap m_bmpsizeicon;
bitmap m_bitmap;
};lxdialog.cpp檔案:
//// 自動改變控制項位置和大小的對話方塊類
// 檔名:lxdialog.cpp
//#include "stdafx.h"
#include "lxdialog.h"
// 表示可改變大小的圖示id
#ifndef obm_size
#define obm_size 32766
#endif
clxdialog::clxdialog(uint nid, cwnd* pparent /*=null*/)
: cdialog(nid, pparent)
, m_iclientwidth(0)
, m_iclientheight(0)
, m_iminwidth(0)
, m_iminheight(0)
, m_pcontrolarray(null)
, m_icontrolnumber(0)
, m_bshowsizeicon(true)
{}begin_message_map(clxdialog, cdialog)
on_wm_size()
on_wm_sizing()
end_message_map()
bool clxdialog::oninitdialog()
void clxdialog::onsize(uint ntype, int cx, int cy)
for (int i = 0; i < m_icontrolnumber; i++)
// 把控制項移動到新位置
pwndctrl->movewindow(ileft, itop, iwidth, iheight);}}
// 把圖示移動到對話方塊右下角
if (iswindow(m_wndsizeicon.getsafehwnd()))
invalidate();
// 記錄對話方塊client區域的大小
if (ntype != size_minimized)
}void clxdialog::onsizing(uint nside, lprect lprect)
bool clxdialog::setcontrolproperty(pdlgctlinfo lp, int nelements)
void clxdialog::showsizeicon(bool bshow /*=true*/)
VC中自動改變控制項位置和大小的對話方塊類
在用 vc開發應用程式時,經常會要做一些可以改變大小的對話方塊,而這個時候就要求對話方塊上的控制項會隨著對話方塊大小的改變而改變自己的位置和大小。如果控制項比較少,那可以在對話方塊的onsize 事件裡面新增 通過計算來調整各個控制項的位置和大小 但是,如果對話方塊上的控制項比較多的話,那這將是一件...
VC中自動改變控制項位置和大小的對話方塊類
typedef struct dlgcontroltag dlgctlinfo,pdlgctlinfo 這裡要對結構中的iflag和ipercent進行一些解釋。其中iflag是下面的列舉值 enum ipercent表示改變值佔對話方塊改變值的百分比。例如,乙個控制項的ipercent值為100,...
VC中自動改變控制項位置和大小的對話方塊類
在用vc開發應用程式時,經常會要做一些可以改變大小的對話方塊,而這個時候就要求對話方塊上的控制項會隨著對話方塊大小的改變而改變自己的位置和大小。如果控制項比較少,那可以在對話方塊的onsize 事件裡面新增 通過計算來調整各個控制項的位置和大小 但是,如果對話方塊上的控制項比較多的話,那這將是一件非...