就像Timer Winsock 控件一样。
怎么我覆盖了 COleControl的OnSize()也不行?

解决方案 »

  1.   

    #1 如何使用控件不能改变大小?
    答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE;SIZEL size = {24, 24};
    AtlPixelToHiMetric(&size, &m_sizeExtent);
    m_sizeNatural = m_sizeExtent
    拷贝自ATL问题集
      

  2.   

    我也遇到了这个问题,问了好久也没有人回答。我将控件的Onsizing事件都注销了也不管用。
    我用的是MFC,不是ATL,所以,现在还没有解决,
    期待中……
      

  3.   

    在OnDraw中写你需要现实控件外观的代码:
    RECT& rc = *(RECT*)di.prcBounds;
    HBRUSH hb=CreateSolidBrush(0x00c0c0c0);
    FillRect(di.hdcDraw,&rc,hb);
    DeleteObject(hb);

    hb=CreateSolidBrush(0x00ff0000);
    FrameRect(di.hdcDraw,&rc,hb);
    DeleteObject(hb);

    SetBkColor(di.hdcDraw,0x00c0c0c0);
    SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
    SetTextColor(di.hdcDraw,0x00ff0000);
    LPCTSTR pszText = _T("MyActiveX");
    TextOut(di.hdcDraw, 
    (rc.left + rc.right) / 2, 
    (rc.top+rc.bottom)*3/4, 
    pszText, 
    lstrlen(pszText)); return S_OK;
      

  4.   

    设定控件大小的属性:
    BEGIN_PROP_MAP(CEKeyCOM)
    PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
    PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
    END_PROP_MAP()然后重载SetExtent就可以了。
    STDMETHOD (SetExtent)(DWORD dwDrawAspect, SIZEL* psizel)
    {
     m_sizeExtent.cx = 100;
     m_sizeExtent.cy = 50;
     return S_OK;
    }
    这里的大小单位是1000 = 1cm。这样是可以实现,但有个问题是我这样做了刷新会有些问题,就是刷新可以重画控件,但用滚动条拖拉时不重画。
      

  5.   

    知道了!!!
    看了半天的MSDN终于发现怎么做了
    可以重载COLEControl的OnSetExtent(LPSIZEL lpSizeL) 
    然后将lpSizeL设置成你要的大小就行了:-)
      

  6.   

    lpSizeL是HIMETRIC类型的,如果觉得比较麻烦,可以在OnSetExtent中直接返回FALSE
    在构造函数中用SetInitialSize(这里的参数是pixel的)设置想要的大小,