當(dāng)對(duì)話框DoModal返回后,對(duì)話框句柄被銷毀,同時(shí),對(duì)話框中的所有控件的句柄都會(huì)被銷毀,所以所有的控件類型都不可用,但是普通的值類型對(duì)象的值還是存在的知道對(duì)話框?qū)ο笊芷诮Y(jié)束。
在VC6.0中將很多控件調(diào)整為一樣大小的或者對(duì)齊排列時(shí)候開始總是不知以哪一個(gè)為標(biāo)準(zhǔn),試了幾次發(fā)現(xiàn):用CTRL和鼠標(biāo)左鍵選中的以最后一個(gè)為標(biāo)準(zhǔn),用鼠標(biāo)圈住時(shí)以第一個(gè)進(jìn)入的為標(biāo)準(zhǔn)。
HWND是Windows系統(tǒng)中對(duì)所有窗口的一種標(biāo)識(shí),即窗口句柄。這是一個(gè)SDK概念。
CWnd是MFC類庫(kù)中所有窗口類的基類。微軟在MFC中將所有窗口的通用操作都封裝到了這個(gè)類中,如:ShowWindow等等,同時(shí)它也封裝了窗口句柄即m_hWnd成員。
由HWnd得到CWnd*:
CWnd wnd;
HWnd hWnd;
wnd.Attach(hWnd);
通常一個(gè)窗口資源已經(jīng)和一個(gè)CWnd類的對(duì)象關(guān)聯(lián)起來的,由于一般來說這個(gè)類是自己創(chuàng)建的,所以自然知道怎么得到指向這個(gè)類的指針。如果沒有就創(chuàng)建一個(gè)CWnd對(duì)象,將這個(gè)對(duì)象與窗口資源的hWnd句柄關(guān)聯(lián)起來。(如上邊的語(yǔ)句)。如果用
static CWnd* CWnd::FromHandle(HWND hWnd) ;
則返回值是一個(gè)暫時(shí)的CWnd對(duì)象,并且我們確保返回值為非空,也就是hWnd是有效的。
static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ;
返回的是一個(gè)永久的對(duì)象。只有在返回的CWnd在類表里已經(jīng)存在是返回值為非空。
由CWnd獲取HWnd就容易多了,因?yàn)樗囊粋€(gè)成員m_hWnd就是所對(duì)應(yīng)窗口的句柄。
wnd->m_hWnd。
---- 方法一:調(diào)用CWinApp類的成員函數(shù)SetDialogBkColor來實(shí)現(xiàn)。
---- 其中函數(shù)的第一個(gè)參數(shù)指定了背景顏色,第二個(gè)參數(shù)指定了文本顏色。
下面的例子是將應(yīng)用程序?qū)υ捒蛟O(shè)置為藍(lán)色背景和紅色文本,步驟如下:
---- ① 新建一個(gè)基于Dialog的MFC AppWizard應(yīng)用程序ExampleDlg。
---- ② 在CExampleDlgApp ::InitInstance()中添加如下代碼:
BOOL CExampleDlgApp: : InitInstance ( )
{
…
CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()調(diào)用,將對(duì)話框設(shè)置為藍(lán)色背景、紅色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
int nResponse = dlg.DoModal();
…
}
---- 編譯并運(yùn)行,此時(shí)對(duì)話框的背景色和文本色已發(fā)生了改變。值得注意的
是:在調(diào)用DoModal()之前必須先調(diào)用SetDialogBkColor,且此方法是將改變
應(yīng)用程序中所有的對(duì)話框顏色,并不能針對(duì)某一個(gè)指定的對(duì)話框。
---- 方法二:重載OnPaint(),即WM_PAINT消息。有關(guān)代碼如下(以上例工程為準(zhǔn)):
void CExampleDlgDlg::OnPaint()
{
if (IsIconic())
…
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(0,255,0)); //設(shè)置為綠色背景
CDialog::OnPaint();
}
---- 方法三:重載OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),
即WM_CTLCOLOR消息。具體步驟如下(以上例工程為準(zhǔn)):
---- ①在CExampleDlgDlg的頭文件中,添加一CBrush的成員變量:
class CExampleDlgDlg : public CDialog
{
...
protected:
CBrush m_brush;
...
};
---- ②在OnInitDialog()函數(shù)中添加如下代碼:
BOOL CExampleDlgDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一綠色刷子
...
}
---- ③利用ClassWizard重載OnCtlColor(…),即WM_CTLCOLOR消息:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
/*
** 這里不必編寫任何代碼!
**下行代碼要注釋掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
*/
return m_brush; //返加綠色刷子
}
---- 方法四:還是重載OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),
即WM_CTLCOLOR消息。具體步驟如下(以上例工程為準(zhǔn)):
---- 步驟①、②同上方法三中的步驟①、②。
---- 步驟③利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時(shí)則有
些不同:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在這加一條是否為對(duì)話框的判斷語(yǔ)句
if(nCtlColor ==CTLCOLOR_DLG)
return m_brush; //返加綠色刷子
return hbr;
}
原帖見:
http://topic.csdn.net/t/20020821/08/957154.html
在棧上創(chuàng)建CPaintDC對(duì)象是良好的編程習(xí)慣,這樣當(dāng)OnPaint結(jié)束時(shí)將自動(dòng)調(diào)用他們的析構(gòu)函數(shù)。如果用new操作符來實(shí)例化一個(gè)CPaintDC對(duì)象,在OnPaint結(jié)束之前刪除那個(gè)對(duì)象很重要。否則::EndPaint將不會(huì)被調(diào)用。
Visual C++有一種簡(jiǎn)單的方法用來確定是否成功刪除了畫筆,畫刷和其他資源:只要在調(diào)試狀態(tài)下運(yùn)行程序。在應(yīng)用程序終止時(shí),沒有釋放的資源會(huì)顯示在調(diào)試窗口中。
在最新版本的Windows中,允許GDI對(duì)象在設(shè)備描述表釋放的前一刻被刪除并沒有什么不好的影響,尤其是當(dāng)你能確保在此期間沒有畫圖程序執(zhí)行時(shí)更是如此。但是通過取消選定選入的對(duì)象而實(shí)現(xiàn)清除設(shè)備描述表仍然是Windows編程中的慣例。同時(shí)也是一種好習(xí)慣。
當(dāng)寫下:
char ch[5];
ch = "last";
編譯提示:error C2106: '=' : left operand must be l-value。所以只能在數(shù)組定義的同時(shí)用字符串常量來給它賦值。
但是寫下:
char *pa;
pa = "last";
就不會(huì)有錯(cuò)誤。說明數(shù)組名字是一個(gè)常指針,不能被重新賦值。
引用和指針的的靜態(tài)類型和動(dòng)態(tài)類型可以不同,這是C++用以支持多態(tài)的基石。
在同一虛函數(shù)的基類版本和派生類版本使用不同的默認(rèn)實(shí)參幾乎一定會(huì)引起麻煩!
設(shè)計(jì)良好的類的層次中,public派生類對(duì)象可以用在任何需基類對(duì)象的地方。