1. 程式人生 > >VC之控制元件篇(白喬原創)

VC之控制元件篇(白喬原創)

1 使用Windows標準控制元件

1.1 常見控制元件列表 Windows標準控制元件即普通控制元件,撰寫此文時,筆者每天面對的Word就帶了一臉的控制元件,當然你肯定也熟悉:字型選擇下拉框、工具欄、滾動條、狀態列,如此等等。 常見的Windows標準控制元件在VC裡就有: 圖2 控制元件集視窗 通常這個控制元件集視窗在你的對話方塊設計介面的附近總能找到,如果找不到,在VC工具欄的任何空白處點選右鍵,在彈出選單的Controls選單項前面打上勾即可,如圖所示: 圖3 顯示控制元件集視窗 你也許已經看到了,我們圖1所示的FlashPlayer中有3個控制元件是Windows標準控制元件,好,我們先系統地學習一下怎麼使用這3個控制元件。 1.2 引入控制元件
1. 準備對話方塊 對話方塊相當於控制元件的容器,我們當然要先準備一個對話方塊。好辦,直接建立一個基於對話方塊的工程就是了: 圖4 準備對話方塊Step 1 注意,在Step 2中要確認“3D Controls”和“ActiveX Controls”前面打上勾,如圖所示: 圖5 準備對話方塊Step 2 這樣你的程式就支援三維控制元件和我們後面即將使用到的ActiveX控制元件了。如果去掉了勾,或者你面對的正是你師兄當年準備論文的舊的 project,它好像並不支援ActiveX控制元件,那該怎麼辦呢(好多VC網友總是帶著那張哭喪臉的表情問我這種問題)?沒事,在主程式檔案的 InitInstance()函式頭部加上以下語句即可:
檢視原始碼
拷貝至剪貼簿列印程式碼
  1. BOOL CFlashPlayerApp::InitInstance()   
  2. {   
  3.     AfxEnableControlContainer();   
  4. #ifdef _AFXDLL 
  5.     Enable3dControls();         // Call this when using MFC in a shared DLL 
  6. #else 
  7.     Enable3dControlsStatic();   // Call this when linking to MFC statically 
  8. #endif 
  9. //… 
  10. }   
