众所周知… appwizard 生成的 Activex Control 里面只有一个OnDraw方法,实在是可怜。不过今天我偶然发现一篇好文章,不敢独享,下面是具体的修改方法。
原文在这里 Dialog frame as an ActiveX control 比较有意思的是,原文并没有解决所有问题,倒是后面的comment不得不看!
步骤翻译和修改如下:
- 建立一个新的mfc activex control工程,比如说叫CTestCtl
- 在资源编辑器里插入一个新的Dialog ,ID为IDC_MYDIALOG , 注意属性部分: style – child, border – dialog frame, visible, control, static edge
- 增加一个新的MFC类,基类为CDialog 的CMyDialog,当然,ID要指向 IDC_MYDIALOG
- 在CTestCtl中增加一个CMyDialog 类型的成员变量 m_cMyDialog
- 使用Classwizard对WM_CREATE事件添加一个handler.并增加如下的代码
- int CDialogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (COleControl::OnCreate(lpCreateStruct) == -1)
- return -1;
- m_MyDialog.Create(IDD_MYDIALOG, this);
- return 0;
- }
- 在OnDraw函数中处理如下
void CTestCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if(m_cMyDialog.GetSafeHwnd())
m_MyDialog.MoveWindow(rcBounds, TRUE);
}
- 对PreCreate事件处理
- BOOL CTestCtrl::PreCreateWindow(CREATESTRUCT& cs)
- {
- cs.dwExStyle |= WS_EX_CONTROLPARENT;
- return COleControl::PreCreateWindow(cs);
- }
- 对OnSetObjectRects事件处理
- BOOL CJustWatchClientCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
- {
- if(m_cMainDlg.GetSafeHwnd())
- {
- m_cMainDlg.MoveWindow(lpRectPos);
- }
- return COleControl::OnSetObjectRects(lpRectPos, lpRectClip);
- }
- 添加Activex Controls支持,在app中的InitInstance修改
- BOOL CClientOCXApp::InitInstance()
- {
- BOOL bInit = COleControlModule::InitInstance();
- if (bInit)
- {
- AfxEnableControlContainer();
- }
- return bInit;
- }
- 大功告成!多简单!
Tags: C/C++