怎样使ActivX控件保持固定大小 就像Timer Winsock 控件一样。怎么我覆盖了 COleControl的OnSize()也不行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #1 如何使用控件不能改变大小?答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE;SIZEL size = {24, 24};AtlPixelToHiMetric(&size, &m_sizeExtent);m_sizeNatural = m_sizeExtent拷贝自ATL问题集 我也遇到了这个问题,问了好久也没有人回答。我将控件的Onsizing事件都注销了也不管用。我用的是MFC,不是ATL,所以,现在还没有解决,期待中…… 在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; 设定控件大小的属性: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。这样是可以实现,但有个问题是我这样做了刷新会有些问题,就是刷新可以重画控件,但用滚动条拖拉时不重画。 知道了!!!看了半天的MSDN终于发现怎么做了可以重载COLEControl的OnSetExtent(LPSIZEL lpSizeL) 然后将lpSizeL设置成你要的大小就行了:-) lpSizeL是HIMETRIC类型的,如果觉得比较麻烦,可以在OnSetExtent中直接返回FALSE在构造函数中用SetInitialSize(这里的参数是pixel的)设置想要的大小, MFC 模糊查询 哪里有允许上传一个90M文件的免费空间? 如何得到文件的“修改时间”、“生成时间”以及“大小”等信息? 给定文件命,如何判断该文件是否存在? 请问在VC中哪里可以查阅一个控件的属性和方法 请问用TCP/IP协议做的程序该怎么收发自己定义的的类 MAKE工程文件转化为VC6下的DSP后,原来的MAKE文件可以不使用吗!? 求教客户端使用智能指针访问Com组件的问题 ****** 成立程序员协会,共同交流经验,同意的留言! ****** 关于MFC在vs2008环境下建立消息映射的问题 数组的比较弱的问题 为什么写数据库出错?请高手指教
答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE;SIZEL size = {24, 24};
AtlPixelToHiMetric(&size, &m_sizeExtent);
m_sizeNatural = m_sizeExtent
拷贝自ATL问题集
我用的是MFC,不是ATL,所以,现在还没有解决,
期待中……
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;
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。这样是可以实现,但有个问题是我这样做了刷新会有些问题,就是刷新可以重画控件,但用滚动条拖拉时不重画。
看了半天的MSDN终于发现怎么做了
可以重载COLEControl的OnSetExtent(LPSIZEL lpSizeL)
然后将lpSizeL设置成你要的大小就行了:-)
在构造函数中用SetInitialSize(这里的参数是pixel的)设置想要的大小,