如何改變MFC應用程式主視窗的類名

2021-06-20 14:06:42 字數 2551 閱讀 5040

說明mfc自動建立的應用程式中,主視窗的類名是固定的。但在許多情況下,你可能希望自己擬定mfc的主視窗的類名。

如果你想進行程序間通訊(ipc),這種技術就更顯得簡潔有效。最早的實現不同程序間通訊的方法是傳送訊息,但是傳送訊息需要知道傳送的目標物件,即確定目標視窗,識別出它的id。

一種方法是迭代所有具有最上面顯示屬性的視窗,然後選出目標視窗的類名或者視窗名稱,或者你也可以向所有視窗廣播乙個註冊的視窗訊息。這兩種方法顯得過於繁瑣,因為我們通過一種方法可以直接乙個特定的視窗。

windows提供了乙個函式findwindow,它可以根據乙個特定的名稱或者類名找到特定的視窗。

windows中的視窗的標題常常由於開啟檔案的不同而發生改變,甚至使用者改變了本地語言(當然前提是程式支援多種語言),視窗標題也會發生改變。但是如果你能給乙個類預定義乙個類名,那麼你就可以根據這個唯一的類名找到這個視窗。

唯一的問題是,mfc建立的程式的類名在mfc程式建立時已經被預定義了。對於乙個給予dialog的程式來說,這個預定義的類名是#32770。

背景知識

根據上面的分析,程式設計師現在面臨的唯一的問題就是如何改變mfc程式的預定義的名稱。

對於mfc sdi/mdi程式來說,我們可以通過函式 cmainframe::precreatewindow 來改變類名。

對於基於dialog的程式來說,我們可以定義乙個資源模板,在這個資源裡指定類名,然後在vs編譯程式時強制它載入這個資源。

sdi/mdi程式的**示例

如果你用mfc建立乙個sdi/mdi程式,你會發現乙個函式cmainframe::precreatewindow,在視窗建立過程中,這個函式會被呼叫很多次,應為它裡面提供了視窗的類資訊、視窗的風格等相關的視窗資訊。

你可以重寫這個函式,把乙個視窗類名為你定義的名稱的視窗類物件註冊後,然後把視窗類名賦給返回值的類名屬性,以供後續步驟繼續使用。

下面給出了乙個程式設計師自己重寫的函式cmainframe::precreatewindow的示例。

bool cmainframe::precreatewindow(createstruct& cs)

}// now use our class 

cs.lpszclass = pszclassname;

return true;

}基於dialog程式的**示例

在乙個基於dialog的程式中,你需要做兩件事。

一般的,基於對話方塊的程式中,其對話方塊的類名是"#32770"。當你想用乙個不同的類來建立乙個對話方塊時,那就需要告知程式對話方塊模板的類名,因為我們不能不能像處理sdi/mdi程式一樣干預對話方塊的建立。在以往的vs程式中,我們可以開啟資源編輯器,改變對話方塊的類名,但是vs-2008和vs-2010裡面有乙個bug,所以它們倆不允許我們指定類名。在資源編輯器中這個屬性值的屬性框是灰色的,所以不能改變類名。即使你通過其他手段改變了類名,這個地方也顯示不出改變後的正確值。

所謂的其他手段,就是你可以在你的程式開啟前,用其他編輯器,如記事本程式代開你的資源檔案,找到你的對話方塊模板後,在其中新增一行classname屬性。新增完畢後,vs編譯程式時會根據這行屬性確定的類名來定義乙個視窗,它不會刪除這行值。

示例**:

idd_ownclassnamedlg_dialog dialogex 0, 0, 199, 28

style ds_setfont | ds_fixedsys | ws_popup | ws_visible | 

ws_caption | ws_sysmenu | ws_thickframe

caption "ownclassnamedlg"

class "ownclassnamedlg"

font 8, "ms shell dlg", 0, 0, 0x1

begin

...剩下的事情,就是在待用函式dlg.domodal()之前,註冊乙個新的基於系統類#32770的視窗類,這個類的名稱就是你剛才指定的類名。

**並不是很複雜,示例如下:...

// just get default class for the dialogs

wndclass wndcls;

::getclassinfo(null,makeintresource(32770),&wndcls);

// set our own class name

wndcls.lpszclassname = _t("ownclassnamedlg");

// just register the class

if (!::registerclass(&wndcls))

cownclassnamedlgdlg dlg;

m_pmainwnd = &dlg;

int_ptr nresponse = dlg.domodal();

...補充說明:實際上,"#32770"並不能被稱為乙個視窗類名。它只是乙個註冊的對話方塊類的id值,**makeintresource(32770)會把它變成類的名稱。你也可以使用字串"32770"來代表這個類。

囉嗦了一大堆,希望你喜歡我上面給你的這個小技巧。

qt應用程式主視窗

qmainwindow視窗可以包含選單欄 工具欄 狀態列 標題欄等,是最常見的視窗形式,可以作為gui程式的主視窗 1 設定選單 setmenubar方法 標頭檔案 qmenubar 2 設定工具欄 add 方法 標頭檔案 q 3 設定可停靠部件 adddockwidget qmainwindow的...

3 10 如何使主應用程式視窗居中?

為了使主應用程式視窗在桌面 顯示,mfc提供了一種簡單的方法,即利用cwnd centerwindow 函式來實現。在主應用程式視窗的oncreate 函式中插入centerwindow 的呼叫。int cmainframe oncreate lpcreatestruct lpcreatestruc...

MFC修改應用程式視窗外觀

1.視窗建立之前修改 bool cmainframe precreatewindow createstruct cs 執行結果 2.視窗建立之後修改 int cmainframe oncreate lpcreatestruct lpcreatestruct 執行結果 3.字串資源idr mainfr...