MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一:在VB中調(diào)用X控件,添加方法?project->Add components。另外可以用Object Browser來(lái)查看控件
?
二:在VC中創(chuàng)建X控件
1.新建一個(gè)X工程名為Clock,注意一個(gè)文件中可以包含多個(gè)控件。
2.保持缺省設(shè)置,完成。注意它生成的三個(gè)類,以及相關(guān)的接口。
3.運(yùn)行它。選擇TSTCON32.exe作為容器。
4.選擇Insert Control,此時(shí)我們可以看到,它畫了一個(gè)橢圓。也可以在VB中測(cè)試。
5.刪除注冊(cè)信息。用regsvr32 /u +文件名。也可以在菜單選擇反注冊(cè)命令。
6.重寫代碼。在CClockCtrl::OnDraw()中畫了一個(gè)橢圓,此時(shí)我們?cè)谄渲械玫较到y(tǒng)時(shí)間,并顯示它。為此我們?cè)?span style="font-family:'Times New Roman';">OnCreate()設(shè)置了一個(gè)定時(shí)器,每隔一定時(shí)間發(fā)出一個(gè)Invalidate()消息,使窗口重繪。
7.如何改變控件的背景色和前景色?ClassWizard->AutoMation->Add Property->BackColor,還需要在OnDraw()中加上相應(yīng)的代碼
CBrush brush(TranslateColor(GetBackColor()));
pdc->FillRect(rcBounds, &brush);
pdc->SetBkMode(TRANSPARENT);
pdc->SetTextColor(TranslateColor(GetForeColor()));
8.增加屬性頁(yè)。在
BEGIN_PROPPAGEIDS(CClockCtrl, 2)此時(shí)數(shù)目也得改成相應(yīng)的數(shù)目
PROPPAGEID(CClockPropPage::guid)
PROPPAGEID(CLSID_CColorPropPage)
END_PROPPAGEIDS(CClockCtrl)? OK~
9.增加自定義屬性:ClassWizard->AutoMation->Add Property加上一個(gè)變量m_interval,類型為short,對(duì)應(yīng)外部變量為Interval。在CClockCtrl中增加OnIntervalChanged方法。添加如下代碼:
?? if(m_interval<0 || m_interval>6000)
?{
? m_interval=1000;
?}
?else
?{
? m_interval=m_interval/1000*1000;
? KillTimer(1);
? SetTimer(1,m_interval,NULL);
? BoundPropertyChanged(0x1);
?}
?10.測(cè)試:Control->Invoke Methods
?11.將時(shí)間間隔加到屬性頁(yè)中,在資源視圖中加入一文本框和編輯框。為EditBox關(guān)聯(lián)成員變量,加入屬性interval。
?12.增加方法:ClassWizard->AutoMation->Add Method->Hello加入代碼?OK!在VB中可以調(diào)用此方法!
?? void CClockCtrl::Hello()
{
?// TOD Add your dispatch handler code here
?MessageBox("Hello world!");
}
?13.增加事件:ClassWizard->AutoMation->Add Events->Click
?14.增加自定義事件:ClassWizard->AutoMation->Add Events->NewMinute
? ????在新的一分鐘到達(dá)時(shí)發(fā)出這個(gè)通知,在OnDraw()中寫代碼:
?????? CTime time=CTime::GetCurrentTime();
?if(0==time.GetSecond())
?{
? FireNewMinute();
?}
15.讓Interval屬性具有持久性。在CClockCtrl::DoPropExchange()中調(diào)用PX_short()方法,OK!
??? PX_Short(pPX,"Interval",m_interval,1000);
16.讓Property Page和Property屬性中的interval保持一致的方法:在OnIntervalChanged()中調(diào)用BoundPropertyChanged(0x1);
17.希望控件在設(shè)計(jì)時(shí)間內(nèi)不走動(dòng)的方法:在OnTimer()中,if(AmbientUserMode())InvalidateControl();巧妙!
?
?
三:在VC中調(diào)用X控件
1.新建ClockTest對(duì)話框應(yīng)用程序
2.點(diǎn)擊右鍵->插入X控件->時(shí)鐘控件
3.Project->Add Component會(huì)生成CClock類。
4.在CCLockTestDlg中增加CClock類的成員變量m_clock,然后可以動(dòng)態(tài)創(chuàng)建一個(gè)這樣的東東!
5.試驗(yàn)Click(),NewMinute(),SetBkColor(),SetForeColor()方法和屬性
6.如何為動(dòng)態(tài)創(chuàng)建的控件做事件響應(yīng)呢?首先你得知道它的ID號(hào),然后參考非動(dòng)態(tài)的控件事件代碼。
?
下面是具體的代碼:
1創(chuàng)建一個(gè)MFC ActiveX ControWizard項(xiàng)目,什么都不用做,直接運(yùn)行,就能有一個(gè)Activex控件了,其作用是生成一個(gè)橢圓
運(yùn)行,直接注冊(cè)到了系統(tǒng),所以在別的地方能夠找到生成的ActiveX控件
這里在VS2008中的VB來(lái)測(cè)試。
右鍵---->選擇項(xiàng)---->
?
此時(shí)工具箱就多了一個(gè)控件
拖動(dòng)到窗口,效果如下:
項(xiàng)目文件Debug中含有:
?
在運(yùn)行 輸入
然后把上面的ocx文件拖進(jìn)去,按確定,反編譯,使得從注冊(cè)表中移除
?
?
然后運(yùn)行MFCXXX,找不到ActiveX找不到控件
?
使用Tools下的Register Contrl可以注冊(cè)ActiveX
或者運(yùn)行 regsvr32? 再把ocx文件拖進(jìn)來(lái) 就可以注冊(cè)了,跟上面一樣,只是去掉了/u
?
下面開始做自己的|ActiveX了
[cpp]?view plaincopy
void?CATestCtrl::OnDraw(??
????????????CDC*?pdc,?const?CRect&?rcBounds,?const?CRect&?rcInvalid)??
{??
????//?TODO:?Replace?the?following?code?with?your?own?drawing?code.??
????//pdc->FillRect(rcBounds,?CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));??
????//pdc->Ellipse(rcBounds);??
????//上面兩句是默認(rèn)的,畫橢圓??
????CTime?c=CTime::GetCurrentTime();??
????CString?cstring=c.Format("%H:%M:%S");??
????pdc->TextOut(0,0,cstring);??
}??
一個(gè)靜止的時(shí)間,要想它動(dòng)態(tài)的顯示,還得加上SetTimer函數(shù)和wm_timer
在CXXctrl中添加一個(gè)WM_CREATE然后里面Settimer
SetTimer(1,1000,NULL);
添加wm_timer
[cpp]?view plaincopy
void?CATestCtrl::OnTimer(UINT?nIDEvent)???
{??
????//?TODO:?Add?your?message?handler?code?here?and/or?call?default??
??????
????//Invalidate();??
????InvalidateControl();??
????COleControl::OnTimer(nIDEvent);??
}??
這個(gè)時(shí)候就能顯示一個(gè)動(dòng)態(tài)顯示的時(shí)鐘了
?
在VB中使用剛剛新建的ActiveX,發(fā)現(xiàn)只有很少的屬性
這個(gè)時(shí)候? 我們可以添加自己的屬性:
?
這個(gè)時(shí)候,VS中VB可以顯示響應(yīng)的屬性了
?
此時(shí)在OnDraw中 要相應(yīng)的添加代碼,要不然,設(shè)置了背景色和前景色都不起作用
[cpp]?view plaincopy
CBrush?cbrush(TranslateColor(GetBackColor()));??
????pdc->FillRect(rcBounds,&cbrush);??
????pdc->SetBkMode(TRANSPARENT);??
????pdc->SetTextColor(TranslateColor(GetForeColor()));??
?
[cpp]?view plaincopy
void?CATestCtrl::OnDraw(??
????????????CDC*?pdc,?const?CRect&?rcBounds,?const?CRect&?rcInvalid)??
{??
????//?TODO:?Replace?the?following?code?with?your?own?drawing?code.??
????//pdc->FillRect(rcBounds,?CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));??
????//pdc->Ellipse(rcBounds);??
????//上面兩句是默認(rèn)的,畫橢圓??
??
??
????CBrush?cbrush(TranslateColor(GetBackColor()));??
????pdc->FillRect(rcBounds,&cbrush);??
????pdc->SetBkMode(TRANSPARENT);??
????pdc->SetTextColor(TranslateColor(GetForeColor()));??
??
????CTime?c=CTime::GetCurrentTime();??
????CString?cstring=c.Format("%H:%M:%S");??
????pdc->TextOut(0,0,cstring);??
}??
手動(dòng)添加屬性頁(yè)
[cpp]?view plaincopy
BEGIN_PROPPAGEIDS(CATestCtrl,?2)??
????PROPPAGEID(CATestPropPage::guid)??
????PROPPAGEID(CLSID_CColorPropPage)??
END_PROPPAGEIDS(CATestCtrl)??
?
?
添加自定義屬性:
?
[cpp]?view plaincopy
void?CATestCtrl::OnJianGeChanged()???
{??
????//?TODO:?Add?notification?handler?code??
??
????if(m_jianGe<0||m_jianGe>6000)??
????{??
????????m_jianGe=1000;??
????}??
????else??
????{??
????????m_jianGe=m_jianGe/1000*1000;??
????????KillTimer(1);??
????????SetTimer(1,m_jianGe,NULL);??
????}??
????SetModifiedFlag();??
}??
?
屬性面板的 有的能看間JianGe有的不能看到
將這個(gè)添加到屬性頁(yè)去
添加關(guān)聯(lián)
?
最后一項(xiàng)是屬性名
?
?可以為ActiveX添加(標(biāo)準(zhǔn)的和自定義的)事件和函數(shù)。
?
?MFC中添加該類
轉(zhuǎn)載于:https://my.oschina.net/u/1469992/blog/227506
總結(jié)
以上是生活随笔為你收集整理的MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win环境下,django+postgr
- 下一篇: 页面左边导航固定,右边自适应宽度