MFC2010制作一个ActiveX;
通过xx.inf和makecert,cert2spc,cabarc,signtool制作成cab;
在Web上加载一个这个cab,成功安装后;已经可以进入该这个函数里
//系统自动生在的WebC1Ctrl.cpp文件名除外)以下部份
//以上略... ...
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
//-------加入以下代码
HRESULT   hr; 
//标记控件初始化安全. 
//创建初始化安全组件种类 
hr = CreateComponentCategory(CATID_SafeForInitializing, _T( "Controls   safely   initializable   from   persistent   data!")); 
if (FAILED(hr)) 
return  hr; 
//注册初始化安全 
hr = RegisterCLSIDInCategory(CLSID_Safeitem, CATID_SafeForInitializing); 
if(FAILED(hr)) 
{
::MessageBox(0, _T("RegisterCLSIDInCategory()-fail"), _T("kknd"), 0);
return hr; 
} //标记控件脚本安全 
//创建脚本安全组件种类   
hr = CreateComponentCategory(CATID_SafeForScripting, _T("Controls   safely   scriptable!")); 
if (FAILED(hr)) 
{
::MessageBox(0, _T("CreateComponentCategory()-fail"), _T("kknd"), 0);
return hr; 
}
//注册脚本安全组件种类 
hr = RegisterCLSIDInCategory(CLSID_Safeitem, CATID_SafeForScripting); 
if (FAILED(hr)) 
{
::MessageBox(0, _T("RegisterCLSIDInCategory()-fail"), _T("kknd"), 0);
return hr; 
}
//-------
//A处
return NOERROR;
}
//以下略... ...
//系统自动生在的WebC1Ctrl.h(文件名除外)以下
#pragma once
class CWebC1Ctrl : public COleControl
{
DECLARE_DYNCREATE(CWebC1Ctrl)
public:
CWebC1Ctrl();
public:
virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
virtual void DoPropExchange(CPropExchange* pPX);
virtual void OnResetState();
protected:
~CWebC1Ctrl();
DECLARE_OLECREATE_EX(CWebC1Ctrl)    // 类工厂和 guid
DECLARE_OLETYPELIB(CWebC1Ctrl)      // GetTypeInfo
DECLARE_PROPPAGEIDS(CWebC1Ctrl)     // 属性页 ID
DECLARE_OLECTLTYPE(CWebC1Ctrl) // 类型名称和杂项状态
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_EVENT_MAP()
public:
enum { };
};
//WebC1Ctrl.cpp部份
//以上略... ...
// CWebC1Ctrl::OnDraw - 绘图函数
void CWebC1Ctrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
//only test
::MessageBox(0, _T("OnDraw()"), _T("kknd"), 0);
//
if (!pdc)
return; // TODO: 用您自己的绘图代码替换下面的代码。
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
//以下略... ...//要在窗口中画图,但先要得到CDC与CRect,问如何得到Web窗口的CDC和CRect?
//是否是调用OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)?如果是,又是如何调用的?Web是并没有调用到OnDraw()

解决方案 »

  1.   

    在里面调用AfxGetMainWnd()得到主窗口句柄,用GetParent()得到父窗口句柄,然后你想得到窗口的一些信息都可以了
      

  2.   

    CWnd *Wnd = 0;
    Wnd = AfxGetMainWnd();
    const HWND hWnd = GetParent(Wnd->m_hWnd);
    const HDC hDC=::GetDC(hWnd); 
    CDC cdc; 
    cdc.Attach(hDC);
    if (cdc)
    {
    CRect r1, r2;
    r1.SetRectEmpty();
    //r1.left = 200;
    //r1.top = 100;
    r1.bottom = 60;
    r1.right = 200;
    cdc.FillRect(r1, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    cdc.Ellipse(r1);
    }
    //已经可以画出圆了,不过另外的问题是,不在本浏览器内画,好像是在桌面上画,而且得不到CRect