對話方塊準備好了,預設情況下,它總會自動帶上3個控制元件:2個按鈕,“確定”與“取消”和一個“TODO: 在這裡設定對話控制” 文字標籤。 2. 準備文字編輯框 文字標籤我們並不需要,那麼就直接刪除之。但我們需要一個文字編輯框,用以顯示Flash檔案路徑。引入新的Windows標準控制元件很簡單,只要簡單地從控制元件集視窗選擇相應的控制元件拖拽至對話方塊即可。好,我們拖來一個文字編輯框:
圖6 引入文字編輯框控制元件 1.3 設定控制元件屬性 引入來的控制元件,可以通過滑鼠簡單的拖拽調整其位置和大小,當然,你還可以通過屬性對話方塊來設計這個控制元件。在控制元件上右擊滑鼠,彈出選單: 圖7 控制元件的屬性視窗 這個選單即將覆蓋本教程的大部分內容,選單最下面的三行分別為: ClassWizard… 為控制元件建立類及變數 Events… 為控制元件對映事件 Properties 設定控制元件的屬性 前兩項後面的內容將要討論到,我們現在只關心Properties(屬性),點選它即可彈出文字編輯框的屬性介面: 圖8 文字編輯框的屬性介面 我們按照以下的步驟進行控制元件的屬性設定: 1. 在“General(普通)”標籤頁裡將文字編輯框的ID修改成IDC_FLASH_FILE,而不是預設的IDC_STATIC; 2. 在“Styles(樣式)”標籤頁裡將文字編輯框的Read-only打勾,這樣我們的文字編輯框就顯示成灰色,並且只讀。也就是說,它的,內容只能由程式更改,使用者不能手動輸入; 3. 同理,在兩個按鈕的“General(普通)”標籤頁裡,設定它們的Caption(標題),分別為“瀏覽…”和“退出”; 4. 在“瀏覽…”按鈕的“General(普通)”標籤頁裡,將它的ID設定成ID_BROWSER; 需要指出的是,每個控制元件都具有ID,就相當於每個人都具有一個身份證號。除了IDC_STATIC(它的值是-1),每個對話方塊的控制元件的ID都必須 唯一,不能重複。一些特定的ID代表特定的含義,如:IDOK對應於“確定”按鈕,IDCANCEL對應於“取消”按鈕,IDC_STATIC則對應於一 個匿名控制元件。MFC認識這些特定的ID,並賦值於指定的行為,例如:你可以不需要編寫任何程式碼,就可以使用“確定”按鈕關閉對話方塊,就是這個原因。 以上內容指引你如何修改控制元件的屬性,包括它的ID、標題以及樣式。這種修改都是所見即所得的,執行程式,你就會欣喜地發現,一切確實都改過來了。 1.4 對映控制元件變數 好了,你現在有了一個文字編輯框,可是如何使用它,你還是一無所知。那麼,我們開始學習如何將控制元件對映成一個變數,這個過程即“對映控制元件變數”,或曰“繫結控制元件變數”。 對映控制元件變數是VC的一個很好的功能,有了它,你就可以象使用一個變數一樣控制控制元件。對映成什麼型別的變數,這依賴於你的控制元件。一般來說,一個控制元件 可以對映成一個值變數(Value),也可以對映成一個控制元件物件(Control)。如:一個文字編輯框既可以對映成一個CString值,也可以對映成 一個CEdit物件,CString是個字串,而CEdit則是MFC為文字編輯框專門準備的控制元件類。 1.4.1 控制元件 -> 值變數 我們從簡單的入手,先將我們的檔案路徑文字編輯框對映成一個普通的值變數,按照以下操作慢慢來: 1. 在編輯框上開啟右鍵選單(如圖7所示),選擇ClassWizard…,彈出以下介面: 圖9 ClassWizard視窗 有點暈。先不管別的,因為我們要對映變數,我們就選擇“Member Variables”標籤頁, 這兒可以看到當前對話方塊中的所有控制元件,包括我們的文字框和其它兩個按鈕; 2. 找到我們的IDC_FLASH_FILE,雙擊之(或者點選“Add Variable…”按鈕),就彈出了對映控制元件變數視窗: 圖10 新增控制元件值變數 該介面分別要求輸入變數名、類別和變數型別,不用爭了,我們選擇Value和CString,將IDC_FLASH_FILE對映成CString m_sFilePath。 大功告成!可以同時觀察VC程式程式碼中的變化: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. class CFlashPlayerDlg : public CDialog   
  2. {   
  3. // … 
  4. // Dialog Data 
  5. //{{AFX_DATA(CFlashPlayerDlg) 
  6. enum { IDD = IDD_FLASHPLAYER_DIALOG };   
  7. CString m_sFilePath;   
  8. //}}AFX_DATA 
  9. }   
  10. CFlashPlayerDlg::CFlashPlayerDlg(CWnd* pParent /*=NULL*/)   
  11. : CDialog(CFlashPlayerDlg::IDD, pParent)   
  12. {   
  13. //{{AFX_DATA_INIT(CFlashPlayerDlg) 
  14.     m_sFilePath = _T("");   
  15. //}}AFX_DATA_INIT 
  16. // … 
  17. }   
  18. void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)   
  19. {   
  20.     CDialog::DoDataExchange(pDX);   
  21. //{{AFX_DATA_MAP(CFlashPlayerDlg) 
  22.     DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);   
  23. //}}AFX_DATA_MAP 
  24. }   
下面我們先試試這個CString m_sFilePath的使用,如: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. BOOL CFlashPlayerDlg::OnInitDialog()   
  2. {   
  3.     CDialog::OnInitDialog();   
  4.     m_sFilePath = "空即是色";   
  5. // … 
  6. }  
遺憾的是,以上的程式碼是沒用的!與Visual Basic不同,在VC的世界裡,對映的值變數與實際控制元件的內容並不保持同步,欲使用對映的值變數就必須額外地使用到UpdateData()函式,它的函式原型如下: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. CWnd::UpdateData   
  2. BOOL UpdateData( BOOL bSaveAndValidate = TRUE );  
