VC之控制元件篇(白喬原創)
阿新 • • 發佈:2019-01-25
1 使用Windows標準控制元件
1.1 常見控制元件列表 Windows標準控制元件即普通控制元件,撰寫此文時,筆者每天面對的Word就帶了一臉的控制元件,當然你肯定也熟悉:字型選擇下拉框、工具欄、滾動條、狀態列,如此等等。 常見的Windows標準控制元件在VC裡就有: 圖2 控制元件集視窗 通常這個控制元件集視窗在你的對話方塊設計介面的附近總能找到,如果找不到,在VC工具欄的任何空白處點選右鍵,在彈出選單的Controls選單項前面打上勾即可,如圖所示: 圖3 顯示控制元件集視窗 你也許已經看到了,我們圖1所示的FlashPlayer中有3個控制元件是Windows標準控制元件,好,我們先系統地學習一下怎麼使用這3個控制元件。 1.2 引入控制元件- BOOL CFlashPlayerApp::InitInstance()
- {
- AfxEnableControlContainer();
- #ifdef _AFXDLL
- Enable3dControls(); // Call this when using MFC in a shared DLL
- #else
- Enable3dControlsStatic(); // Call this when linking to MFC statically
- #endif
- //…
- }
- class CFlashPlayerDlg : public CDialog
- {
- // …
- // Dialog Data
- //{{AFX_DATA(CFlashPlayerDlg)
- enum { IDD = IDD_FLASHPLAYER_DIALOG };
- CString m_sFilePath;
- //}}AFX_DATA
- }
- CFlashPlayerDlg::CFlashPlayerDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CFlashPlayerDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CFlashPlayerDlg)
- m_sFilePath = _T("");
- //}}AFX_DATA_INIT
- // …
- }
- void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CFlashPlayerDlg)
- DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);
- //}}AFX_DATA_MAP
- }
- BOOL CFlashPlayerDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_sFilePath = "空即是色";
- // …
- }
- CWnd::UpdateData
- BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
- BOOL CFlashPlayerDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_sFilePath = "請點選“瀏覽”按鈕選擇檔案!";
- UpdateData(FALSE);
- // …
- }
- void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CFlashPlayerDlg)
- DDX_Control(pDX, IDC_FLASH_FILE, m_FilePathEdit);
- DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);
- //}}AFX_DATA_MAP
- }
- m_FilePathEdit.SetWindowText("請點選“瀏覽”按鈕選擇檔案!");
- BEGIN_MESSAGE_MAP(CFlashPlayerDlg, CDialog)
- //{{AFX_MSG_MAP(CFlashPlayerDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(ID_BROWSER, OnBrowser)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- void CFlashPlayerDlg::OnBrowser()
- {
- // TODO: Add your control notification handler code here
- }
- void CFlashPlayerDlg::OnBrowser()
- {
- //檔案對話方塊
- CFileDialog FileDialog(true, ".swf", "", OFN_EXPLORER,
- "Flash動畫檔案(*.swf)|*.swf|所有檔案(*.*)|*.*||", this);
- //顯示對話方塊
- if(FileDialog.DoModal() == IDOK)
- {
- m_sFilePath = FileDialog.GetPathName();
- UpdateData(FALSE);
- }
- }
- HBRUSH CCoolEdit::CtlColor(CDC* pDC, UINT nCtlColor)
- {
- // TODO: Change any attributes of the DC here
- //設定前景色
- pDC->SetTextColor(RGB(0, 255, 0));
- //設定字型背景色
- pDC->SetBkColor(RGB(0, 0, 0));
- //設定背景色
- return (HBRUSH)::GetStockObject(BLACK_BRUSH);
- // TODO: Return a non-NULL brush if the parent's handler should not be called
- }
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()即可: 檢視原始碼拷貝至剪貼簿列印程式碼- HMODULE hModule=LoadLibrary(sControlFilePath);
- if(hModule)
- {
- FARPROC DLLRegisterServer = (FARPROC)GetProcAddress(hModule "DllRegisterServer");
- if(DLLRegisterServer)
- {
- HRESULT regResult = DLLRegisterServer();
- if(regResult != NOERROR)
- MessageBox(NULL "註冊ActiveX控制元件時發生錯誤!""警告" MB_OK|MB_ICONINFORMATION);
- }
- FreeLibrary(hModule);
- }
- void CShockwaveFlash::SetMovie(LPCTSTR lpszNewValue)
- {
- staticBYTE parms[] = VTS_BSTR;
- InvokeHelper(0x66, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, lpszNewValue);
- }
- void CFlashPlayerDlg::OnBrowser()
- {
- CFileDialog FileDialog(true, ".swf", "", OFN_EXPLORER,
- "Flash動畫檔案(*.swf)|*.swf|所有檔案(*.*)|*.*||", this);
- if(FileDialog.DoModal() == IDOK)
- {
- m_sFilePath = FileDialog.GetPathName();
- UpdateData(false);
- m_FlashScreen.SetMovie(m_sFilePath);
- }
- }
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的主會場;
- 控制元件的引入,即如何將一個控制元件加入到你的VC工程中來;
- 控制元件屬性的設定,即如何通過屬性的修改來設計控制元件的執行介面;
- 控制元件變數的對映,即如何象使用通常的一個變數一樣操縱一個控制元件;
- 控制元件事件的響應,即如何處理控制元件的事件;
- 控制元件方法的呼叫,即如何呼叫控制元件的既有函式來操作它;