MFC程式設計中「佔位符和動態建立」技巧的應用

2021-09-30 12:10:27 字數 2154 閱讀 1305

在mfc程式設計中,「佔位符和動態建立」技巧的應用是十分廣泛的,雖然在有些程式設計書籍和文章中有所涉及,但缺乏系統的介紹和必要的總結,給應用帶來不便。本文將對這方面的程式設計技巧進行介紹,並對該技巧的應用範圍和注意事項都進行了詳細的總結。

一、引言

mfc提供了windows環境下應用開發的一套標準類,多數情況下能滿足應用開發的需要,但在某些具體情況下為了開發具有個性的應用,開發者需在mfc的基礎上使用一些技巧加以變通,「佔位符和動態建立」就是其中一種。

動態建立mfc程式設計中是一項較常用的技巧,即根據需要在某一位置動態建立有關控制項、視窗,但該方法有不便之處,即控制項位置的確定是非常繁瑣的。「佔位符和動態建立」技巧在此基礎上,合理利用windows的顯示是在平面上的特點以及microsoft visual c++的編輯環境,解決了這一問題。該方法首先在需要顯示的位置預先放置乙個有特定標示符的「佔位符」,「佔位符」隨建立位置不同可以是乙個按鈕(在工具欄中),窗格(在狀態列中)或是pictrue控制項(在對話方塊中),其大小可根據需要通過編輯環境或有關**調整;然後在放置「佔位符」的地方「動態建立」所需的介面元素。

利用這項技巧可以實現windows應用中一些常見但mfc不支援的介面,例如在工具欄、狀態列上建立一些非按鈕控制項;在對話方塊中建立工具欄、狀態列或乙個控制項;在對話方塊中嵌入乙個屬性表或另乙個對話方塊,等等。下面通過例項詳細介紹該技巧的使用。

二、例項說明

屬性表是一種很有用的介面元素,為我們採集大量資料帶來了便利,但如遇到「查詢」等需要在對話方塊中嵌入屬性表的情況,則只有借助「佔位符和動態建立」技巧才能滿足我們的要求。下面通過構造乙個類似windows「查詢」應用的例程來說明該技巧的使用,該例程是vc++6.0環境下的對話方塊應用,生成有關**後可按以下步驟進行。

1. 設定「佔位符」

首先在對話方塊中需要嵌入屬性表的位置放置乙個picture控制項,除需設定乙個特定的標示符id外控制項的屬性可採用預設設定。找到控制項的方法一般有兩種:或是利用classwizard將該控制項對映為對話方塊類的資料成員(是乙個cstatic類的例項),本例採用這種方法;或是在程式中根據「佔位符」的特定id,利用getdlgitem () 函式獲得對控制項的控制權。

然後在對話方塊編輯器中將picture控制項的大小調整為對應屬性頁對話方塊的大小。

最後在對話方塊的oninitdialog ( ) 函式中加入如下**,以獲得「佔位符」位置並作相應的座標轉換,其中m_ctrlholder是「佔位符」經classwizard對映所得的cstatic類的例項。

crect rect;

m_ctrlholder.getwindowrect (&rect);

screentoclient (&rect);

2. 生成屬性表和屬性頁**

根據需要生成要建立的屬性表和屬性頁的**,這一步可照常進行。

3.屬性表的「動態建立」及資料交換

完成以上準備工作後就可以動態建立屬性表了。首先,在對話方塊類中加入一公有資料成員,是屬性表的乙個例項或指標,用於對屬性表的操作如動態建立和資料交換。

然後,在oninitdialog函式中緊接步驟1的**加入「動態建立」的**,即在pictrue控制項的位置「動態建立」屬性表以覆蓋pictrue控制項,從而實現在對話方塊中嵌入屬性表的目的。動態建立屬性表如建立無模式對話方塊一樣呼叫create()函式,但必須指明ws_child、ws_visible屬性,其餘屬性根據需要再行新增。另外在對話方塊中嵌入屬性表時必須指定ws_tabstop和ws_ex_controlparent屬性,從而使tab鍵能順利傳遞焦點。

最後,需對屬性表的有關控制項進行資料交換,這可通過屬性表資料成員、屬性頁的資料成員及updatedata()函式來完成。有關**如下:

//在堆裡生成對話方塊的屬性表資料成員m_ppropsheet並「動態建立」屬性表「控制項」;

m_ppropsheet = new cqrypropsheet (this);

if (! m_ppropsheet -> create (this,ws_child | ws_visible, 0))

//對屬性表進行初始化,本例中對「包含子資料夾」核取方塊進行了初始化;

m_ppropsheet -> m_page1.m_bchildfolder = true;

m_ppropsheet -> m_page1.updatedata (false);

//修改屬性表屬性使tab鍵能傳遞焦點,並且屬性錶能接受焦點;

MFC中的動態建立

1 為了能夠動態建立,程式必須維護乙個cruntimeclass的類,當需要去識別乙個類的時候,就依次去查詢這個鍊錶,而這個是通過一組巨集來實現的。因為是乙個鍊錶,所以就需要初始化,這個初始化在cobject中用稍有不同的巨集來實現的。2 cruntimeclass的結構 lpcstr m lpsz...

c 中的「 」和佔位符

的問題 在c 中有兩種意義 一是數學中的加號的含義,這是當 兩邊都為數字型別的時候表示兩數相加。另一含義是連線符,這是當 兩邊只要有乙個是字元型別的資料時,他就是相當於連線符將兩者連線。具體例子如 我們要編寫一句 我叫慕容紫霄,我今年22歲,我的月薪是7648元 那麼可以這麼寫 在函式main中寫入...

C 中的 和 佔位符

c 中 的三種用法 1.忽略轉移字元 string str c windows system32 string str c windows system32 2.字串跨行 string str select from employee as e inner join contact as c on ...