簡單地說,UpdateData(TRUE)讀取對話方塊中各控制元件的內容,並及時反映到其對映值中去;UpdateData(FALSE)則恰恰相反,它將當前對映值反映到控制元件中去,如:在文字框裡面顯示你剛剛設定的字串“空即是色”。 我們現在是要通過變數修改控制元件,因此,我們採用UpdateData(FALSE),以上的程式碼修改成: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. BOOL CFlashPlayerDlg::OnInitDialog()   
  2. {   
  3.     CDialog::OnInitDialog();   
  4.     m_sFilePath = "請點選“瀏覽”按鈕選擇檔案!";   
  5.     UpdateData(FALSE);   
  6. // … 
  7. }  
現在的執行介面就可以看到m_sFilePath的內容了: 圖11 使用對映變數修改文字編輯框的內容 UpdateData ()如何知道哪些控制元件與哪些變數對映,靠的是DoDataExchange(),讀者沒必要對DoDataExchange()瞭解更多,但注意不要隨便手動修改DoDataExchange()中的程式碼。 1.4.2 控制元件 -> 控制元件物件 與值變數不同,如果對映變數是一個控制元件物件,那麼就沒有必要呼叫UpdateData ()來完成同步。將一個控制元件對映成控制元件物件也很簡單,依2.4.1的步驟而行,同樣彈出新增變數視窗: 圖12 新增控制元件物件變數 注意在Category(類別)一欄選擇Control,變數類型別無選擇,選擇CEdit,點選OK。這樣我們的IDC_FLASH_FILE即有了2個對映變數: 圖13 同時為控制元件繫結值變數和物件變數 同樣地,以上的對映亦體現在程式碼裡: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)   
  2. {   
  3.     CDialog::DoDataExchange(pDX);   
  4. //{{AFX_DATA_MAP(CFlashPlayerDlg) 
  5.     DDX_Control(pDX, IDC_FLASH_FILE, m_FilePathEdit);   
  6.     DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);   
  7. //}}AFX_DATA_MAP 
  8. }   
DDX_Control標明控制元件IDC_FLASH_FILE與m_FilePathEdit對映,接下來,我們就可以通過使用CEdit類來控制文字編輯框控制元件,如圖所示: 圖14 使用CEdit變數修改控制元件內容 這時候,使用如下程式碼同樣可以達到設定編輯框內容的效果: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. m_FilePathEdit.SetWindowText("請點選“瀏覽”按鈕選擇檔案!");  
相比而言,使用控制元件物件,可以最大限度地控制控制元件;但是,誰都知道,使用一個物件的步驟比操縱一個變數要麻煩得多。 刪除控制元件變數並不需要任何技巧,在ClassWizard視窗選定該變數,點選“Delete Variable”即可。為了配合後續教程,我們先刪掉這個CEdit m_FilePathEdit,在2.6節,我們將要把這個文字編輯框對映成我們自定義的型別。 1.5 響應控制元件事件 控制元件都是一個個的視窗,所以控制元件都有事件。最簡單的,按鈕被滑鼠按下時,將產生BN_CLICKED事件。 那好,就響應“瀏覽”按鈕的BN_CLICKED事件: 1. 彈出右鍵選單(如圖7所示),選擇“Events…”,彈出如下視窗: 圖15 控制元件事件視窗 視窗主要分成3部分:左側為當前控制元件的所有訊息列表,右上側為已響應的訊息,右下側為當前視窗所有的控制元件列表(包括視窗本身)。注意到我們的“瀏覽”按鈕現在還沒有任何已響應的訊息。 2. 雙擊左側的“BN_CLICKED”(或者點選右邊的“Add Handler”按鈕),即彈出如下視窗,提示為響應函式取個名字: 圖16 為事件響應函式命名 響應函式的名字一般皆以On打頭,預設的名字OnBrowser就蠻好,點選“OK”。 可以看到,現在我們的事件視窗已經包含了這個BN_CLICKED: 圖17 已新增事件響應 3. 選擇BN_CLICKED事件點選Edit Existing(也可以在上一步即點選Add and Edit),即可觀察到程式碼中已增加以下內容: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. BEGIN_MESSAGE_MAP(CFlashPlayerDlg, CDialog)   
  2. //{{AFX_MSG_MAP(CFlashPlayerDlg) 
  3.     ON_WM_SYSCOMMAND()   
  4.     ON_WM_PAINT()   
  5.     ON_WM_QUERYDRAGICON()   
  6.     ON_BN_CLICKED(ID_BROWSER, OnBrowser)   
  7. //}}AFX_MSG_MAP 
  8. END_MESSAGE_MAP()   
  9. void CFlashPlayerDlg::OnBrowser()    
  10. {   
  11. // TODO: Add your control notification handler code here     
  12. }   
