msgbartop
Those ashame days.
msgbarbottom

17 May 06 Controls In ActiveX Control – 在Activex 控件中嵌入对话框

众所周知… 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.并增加如下的代码
    1. int CDialogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    2. {
    3. if (COleControl::OnCreate(lpCreateStruct) == -1)
    4.  return -1;
    5.  m_MyDialog.Create(IDD_MYDIALOG, this);
    6.  return 0;
    7. }
  • 在OnDraw函数中处理如下

    void CTestCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
    {
    if(m_cMyDialog.GetSafeHwnd())
    m_MyDialog.MoveWindow(rcBounds, TRUE);
    }
  • 对PreCreate事件处理
    1. BOOL CTestCtrl::PreCreateWindow(CREATESTRUCT& cs)
    2. {
    3.    cs.dwExStyle |= WS_EX_CONTROLPARENT;
    4.    return COleControl::PreCreateWindow(cs);
    5. }
  • 对OnSetObjectRects事件处理
    1. BOOL CJustWatchClientCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
    2. {
    3.    if(m_cMainDlg.GetSafeHwnd())
    4.     { 
    5.        m_cMainDlg.MoveWindow(lpRectPos);
    6.      } 
    7.    return COleControl::OnSetObjectRects(lpRectPos, lpRectClip);
    8. }
  • 添加Activex Controls支持,在app中的InitInstance修改
    1. BOOL CClientOCXApp::InitInstance() 
    2. { 
    3.     BOOL bInit = COleControlModule::InitInstance();
    4.     if (bInit) 
    5.       { 
    6.           AfxEnableControlContainer();
    7.       } 
    8.     return bInit;
    9. }
  • 大功告成!多简单!

Tags: