新一代32位操作系統(tǒng)WINDOWS 95舍棄了VBX控件,取而代之的是OCX控件。OCX控件具有功能強(qiáng)大,界面美觀的特點(diǎn),然而許多參考書(shū)中并沒(méi)有詳細(xì)闡述OCX控件的使用方法,使得一些如數(shù)據(jù)庫(kù)表格,遠(yuǎn)程數(shù)據(jù)控件等接口復(fù)雜的OCX難于使用。這里將詳細(xì)闡述OCX的使用方法。 首先提醒讀者要注意的是:使用OCX構(gòu)件之前,必須登記注冊(cè),否則不能使用。安裝VISUAL C++時(shí),系統(tǒng)自動(dòng)注冊(cè)登記軟件附帶的OCX控件。如果不幸沒(méi)有登記,那么請(qǐng)使用REGSVR32應(yīng)用程序來(lái)注冊(cè)。以VISUAL C++ 5.0為例,用AppWizard生成MFC應(yīng)用程序分為六個(gè)步驟,其中第三個(gè)步驟中可以指定支持OLE控制,也就是我們要使用的OCX控件(是OLE的一種)。如果指定該選項(xiàng),則AppWizard將自動(dòng)向應(yīng)用程序添加以下兩處代碼。 一處是為了說(shuō)明OLE自動(dòng)類如ColeDispathcDriver,自動(dòng)向Stdafx.h中加入頭文件afxdisp.h 二是在InitInstance函數(shù)中激活OLE控制容器: AfxEnableContainer(); 如果在利用AppWizard創(chuàng)建應(yīng)用程序是未指定OLE控制選項(xiàng),則可以手工加入以上兩行代碼。 在生成應(yīng)用框架后,首先應(yīng)向應(yīng)用程序加入OCX控件對(duì)應(yīng)的類,如遠(yuǎn)程數(shù)據(jù)控件的缺省名為RDC,而數(shù)據(jù)表格的缺省名為MSDBGRID。加入的過(guò)程是選擇Project菜單項(xiàng),選擇Add to Project,選擇Components and Controls項(xiàng),選擇Registered ActiveX Controls項(xiàng), 雙擊你要加入的構(gòu)件。 然后,通常是在對(duì)話框中加入OCX控制,這時(shí)應(yīng)在對(duì)話框中單擊右鍵,選擇Insert ActiveX Controls,選擇你要加入的控件。這里以遠(yuǎn)程數(shù)據(jù)控件為例。 可以在設(shè)計(jì)時(shí)設(shè)定屬性,當(dāng)然,在運(yùn)行時(shí)刻再設(shè)置屬性值更具有靈活性。屬性中比較關(guān)鍵的是這幾個(gè):
(1) CursotDriver:(2)DataSourceName (3)SQL。具體的設(shè)置見(jiàn)所附的程序。
以下程序是一個(gè)無(wú)模式對(duì)話框的源代碼:此程序段實(shí)現(xiàn)了一個(gè)與FOXPRO數(shù)據(jù)源相連接的遠(yuǎn)程數(shù)據(jù)控件和一個(gè)與遠(yuǎn)程數(shù)據(jù)庫(kù)控件相連的瀏覽數(shù)據(jù)庫(kù)用的表格。數(shù)據(jù)源(DataSource)名稱為“檔案”,其中包含幾個(gè)表(Table),程序中選擇的是表2。用戶當(dāng)然也可以很輕松的在運(yùn)行時(shí)刻改變連接對(duì)應(yīng)的SQL屬性,以便能夠?yàn)g覽同一數(shù)據(jù)庫(kù)的不同表格,或是不同數(shù)據(jù)庫(kù)的不同表格。數(shù)據(jù)源的建立方法為:控制面板->32位ODBC->ADD…。
// Datatab.cpp : implementation file #include "stdafx.h" #include "Datatab.h" #include <afxcmn.h> #include <afxcview.h>
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
//////////////////////////////////////// CDatatab dialog
CDatatab::CDatatab(CView * pView):CDialog() { m_pView = pView; }
BOOL CDatatab::Create() { return CDialog::Create(CDatatab::IDD); }
CDatatab::CDatatab(CWnd* pParent /*=NULL*/) : CDialog(CDatatab::IDD, pParent) { //{{AFX_DATA_INIT(CDatatab) //}}AFX_DATA_INIT }
void CDatatab::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDatatab) DDX_Control(pDX, IDC_REMOTEDATACTL1, m_rdc1); DDX_Control(pDX, IDC_DBGRID1, m_grid1); //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CDatatab, CDialog) //{{AFX_MSG_MAP(CDatatab) ON_WM_CLOSE() ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP()
/////////////////////////////// CDatatab message handlers
void CDatatab::OnClose() { // TODO: Add your message handler code here and/or call default DestroyWindow(); CDialog::OnClose(); }
void CDatatab::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CDialog::OnPaint() for painting messages }
BOOL CDatatab::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_rdc1.SetDataSourceName("檔案"); m_rdc1.SetSql(_T("SELECT 姓名 年齡 出生日期,from 表2")); m_rdc1.SetCaption("數(shù)據(jù)倉(cāng)庫(kù)"); m_rdc1.SetUserName(_T("admin")); m_rdc1.SetPassword(_T("")); m_rdc1.SetCursorDriver(1); m_rdc1.Refresh();
LPUNKNOWN pCursor=GetDlgItem(IDC_REMOTEDATACTL1)->GetDSCCursor(); ASSERT(pCursor!=NULL); m_grid1.SetDataSource(pCursor); //bind the grid m_grid1.BindProperty(0x9,GetDlgItem(IDC_REMOTEDATACTL1));
return TRUE; // return TRUE unless you set the focus to a control }
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!