4. 我們現在就可以修改這個OnBrowser()的程式碼,以實現我們需要的操作,既然我們希望它彈出一個選擇檔案的對話方塊,那麼我們就這麼寫: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. void CFlashPlayerDlg::OnBrowser()    
  2. {   
  3. //檔案對話方塊 
  4.     CFileDialog FileDialog(true".swf""", OFN_EXPLORER,   
  5. "Flash動畫檔案(*.swf)|*.swf|所有檔案(*.*)|*.*||"this);   
  6. //顯示對話方塊 
  7. if(FileDialog.DoModal() == IDOK)   
  8.     {   
  9.         m_sFilePath = FileDialog.GetPathName();   
  10.         UpdateData(FALSE);   
  11.     }   
  12. }   
呵呵,是不是又注意到UpdateData(FALSE)了?沒錯,將變數賦值了,就應該呼叫UpdateData(FALSE)將值反映出來。現在我們的執行介面可以選擇檔案了: 圖18 事件響應函式OnBrowser()的實現 新增事件處理還有一種方法,就是使用我們前面熟悉到的ClassWizard視窗,開啟“Message Maps(訊息對映)”標籤頁,即可管理我們的控制元件訊息: 圖19 使用ClassWizard視窗管理訊息對映 1.6 控制元件子類化 儘管Windows系統提供了各種豐富的控制元件,但總會有美中不足的時候。你是否注意到了?我們現在的文字框遠沒有FlashPlayer成品中的好看。FlashPlayer中的文字框黑底綠字,那叫一個酷! 那麼我們就準備在原有文字編輯框的基礎上再做一些定製,解決的辦法是控制元件的子類化。 子類化是應用於視窗的高階技術,當然就可以應用於控制元件。子類化其原理就在於它修改了視窗(控制元件)的類記憶體塊,這樣既有視窗(控制元件)就不知不覺地修改了自己的模樣和行為。 得益於控制元件的變數對映機制,在VC裡,子類化控制元件並不是一件很難的事情。具體操作就是:為控制元件準備一個新類,例如CCoolEdit。一般這些類都 從某個原有的MFC類(如:CEdit)繼承而來,這樣它就可以很方便地繼承基類的模樣和行為;接下來的工作,就是我們將控制元件對映成這個新的 CCoolEdit,完全如同CEdit一樣。 就這麼簡單,我們仔細走走看: 1. 準備子類; 已經有很好的CEdit類,既然我們要改造它,那就直接繼承它: 圖20 子類化CEdit 注意Class type選擇MFC Class,我們將這個新的子類命名為CCoolEdit。 2. 對映控制元件物件; 參照圖12,我們現在再開啟“新增控制元件變數”視窗,開啟變數型別列表,會發現我們的CCoolEdit已經赫然在列了。不錯,我們就對映一個CCoolEdit變數m_CoolEdit。 圖21 新增CCoolEdit物件變數 現在我們操作的控制元件即為CCoolEdit型別,實際上,誰都清楚,除了名字,我們的CCoolEdit 與CEdit類沒有什麼兩樣;這時候,執行程式,介面並不會發生任何變化。 既然我們需要FlashPlayer最終版本的那樣酷的文字輸入框,那我們繼續下一步。 3. 定製子類CCoolEdit; 多查點資料,我們就可以知道:在控制元件顯示之前,每一個控制元件都會向父對話方塊傳送一個WM_CTLCOLOR訊息要求獲取繪製所需要的顏色(更多內容可 以查閱《電腦愛好者合訂本》2003年(上)附錄分冊《VC++介面美化程式設計》篇)。只要響應WM_CTLCOLOR訊息,我們就可以修改控制元件的顏色。那 好,我們響應WM_CTLCOLOR訊息試試看。首先在類檢視選中CCoolEdit,彈出右鍵選單: 圖22 新增訊息處理函式 選擇Add Windows Message Handler…,即彈出以下視窗: 圖23 響應控制元件的WM_CTLCOLOR訊息 複習2.5節的內容,雙擊WM_CTLCOLOR,新增事件響應函式CCoolEdit::CtlColor()。接下來,我們可以在CtlColor()裡完成介面的定製: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. HBRUSH CCoolEdit::CtlColor(CDC* pDC, UINT nCtlColor)    
  2. {   
  3. // TODO: Change any attributes of the DC here 
  4. //設定前景色 
  5.     pDC->SetTextColor(RGB(0, 255, 0));   
  6. //設定字型背景色 
  7.     pDC->SetBkColor(RGB(0, 0, 0));   
  8. //設定背景色 
  9. return (HBRUSH)::GetStockObject(BLACK_BRUSH);   
  10. // TODO: Return a non-NULL brush if the parent's handler should not be called 
  11. }   
