VS2008SP1中CDialogEx的使用問題及解決
系統環境:Windows 7
軟件環境:Visual Studio 2008 SP1
本次目的:建立一個CDialogEx的對話框
我們知道在VS2008SP1引進了BCG第三方控件,可以使MFC界面編程容易些,但是關于這方面的資料并不多。可能是我使用的系統因素,在建立對話框時,選擇“生成的類”基于CDialogEx后,發現代碼并沒有把創建的對話框派生CDialogEx ,而還是派生自CDialog。所以我們只能手動改之。對于一個新建立的對話框,這里我建立的名字為Test 工程,我們開始進行以下步驟:
1. 在TestDlg.h 中,修改以下地方:
class CTestDlg : public CDialogEx //原本為CDialog
{····};
2. 在TestDlg.cpp 中,修改以下地方:
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialogEx (CTestDlg::IDD, pParent) //原本為CDialog(CTestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx ::DoDataExchange(pDX); //原本為CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx ) //原本為BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CTestDlg::OnInitDialog()
{
CDialogEx ::OnInitDialog(); //原本為CDialog::OnInitDialog()
····
}
void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
·······
else
{
CDialogEx ::OnSysCommand(nID, lParam); //原本為CDialog::OnSysCommand(nID, lParam);
}
}
void CTestDlg::OnPaint()
{
········
else
{
CDialogEx ::OnPaint(); //原本為CDialog:::OnPaint();
}
}
3.一共修改七個地方,現在編譯運行,就可以正常使用了。
在MSDN中,CDialogEx 有兩個比較經常用到的方法,SetBackgroundColor 和SetBackgroundImage ,分別是設置背景顏色和背景圖片。一個函數就可以搞定背景顏色了,就不必像上次 我寫的那么麻煩了。例如,背景顏色,只要在對話框初始化函數OnInitDialog() 中添加以下代碼就行了:
SetBackgroundColor(RGB(255,0,255));
效果如下:
對于背景圖片SetBackgroundImage 的設置,MSDN上定義的是:
void SetBackgroundImage( HBITMAP hBitmap, BackgroundLocation location=BACKGR_TILE, BOOL bAutoDestroy=TRUE, BOOL bRepaint=TRUE ); BOOL SetBackgroundImage( UINT uiBmpResId, BackgroundLocation location=BACKGR_TILE, BOOL bRepaint=TRUE );
有兩種方法可以設置,這里舉例第二種。導入一張Bmp位圖資源,假設其ID號為IDB_BITMAP1 ,如果我們要讓圖片鋪滿(TILE )窗口,即直接使用以下代碼:
SetBackgroundImage(IDB_BITMAP1);
對于第二個參數,風格有 BACKGR_TILE, BACKGR_TOPLEFT, BACKGR_TOPRIGHT, BACKGR_BOTTOMLEFT, 和 BACKGR_BOTTOMRIGHT。可以設置圖片的位置,但是卻沒有拉伸和居中功能,我們只能自己重載,或者使用別人已經實現的類(http://www.codeproject.com/KB/dialog/bmpdlg01.aspx )
默認風格如下: