VC嚮導製作

2022-06-21 10:54:13 字數 4225 閱讀 5607

嚮導是一種用來簡化使用者操作的程式。在microsoft 的所有產品中都存在嚮導,如office2000 中的web 頁嚮導就是乙個十分典型的向 導(如下圖所示),還有常用的vc++嚮導。

乙個基本的嚮導程式應該包含以下幾個基本按鈕: 取消、上一步、下一步、完成、幫助。

一、標準嚮導程式

在 vc++中,可以使用類cpropertysheet和類cpropertypage方便地編寫乙個嚮導程式。

首先我們來介紹一下類cpropertysheet 和類cpropertypage。

1. 類cpropertypage 是從cdiaglog中派生出來的,具有diaglog的基本性質,需要注意的是它的樣式必須是child。

2. 類cpropertysheet 是乙個屬性表,也是乙個窗體,相當乙個容器,用來存放所有的cpropertypage。它不是 從cdialog

派生出來的,但是它可以象普通對話方塊類似的操作, 如domodal(),當用 domodal()顯示

生成乙個新類,命名為cstep1,基類為cpropertypage,且將dialog id

設定為剛生成的資源idd_step1。這樣就生成了乙個新屬性頁step1。如此操作就可以 同樣生成step2、step3

屬性頁。為了方便顯示,在每個對話方塊都放置了乙個控制項,用來表示當前是哪一步。

④ 建立 cpropertysheet。新建乙個類,命名為cwizard,基類為cpropertysheet。並將屬性頁和屬性表關聯起來。**為

//將**放在按鈕idc_beginwiz的click事件中

cwizard mywizard(_t("我的嚮導 "),this,1); //生成乙個屬性表

cstep1 mystep1; //屬性頁1

cstep2 mystep2; //屬性頁2

cstep3 mystep3; //屬性頁3

mywizard.addpage(&mystep1); //新增屬性頁1

mywizard.addpage(&mystep2); //新增屬性頁2

mywizard.addpage(&mystep3); //新增屬性頁3

mywizard.setwizardmode(); //將屬性表設定成嚮導樣式

mywizard.setactivepage(&mystep1); //設定第一頁為第一步

mywizard.domodal(); //顯示屬性表

⑤協調顯示。在每一頁為當前頁時,都會觸發onsetactive事件,故對每乙個屬性頁都要過載該函式,在cstep1類上選擇add virtual function ...。因為顯示第一頁時,不存在「上一步」,故在cstep1的 onsetactive函式中需要新增如下**:

//**放在onsetactive函式中

cpropertysheet* pparent=(cpropertysheet*)getparent(); // 獲得屬性表的指標

pparent->setwizardbuttons(pswizb_next); // 設定屬性表的顯示按鈕只為下一步

setdlgitemtext(idc_text1,"這是嚮導的第一步");

cpropertysheet* pparent=(cpropertysheet*)getparent(); 

pparent->setwizardbuttons(pswizb_next|pswizb_back);

setdlgitemtext(idc_text2,"這是嚮導的第二步");

最後在顯示最後一頁時只顯示「完成」和「上一步」,**為:

cpropertysheet* pparent=(cpropertysheet*)getparent(); 

pparent->setwizardbuttons(pswizb_finish|pswizb_back);

setdlgitemtext(idc_text3,"這是嚮導的第三步");

這樣乙個基本的嚮導程式就完成了,其效果如圖所示

二、自定義嚮導程式

通過上面的例子,我們不難發現標準的嚮導基本能滿足要求,但仍然存在一些缺陷:

1.不能改變嚮導按鈕的樣式,如想在「上一步」、「下一步就」按鈕上新增圖示

2.不能象上面的web嚮導一樣有個「完成」按鈕進行預設設定

3.不能修改嚮導按鈕的位置

上述缺陷是因為我們採用了cpropertysheet類,而cpropertysheet類不是乙個可修改的資源。

為了達到個性化嚮導的目的,我們可以不使用cpropertysheet類和cpropertypage類。

設計的基本思路:

1. 採用標準的嚮導的工作方式。每一步就是乙個對話方塊,嚮導本身也是乙個對話方塊,用來容納每步對話方塊.

2. 每步的對話方塊應 該沒有title、沒有邊界、樣式為child,當點選「下一步」或「上一步」時,將這個 對話方塊定位到要顯示的位置。

3. 因為嚮導一般都包含很多步,為了管理這些頁,我們可以建立乙個鍊錶來管理每一步的對話方塊。

4. 為了方便對話方塊定位,可以事先定義好位置。三、自定義嚮導的實現

1. 工程的建立與基本介面的生成

為了方便敘述,表1將所用的類進行了歸納

(表1)

類名基類

說明cwizard

cdialog

嚮導的框架

cstep1

cdialog

嚮導的第一步

cstep2

cdialog

嚮導的第二步

cstep3

cdialog

嚮導的第三步

ccustomwizarddlg

cdialog

啟動嚮導

3. 在cwizard新增要使用的資料結構

為了方便描述,表2列出了使用到的成員變數

(表2)

成員變數

型別說明

rectpage

crect

每頁顯示的範圍

npagecount

uint

頁的總數

ncurrentpage

uint

正在顯示的頁

npagelink

pagelink*

用來鏈結所有的頁

typedef struct pagelink;

nnum為頁的編號

pdialog為頁所對應的對話方塊的指標

4. cwizard所使用到的函式 新增乙個新頁到wizard框架,入口引數為要新增的對話方塊指標和id

void cwizard::addpage(cdialog* pdialog, uint nid)

else // 空鍊錶

ppagelink=pnewpage; //若是第乙個節點

}

顯示的頁,入口引數為要顯示的某特定頁的編碼

void cwizard::showpage(uint npos) 

else

//不顯示

ptemp->pdialog->showwindow(sw_hide);

ptemp=ptemp->next;

} if (npos>=npagecount) //最後一頁

if (npos<=1) //首頁

//如果是中間步

setwizbutton(1);

}

為了與顯示統一,需要相應的設定按鈕

void cwizard::setwizbutton(uint uflag) 

}

void cwizard::onprev()  

void cwizard::onnext()

void cwizard::onfinish()

void cwizard::oncancel()

5. 輔助**,如初始化等

bool cwizard::oninitdialog()  

因為是無模式窗體,所以要自己銷毀窗體

void cwizard::ondestroy()

}

6. 啟動嚮導需要在idc_beginwiz 按鈕的click事件中加入下列**:

cwizard mywiz; //顯示嚮導 

mywiz.domodal();

VC6工程嚮導製作

最近突然發現每天寫點教程對自己的學習很有幫助,所以以後每天都盡量寫點東西吧。關於win32工程嚮導,也許還有很多人不知道這是個什麼玩意,其實很簡單,每次你建立工程檔案的時候vc總會讓你選擇一種是win32專案還是控制台程式等等,這就是嚮導,而今天我要做的就是乙個簡單的窗體嚮導,使用這個嚮導以後,你可...

製作Delphi「嚮導」

crystal studio web delphi 利用製作delphi 嚮導 在許多應用軟體中,利用各種 嚮導 使用者可以完成不同的操作。在delphi中利用乙個form就可以製作出 嚮導 下面用乙個簡單的例子來說明。1.新建一工程,此工程中包含兩個form form1 form2,對應單元名le...

C 製作嚮導

1.formbase上。namespacedatabase public wizardcontroller controller null region函式 自定義函式 public void disablebutton else if this.controller.islastform 如果是嚮...