就這麼多了,執行程式,以下是執行結果: 圖24 CCoolEdit的執行結果 呵呵,怎麼樣?這個CCoolEdit你以後還可以使用到其它場合哦!什麼都不用做,只要正常地將你的文字輸入框對映成CCoolEdit就行了。 以上部分操縱的都是Windows標準控制元件,其實在Windows裡,你還會常常接觸到ActiveX控制元件,它來源於第三方,而非Windows操 作系統。這樣的控制元件一般來說,功能豐富而且使用方便,從而大大簡化了程式設計師的工作。本章節以我們需要使用到的Flash控制元件為例細作闡述。

1 使用ActiveX控制元件

以上部分操縱的都是Windows標準控制元件,其實在Windows裡,你還會常常接觸到ActiveX控制元件,它來源於第三方,而非Windows操 作系統。這樣的控制元件一般來說,功能豐富而且使用方便,從而大大簡化了程式設計師的工作。本章節以我們需要使用到的Flash控制元件為例細作闡述。 1.1 控制元件的註冊 不同於Windows標準控制元件,ActiveX控制元件需要註冊才能使用,ActiveX一般以.OCX或者.DLL檔案格式釋出,可以使用VC附帶的工具來註冊某個控制元件,按照以下步驟: 1. 在VC的Tools選單下啟動ActiveX Control Test Container; 2. 在ActiveX Control Test Container裡開啟選單File/Register Controls…; 3. 彈出視窗Register Controls顯示系統中已註冊的所有ActiveX控制元件,點選左下角的“Register…”按鈕; 4. 選擇待註冊的控制元件檔案,如:“C:/WINNT/system32/Macromed/Flash/swflash.ocx”即為Macromedia Flash的ShockwaveFlash控制元件檔案; 5. 點選“開啟”按鈕,即完成以上控制元件的註冊,我們可以在控制元件列表中發現它的名字為“ShockwaveFlash. ShockwaveFlash.1”; 以上操作畫面如圖所示: 圖25 註冊ActiveX控制元件 還有一種簡單一點的辦法,使用regsvr32註冊之即可,如圖示出注冊畫面: 圖26 使用regsvr32註冊ActiveX控制元件 對於某些軟體,安裝時即完成對自帶控制元件的註冊。例如:Macromedia Flash安裝之後,你的Internet瀏覽器就可以播放動畫了,你也可以在控制元件列表裡找到ShockwaveFlash控制元件。那麼這些軟體是如何完成 控制元件的自注冊的呢(這也是常見的問題之一)?一種途徑是使用安裝程式,它們可以自動完成ActiveX控制元件的註冊;另一種方法是利用程式呼叫 DllRegisterServer()即可: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. HMODULE hModule=LoadLibrary(sControlFilePath);   
  2. if(hModule)   
  3. {   
  4. FARPROC DLLRegisterServer = (FARPROC)GetProcAddress(hModule "DllRegisterServer");   
  5. if(DLLRegisterServer)   
  6. {   
  7. HRESULT regResult = DLLRegisterServer();   
  8. if(regResult != NOERROR)   
  9. MessageBox(NULL "註冊ActiveX控制元件時發生錯誤!""警告" MB_OK|MB_ICONINFORMATION);   
  10. }   
  11. FreeLibrary(hModule);   
  12. }  
