我自己做了一个ActiveX控件,这个Active控件就是可以任意被折叠。是类似于下面的一个Active控件。但是当我在同一个窗口创建两个同样的Activex控件后,第二个就看不到了。
下面是创建两个ActiveX控件的代码:CPoint p1(0,0),p2(500,500);//这个是他们两个控件的矩形区域,两个控件在同一区域
m_pNodeLinkLine1->Create(_T("Name"),WS_VISIBLE|WS_CHILD,CRect(p1,p2),this,123);
m_pNodeLinkLine1->InitLine(CPoint(30,100),CPoint(100,100));//这是m_pNodeLinkLine1的初始化起点和终点m_pNodeLinkLine2 = new CNodeLinkLine();
m_pNodeLinkLine2->Create(_T("Name"),WS_VISIBLE|WS_CHILD,CRect(p1,p2),this,123);
m_pNodeLinkLine2->InitLine(CPoint(150,150),CPoint(200,200));));//这是pNodeLinkLine2的初始化起点和终点下面是我在对话框上测试的效果(执行上面的代码后)很明显的是m_pNodeLinkLine2看不到了。
然后当我把创建m_pNodeLinkLine1的代码注释掉后,//CPoint p1(0,0),p2(500,500);//这个是他们两个控件的矩形区域,两个控件在同一区域
//m_pNodeLinkLine1->Create(_T("Name"),WS_VISIBLE|WS_CHILD,CRect(p1,p2),this,123);
//m_pNodeLinkLine1->InitLine(CPoint(30,100),CPoint(100,100));//这是的初始化起点和终点m_pNodeLinkLine2 = new CNodeLinkLine();
m_pNodeLinkLine2->Create(_T("Name"),WS_VISIBLE|WS_CHILD,CRect(p1,p2),this,123);
m_pNodeLinkLine2->InitLine(CPoint(150,150),CPoint(200,200));));//这是pNodeLinkLine2的初始化起点和终点效果如下:很明显,m_pNodeLinkLine2出来了。
有哪位大神指导知道设置什么原因?
为什么我的控件不能向Box1和Box2那样,在共享的区域内任然能够显示自己的边框呢?
activex控件背景覆盖 

解决方案 »

  1.   

    是呀,怎么解决呀。求解。
    你不要把坐标位置设置成一样的感谢您的回复,但是我这个必须得放在同样的位置。
    因为在同一个界面可能有很多ActiveX控件,并且这个ActiveX是一条类似下图由多条直线组成的图像:并且ActiveX控件的图形位置是任意的。
      

  2.   

    如果控件是有句柄的,不要选择CLIPSIBLING样式。如果控件是无句柄的,稍微有点麻烦,在IViewObject::Draw的实现里必须仔细考虑第一个参数的值,背景透明的处理稍稍有些不同,先仔细阅读MSDN的解释
      

  3.   

    本来书就很少,基本上这些资料来自于MSDN和网上的示例代码,外加自己的试验
      

  4.   


    搞了半天也没有搞明白啊。我现在主要要做些甚么才能让两个ActiveX控件同时显示。
    我的ActiveX控件是有句柄的。
    LONG lIndex = -1;
    DVASPECTINFO dvAspctInfo;
    dvAspctInfo.cb = sizeof(DVASPECTINFO);
    dvAspctInfo.dwFlags = DVASPECTINFOFLAG_CANOPTIMIZE ; RECTL rectL;
    rectL.left = 0;
    rectL.top= 0;
    rectL.right= 500;
    rectL.bottom = 500; BOOL bFalse=FALSE;
    IViewObject2* pViewObject; if(m_pNodeLinkLine1)
    {
    LPUNKNOWN lpUnkonw= m_pNodeLinkLine1->GetControlUnknown(); lpUnkonw->QueryInterface(__uuidof(IViewObject2),(void**)&pViewObject); HRESULT  hResult = pViewObject->Draw(DVASPECT_OPAQUE ,
    lIndex,
    (void*)&dvAspctInfo,
    NULL,
    NULL,
    m_pNodeLinkLine1->GetDC()->GetSafeHdc(),
    &rectL,
    NULL,
    NULL,
    NULL
    ); int a = 0;
    }
    我在OnPaint里面写了这样的代码,但是没有什么效果。
      

  5.   

    IViewObject::Draw是被容器调用的,不是你自己来调的,而且只针对无句柄控件。有句柄控件不需要关注这个,只需按照正常做法一样,处理窗口的绘制消息即可。首先去掉控件窗口的CLIPSIBLING样式,使得被兄弟窗口挡住时不会被自动裁剪掉;其次不要填充背景,一填充就覆盖另一个了,直接在erasebkgnd消息里返回TRUE即可,然后在PAINT消息里绘制你自己的内容。