新一代32位操作系統WINDOWS 95捨棄了VBX控件,取而代之的是OCX控件。OCX控件具有功能強大,界面美觀的特點,然而許多參考書中並沒有詳細闡述OCX控件的使用方法,使得一些如數據庫表格,遠程數據控件等接口復雜的OCX難於使用。這裡將詳細闡述OCX的使用方法。
首先提醒讀者要注意的是:使用OCX構件之前,必須登記注冊,否則不能使用。安裝VISUAL C++時,系統自動注冊登記軟件附帶的OCX控件。如果不幸沒有登記,那麼請使用REGSVR32應用程序來注冊。以VISUAL C++ 5.0為例,用AppWizard生成MFC應用程序分為六個步驟,其中第三個步驟中可以指定支持OLE控制,也就是我們要使用的OCX控件(是OLE的一種)。如果指定該選項,則AppWizard將自動向應用程序添加以下兩處代碼。
一處是為了說明OLE自動類如ColeDispathcDriver,自動向Stdafx.h中加入頭文件afxdisp.h
二是在InitInstance函數中激活OLE控制容器:
AfxEnableContainer();
如果在利用AppWizard創建應用程序是未指定OLE控制選項,則可以手工加入以上兩行代碼。
在生成應用框架後,首先應向應用程序加入OCX控件對應的類,如遠程數據控件的缺省名為RDC,而數據表格的缺省名為MSDBGRID。加入的過程是選擇Project菜單項,選擇Add to Project,選擇Components and Controls項,選擇Registered ActiveX Controls項,
雙擊你要加入的構件。
然後,通常是在對話框中加入OCX控制,這時應在對話框中單擊右鍵,選擇Insert ActiveX Controls,選擇你要加入的控件。這裡以遠程數據控件為例。
可以在設計時設定屬性,當然,在運行時刻再設置屬性值更具有靈活性。屬性中比較關鍵的是這幾個:
(1) CursotDriver:(2)DataSourceName (3)SQL。具體的設置見所附的程序。
以下程序是一個無模式對話框的源代碼:此程序段實現了一個與FOXPRO數據源相連接的遠程數據控件和一個與遠程數據庫控件相連的浏覽數據庫用的表格。數據源(DataSource)名稱為“檔案”,其中包含幾個表(Table),程序中選擇的是表2。用戶當然也可以很輕松的在運行時刻改變連接對應的SQL屬性,以便能夠浏覽同一數據庫的不同表格,或是不同數據庫的不同表格。數據源的建立方法為:控制面板->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("數據倉庫");
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
}