古詩詞大全網 - 成語查詢 - 壹個vc關於創建窗口的問題,很簡單。

壹個vc關於創建窗口的問題,很簡單。

mydlg->SetWindowText(abc);//改變窗口標題

"可能"和下面的內容有關,能理解多少看妳自己了

學mfc學到文檔,視圖和框架的時候,知道必須在這三個類的派生類的類聲明

裏加上DECLARE_DYNCREATE,然後在類聲明外合適的地方加上IMPLEMENT_DYNCREA

TE,然後文檔,視圖和框架,還有文檔模板就可以協調工作了。查看msdn,發現

類似的宏有這幾對:

DECLARE_DYNAMIC 和 IMPLEMENT_DYNAMIC

DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE

DECLARE_SERIAL 和 IMPLEMENT_SERIAL

雖然msdn裏介紹了他們的作用,但對於它們為什麽會起這樣的作用心裏卻沒

底,於是翻了翻mfc的源代碼,喜歡鉆牛角尖的人可以和我壹起來鉆壹鉆。

1。

RUNTIME_CLASS宏的定義是這樣的:

#define RUNTIME_CLASS(class_name)

((CRuntimeClass*)(&class_name::class##class_name))

其中##的意思是把##兩邊的符號都進行宏擴展(如果它們是宏的話),然後把擴展

後的內容連接在壹起,中間不加空格。例如:RUNTIME_CLASS(CView)將被擴展成

(CRuntimeClass*)(&CView::classCView)

但這個classCView是什麽意思?原來,classCView是由DECLARE_DYNAMIC(CView)

引入的壹個public屬性的CRuntimeClass類型的靜態成員變量:

static const AFX_DATA CRuntimeClass classCView;

原來RUNTIME_CLASS的作用就是引用由DECLARE_DYNAMIC宏引入的靜態成員變

量。

2。DECLARE_DYNAMIC(class_name)

由於篇幅的原因,宏的具體定義代碼就不列出來了,感興趣的可以去看文件

afx.h。

該宏往類中聲明了三個成員:

protected:

static CRuntimeClass* PASCAL _GetBaseClass();

public:

virtual CRuntimeClass* GetRuntimeClass() const;

static const AFX_DATA CRuntimeClass class##class_name;

有兩個成員函數,壹個靜態成員變量class+類名,同RUNTIME_CLASS相似,如

果是DECLARE_DYNAMIC(CView)的話,這個靜態成員變量將是classCView。可見這

個成員變量的名稱是和DECLARE_DYNAMIC的參數有關的。在下文我們把這個成員變

量統統記做class##class_name。

這個靜態成員和兩個成員函數在哪裏被初始化和具體實現呢?原來是在IMPL

EMENT_DYNAMIC宏裏。

3。IMPLEMENT_DYNAMIC(class_name, base_class_name)

查看它的宏定義,如果_AFXDLL被定義了的話,由DECLARE_DYNAMIC引入的成

員的初始化和實現是這樣的:

CRuntimeClass* PASCAL class_name::_GetBaseClass()

{

return RUNTIME_CLASS(base_class_name);

}

CRuntimeClass* class_name::GetRuntimeClass() const

{

return RUNTIME_CLASS(class_name);

}

AFX_COMDAT const AFX_DATADEF

CRuntimeClass class_name::class##class_name =

{

#class_name,

sizeof(class class_name),

0xFFFF,

NULL,

NULL,

&class_name::_GetBaseClass,

NULL

};//這是在初始化靜態成員變量class##class_name。

//CRuntimeClass結構的各個成員的意義可查看msdn。

4。_DECLARE_DYNAMIC(class_name)

該宏的定義和DECLARE_DYNAMIC(class_name)基本壹樣。不同之處是靜態成員

class##class_name前面沒有const修飾符。

5。DECLARE_DYNCREATE(class_name)

該宏也往類中引入了DECLARE_DYNAMIC宏所引入的那三個成員。除此之外,它

還另外引入了壹個成員:

static CObject* PASCAL CreateObject();

該宏引入的成員在IMPLEMENT_DYNCREATE裏初始化和實現。

6。IMPLEMENT_DYNCREATE(class_name, base_class_name)

該宏自然是初始化和實現由DECLARE_DYNCREATE引入的成員了。

我們看看CreateObject的實現:

CObject* PASCAL class_name::CreateObject()

{

{

return new class_name;

}

呵,這個函數是如此簡單,它就是用CObject類裏重載的new操作符創建壹個

該類類型的對象。

7。_DECLARE_DYNCREATE(class_name)

該宏引入了和DECLARE_DYNCREATE引入的四個成員差不多的成員。唯壹的區別

是該宏引入的靜態成員class##class_name前面沒有const修飾符。

8。DECLARE_SERIAL(class_name)

該宏引入了和_DECLARE_DYNCREATE所引入的壹樣的四個