1.2 引入控制元件 好了,目前為止,我們已經有Flash控制元件了,那麼我們在程式中引入它: 1. 在對話方塊設計介面空白處右鍵,彈出選單,選擇Insert ActiveX Control…,如下所示: 圖27 選擇Insert ActiveX Control 2. 在Insert ActiveX Control視窗中,在控制元件列表中選擇Shockwave Flash Object,如圖所示: 圖28 選擇Shockwave Flash Object 1. 好了,現在的Flash控制元件成功引入!我們繼續調整Flash控制元件的大小和位置: 圖29 引入Flash控制元件 引入ActiveX控制元件,還有一種途徑,就是通過Project/Add To Project/Componets and Controls…,然後選擇Registered ActiveX Controls。在此不再贅述。 1.3 設定控制元件屬性 面對這個新鮮的玩意兒,我們該設定設定屬性,讓它乾乾活。 介面確實變化了不少,Flash Properties標籤頁即列舉了Flash控制元件的屬性: 圖30 Flash控制元件的Flash Properties標籤頁 All標籤頁則以值的方式列出了該控制元件的所有屬性: 圖31 Flash控制元件的All標籤頁 做過Flash的朋友可能對這些屬性的含義要熟悉一點,例如:Quality用以設定動畫的畫面質量,Scale則指定動畫的顯示方式,Play和Loop決定動畫是否一開始就播放以及是否迴圈播放,如此等等。 我們現在讓這個控制元件播放一則動畫,操作太簡單了,將Movie URL設定成動畫檔案路徑即可: 圖32 設定Flash的Movie URL 執行程式,乖乖,該來的都來了: 圖33 FlashPlayer執行介面 1.4 對映控制元件變數 小試牛刀,看來已初顯成效,我們現在來更好地控制這個控制元件,第一步,對映變數: 1. 將控制元件的ID設定成IDC_FLASH_SCREEN; 2. 複習2.4節的內容,開啟ClassWizard視窗; 3. 選擇IDC_FLASH_SCREEN,雙擊之,不好,好像不太一樣: 圖34 提示視窗 VC可以自動每一個ActiveX控制元件封裝出一個類作為未來的控制元件變數的型別,如果你還希望對映控制元件變數,那麼選擇“確定”。 4. 接下來的操作是為這個自動生成的類指定類名和檔名: 圖35 確認類名和檔名 別找樂了,使用預設的CShockwaveFlash就很好,我們繼續。 5. 接下來的畫面比較熟悉,我們選擇Control和CShockwaveFlash: 圖36 新增控制元件物件變數 ActiveX控制元件沒有值變數,只有一個控制元件物件變數,這個變數的型別就是前面準備好的CShockwaveFlash,沒問題,我們將Flash控制元件取名為m_FlashScreen。 1.5 響應控制元件事件 ActiveX控制元件也具有自身的事件,例如我們的IDC_FLASH_SCREEN具有以下事件: 圖37 ActiveX控制元件事件 事件的響應與標準控制元件一樣,在此不再贅述。 1.6 呼叫控制元件方法 前面已經提及,不管是標準控制元件,還是ActiveX控制元件,都可以對映成物件變數。既然是物件,我們就可以呼叫成員函式(或曰方法,method)來完成特定的功能,下面我們結合FlashPlayer來學習CShockwaveFlash方法的呼叫。 通過3.4,我們可以發現VC已經幫我們準備了兩個檔案shockwaveflash.cpp和shockwaveflash.h,以及一個類CShockwaveFlash: 圖38 CShockwaveFlash的類框架 VC會自動提取控制元件的所有方法和屬性,並封裝成我們所熟悉的成員函式形式。CShockwaveFlash為我們準備了不少的函式,我們先用一個熟悉點的試試: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. void CShockwaveFlash::SetMovie(LPCTSTR lpszNewValue)   
  2. {   
  3. staticBYTE parms[] = VTS_BSTR;   
  4.     InvokeHelper(0x66, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,  lpszNewValue);   
  5. }   
