專案類型 -> MFC -> MFC ActiveX控制項
專案名稱: ActiveXTest
類別檢視->CActiveXTestCtrl->新增兩個成員變數 _a 和 _b
int _a;
int _b;
開啟CActiveXTestCtrl建構函式 CActiveXCtrl(void)
_a初始化成12, _b初始化成16
修改OnDraw函式: [類別檢視]->CActiveXTestCtrl->搜尋OnDraw函式並滑鼠雙擊
void CActiveXTestCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (!pdc)
return;
// TODO: 請用您自己的繪圖程式碼取代下列程式碼。
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);
CBrush brush1, brush2;
brush1.CreateSolidBrush(0xFFFFFF); // 白色
pdc->FillRect(rcBounds, &brush1);
brush2.CreateSolidBrush(0x000000); // 黑色
pdc->SelectObject(brush2);
//3個圓心
POINT p1 = {35, 40};
POINT p2 = {195, p1.y};
POINT p3 = {(p1.x+p2.x)/2, p1.y-60};
int radius = 15;
//繪製3個圓
pdc->Ellipse(p1.x-radius, p1.y-radius, p1.x+radius, p1.y+radius);
pdc->Ellipse(p2.x-radius, p2.y-radius, p2.x+radius, p2.y+radius);
pdc->Ellipse(p3.x-radius, p3.y-radius, p3.x+radius, p3.y+radius);
// 連線
pdc->MoveTo(p1);
pdc->LineTo(p3);
pdc->LineTo(p2);
CString msg;
pdc->SetBkMode(TRANSPARENT);
pdc->SetTextAlign(TA_CENTER);
// 輸出數位
pdc->SetTextColor(0xFFFFFF);
msg.Format(_T("%d"), _a);
pdc->TextOutW(p1.x, p1.y-9, msg, msg.GetLength());
msg.Format(_T("%d"), _b);
pdc->TextOutW(p2.x, p2.y-9, msg, msg.GetLength());
msg.Format(_T("%d"), _mcd(_a, _b));
pdc->TextOutW(p3.x, p3.y-9, msg, msg.GetLength());
}
加入函式_mcd(a, b)
int CActiveXTestCtrl::_mcd(int a, int b)
{
if(b==0)
return a;
return _mcd(b, a%b);
}
-------------------------------------------------------------------------------------------------------------
編譯Visual Studio得到下列檔案, Visual Studio會自動幫ActiveXTest.ocx元件註冊
選擇[工具]->ActiveX控制項測試容器: 用來測試剛才編譯完成的ActiveXTest.ocx
插入新控制項(Insert New Control)
點選ActiveXTestControl
開啟後, 可以看到OnDraw()的畫面
-------------------------------------------------------------------------------------------------------------
新增一個方法SetNumbers, 用來設定_mcd()函式中的兩個參數(int a, int b)
類別檢視 -> ActiveXTestLib->_DActiveXTest->點選左下角視窗SetNumbers(SHORT a, SHORT b)
->滑鼠反白SetNumbers->按右鍵移至定義
跳出提示視窗,選擇ActiveXTestCtrl.cpp
void CActiveXTestCtrl::SetNumbers(SHORT a, SHORT b)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在這裡加入您的分派處理常式程式碼
_a = a;
_b = b;
Invalidate();
}
重新建立專案, 開啟ActiveX控制項測試容器->控制項
->呼叫方法, 方法名稱的下拉選單選擇SetNumbers, 設定a=130, b=13並按下[叫用],
則人機介面會立即更新顯示
--------------------------------------------------------------------------------------------------------------
開啟BCB6, 選擇Component->Import ActiveX Control
選擇ActiveXTest元件, 按下install按鈕
點選ActiveX Tab頁面, 可以看到剛剛安裝的ActiveXTest元件(標記為OCX),
滑鼠點選OCX新增該元件至Form1頁面
按下Button1後
ActiveXTest1->SetNumbers(Edit1->Text.ToInt(), Edit2->Text.ToInt());
--------------------------------------------------------------------------------------------------------------
windows->開始輸入regedit, 呼叫登錄編輯程式
下拉[編輯]->[搜尋]->輸入關鍵字ActiveXTest, 可以搜尋到剛剛Visual Studio所編譯出來的ActiveX元件
滑鼠雙擊[預設值], 可以得到CLSID, 即該元件在本機器的註冊碼{F2F26ADB-B616-4826-95EE-B71218541C6E}
windows->開始輸入cmd, 接著輸入regsvr32跳出提示如下
--------------------------------------------------------------------------------------------------------------
刪除ActiveXTest.ocx註冊, 請輸入
regsvr32 /u ActiveXTest.ocx
重新註冊ActiveXTest.ocx, 請輸入
regsvr32 ActiveXTest.ocx
原始程式:ActiveXTest.zip