這個SetMovie()可以用來設定當前播放動畫的URL,估計相當於屬性窗口裡面的Movie URL。我們使用這個SetMovie()結合“瀏覽”按鈕來實現選擇播放功能: 檢視原始碼拷貝至剪貼簿列印程式碼
  1. void CFlashPlayerDlg::OnBrowser()    
  2. {   
  3.     CFileDialog FileDialog(true".swf""", OFN_EXPLORER,   
  4. "Flash動畫檔案(*.swf)|*.swf|所有檔案(*.*)|*.*||"this);   
  5. if(FileDialog.DoModal() == IDOK)   
  6.     {   
  7.         m_sFilePath = FileDialog.GetPathName();   
  8.         UpdateData(false);   
  9.         m_FlashScreen.SetMovie(m_sFilePath);   
  10.     }   
  11. }   
嗯,執行FlashPlayer,執行介面如下所示,它現在已支援檔案選擇的功能了: 圖39 支援點播的FlashPlayer

1 常見控制元件推薦

FlashPlayer程式至此打造完畢,以下向大家推薦一些比較有用的控制元件: 1.1 MsChart控制元件 控制元件名稱:Microsoft Chart Control 6.0 (sp4) 控制元件類:CMsChart 控制元件簡介:MsChart是微軟製作的功能強大的圖表工具,用它可以很方便的建立各種圖表,包括各種二維、三維的餅圖、折線圖、直方圖、折線圖、面積圖等。 應用圖例: 圖40 MsChart控制元件應用圖例 1.2 DataGrid控制元件 控制元件名稱:Microsoft DataGrid Control 6.0 (sp5) 控制元件類:CDataGrid 控制元件簡介:DataGrid控制元件是由微軟提供的資料表格控制元件,需要與ADODC控制元件配合使用。通過使用DataGrid控制元件,可以很方便地實現資料表記錄的瀏覽、增加、刪除和修改功能。 應用圖例: 圖41 DataGrid控制元件應用圖例 1.3 MsComm控制元件 控制元件名稱:Microsoft Communications Control version 6.0 控制元件類:CMsComm 控制元件簡介:MSComm 控制元件提供了一系列標準通訊屬性和方法,使用它可以建立起應用程式與串列埠的聯接。 應用圖例: 圖42 MsComm控制元件應用圖例 以上畫面來源於筆者自行製作的手機通訊軟體FreePhone,其底層採用MsComm控制元件,感興趣的讀者可以參見http://bluejoe.yeah.net。 1.4 Web瀏覽器控制元件 控制元件名稱:Web瀏覽器控制元件 控制元件類:CWebBrowser2 控制元件簡介:Web瀏覽器相信大家再也熟悉不過了,IE瀏覽器就內嵌了一個Web瀏覽器控制元件,這也就是為什麼騰訊瀏覽器與IE如此相似的原因。通過使用Web瀏覽器控制元件,可以很方便地實現網頁頁面的瀏覽和顯示。 應用圖例: 圖43 Web瀏覽器控制元件應用圖例 1.5 ActiveMovie控制元件 控制元件名稱:ActiveMovie Control Object 控制元件類:CActiveMovie3 控制元件簡介:ActiveMovie是Microsoft公司開發的視訊播放控制元件。該控制元件內嵌了Microsoft MPEG音訊解碼器和Microsoft MPEG視訊解碼器,播放控制更加簡捷方便。 應用圖例: 圖44 ActiveMovie控制元件應用圖例

2 結束語

控制元件是好東西,有了它,絕對會節省你的不少時間和精力。如果你正在為某個複雜的實現而苦惱萬分,那麼筆者建議你先上網查查是否已經有相應的控制元件可供 下載使用。一個專業的控制元件往往會比你考慮得要周密得多,也要方便得多。而你的任務就是如何使用它,如何去推廣它;當然,如果你有好的程式碼,譬如是一個底層 硬體通訊的工程類,我也希望你會將這些東西封裝成控制元件,然後貢獻出來,讓大家一塊共享你的成就和快樂! 本文主要通過大量示例指引讀者瞭解和使用Windows控制元件以及ActiveX控制元件。

1 前言

1.1 控制元件之於VC 控制元件與Visual C++沒有直接的關係,控制元件是Windows作業系統的介面元素,而VC只是一種開發語言。VC可以編寫Windows程式,當然也可以編寫Windows介面,包括最熟悉的對話方塊介面。 對話方塊介面是初學者學習VC的一道門檻,學習複雜的文件/視對於初學者來說是很痛苦的事情。而對話方塊的優點就在於它的“所見即所得”,設計介面畫得有多好看,程式執行介面就有多好看。而如何讓你的對話方塊的介面更豐富一點,那就是控制元件的事情了。 所以,你,責無旁貸的,要先學好控制元件的使用;而本次教程,正是指引你如何在VC裡實現控制元件程式設計。 控制元件是視窗,是個完成特定功能的小視窗。例如:最熟悉的列表框控制元件可以讓你用來列出你所有女友的名字; 控制元件放置在對話方塊裡,對話方塊就成為控制元件的容器,或曰父視窗;而控制元件就成為對話方塊的元素,或曰子視窗。 控制元件並不總是顯示成一個視窗,它可以是隱藏著的,例如:你可以使用定時器控制元件來控制“神五”的發射,但沒必要一定要在發射系統的主介面上土土地畫上一隻小鬧鐘。 你用來選擇女友名字的列表框是Windows系統標準控制元件,用來指示大爆竹昇天的定時器也是。但Windows系統為你考慮的總會有限,那麼就需要 一些先行的人(第三方)為你準備一些他們出品的控制元件,這些符合Windows規範的控制元件即ActiveX控制元件,對於合法佔有(但願是真的合法佔有)這些控 件的你,就完全可以象使用Windows標準控制元件一樣大大方方地使用它們。ActiveX控制元件的使用與標準控制元件一樣簡便快捷,你可以使用MsComm控制元件 讓你的電腦總是在深夜撥打我的電話,或者使用ActiveMovie控制元件反覆播放你最鍾愛的影片(譬如,“三個代表”的學習材料),如此這些,都是 ActiveX控制元件的應用。 同樣的,你也可以使用Macromedia公司的Flash控制元件來播放所有有關Snoopy的Flash動畫,而這,正是本文要為你講述的。 1.2 主要內容 本教程指引你完成以下介面,它是一個輕型的Flash瀏覽器: 圖1 輕型的Flash瀏覽器FlashPlayer 不是很酷,但至少還能說明一些問題。這個簡單的介面包含以下4個控制元件:
  • 文字編輯框,用以顯示使用者選擇的檔案路徑,如:“D:/movies/星語心願.swf”;
  • “瀏覽”按鈕,用以支援使用者選擇Flash檔案;
  • “退出”按鈕,用以結束本程式,相當於“安全門”;
  • Flash瀏覽視窗,用以顯示Flash畫面,是FlashPlayer的主會場;
前3者是Windows標準控制元件,Flash瀏覽視窗則不同,它來源於Macromedia Flash,是一個ActiveX控制元件。 通過本教程,筆者承諾你可以學習到以下內容(當然,你首先要熟悉Visual C++):
  • 控制元件的引入,即如何將一個控制元件加入到你的VC工程中來;
  • 控制元件屬性的設定,即如何通過屬性的修改來設計控制元件的執行介面;
  • 控制元件變數的對映,即如何象使用通常的一個變數一樣操縱一個控制元件;
  • 控制元件事件的響應,即如何處理控制元件的事件;
  • 控制元件方法的呼叫,即如何呼叫控制元件的既有函式來操作它;
僅此而已,你不可能再學習到其它的話題,你也不會接觸到諸如ActiveX製作等方面的內容,那樣只會沖淡本次教程的主題,讓你的頭更疼。