关于ATL控件的几个问题

Python 2001-07-01 11:17:48
一、我用ATL做了一个控件,我想让他在运行时不可见,但是,如果在ATL Wizard中选中“运行时不可见”,控件则接受不到WM_CREATE消息,且,只有选择了Window Only选项,控件才能接收到CREATE消息,但是,在Form中加入控件后,运行时,控件的背景总是白色的底,我在WM_CREATE消息相应函数中调用ShowWindow(SW_HIDE),没有结果,函数返回false。我如何才能使控件运行时不可见,且又能接受消息呢?我在VB中,将控件的visible属性设成了false,就可以做到。我在控件中如何做到自己隐藏且没有白色的底块呢?

二、用ATL做的控件,如果不需要Window Only消息,那么,也就接受不到CREATE消息了,我该在什么地方进行控件的初始化呢?如果初始化工作,和控件的父窗口(容器窗口)句柄有关,改在什么地方初始化?

三、如果我想控件初始化的时候改变一些控件属性,比如控件的大小。我该怎么做?在什么地方做。我曾在WM_CREATE响应函数中改变控件的大小(用MoveWindow函数)不成功,但是,在OnDraw函数中则成功了,为什么?我感觉,在OnCreate函数执行之后,还有地方进行了控件属性的初始化,将属性值附为设计时的值,是这样吗?如果我要改控件大小,该在设么地方该呢?

谢谢。
...全文
260 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Python 2001-07-05
  • 打赏
  • 举报
回复
我试过,不行
zcpro 2001-07-05
  • 打赏
  • 举报
回复
不知道在你的客户端调用Create创建控件时将其窗口类型中的WS_VISIBLE去掉行不行?
Python 2001-07-05
  • 打赏
  • 举报
回复
帮忙啊,各位高手~~~~~~~
Python 2001-07-03
  • 打赏
  • 举报
回复
谢谢
但是,我还有点地方不是很明白

如果在ATL Wizard中选中“运行时不可见”,的确可以使控件在运行时看不到,但是,我也接受不到消息了,比如WM_CREATE,而我的控件需要和它的容器窗口发生关系,需要知道控件容器窗口的句柄,我该在什么地方得到呢?

谢谢
coolfired 2001-07-03
  • 打赏
  • 举报
回复
你这个问题其实很简单,首先解释为什么在
HRESULT OnDraw(ATL_DRAWINFO& di)中改变大小:
ATL和MFC不同之处在于:MFC有两种设备上下文调用,第一个是
WM_PAINT消息,传递给OnDraw函数的设备上下文代表了真实的设备
上下文。ATL和MFC类似。
而ATL控件响应WM_PAINT消息时,执行CComControlBase::OnPaint函数,
建立一个ATL_DRAWINFO结构,它包括创建一个绘图设备上下文。
然后ATL调用控件的OnDrawAdvanced函数。
OnDrawAdvanced生成元文件,接着调用控件的OnDraw方法,
在OnDraw方法中,使用ATL_DRAWINFO结构中的信息来在屏幕上绘制当前控件的矩形。
下面是ATL_DRAWINFO结构:
struct ATL_DRAWINFO
{
UINT cbSize;
DWORD dwDrawAspect;
LONG lindex;
DVTARGETDEVICE* ptd;
HDC hicTargetDev;
HDC hdcDraw; //绘图设备上下文
LPCRECTL prcBounds; //在其中绘图的矩形
LPCRECTL prcWBounds; //元文件绘图时使用
BOOL bOptimize;
BOOL bZoomed;
BOOL bRectInHimetric;
SIZEL ZoomNum; //ZoomX=ZoomNum.cx/ZoomNum.cy
SIZEL ZoomDen;
};
ATL自动填写ATL_DRAWINFO结构,实际上我们在OnDraw的时候
只需关心hdcDraw和prcBounds就行了。
你的问题:
1.在ATL Wizard中选中"运行时不可见"即可。
2.在构造函数中初始化,当然需添加和大小相关的属性,而且在OnDraw的时候得和prcBounds相关。
3.我想你问题应该解决了。

菜鸟之见,仅供参考。
Python 2001-07-02
  • 打赏
  • 举报
回复
我的mail:
PythonPan@hotmail.com
呵呵
希望多多交流
:)
vcmfc 2001-07-02
  • 打赏
  • 举报
回复
最近我的侧重点在Driver,过段时间再给你交流,对了,你的Mail呢?


^_^
vcmfc 2001-07-02
  • 打赏
  • 举报
回复
其实我学得比你晚,有些问题可来信交流呀!,对于ATL,我也是一知半解,据我目前所知的高手有:edyang,iamafraid,luyxi,达明一排,你可找一找它们。
Python 2001-07-01
  • 打赏
  • 举报
回复
??
下载?什么意思?
那是我编程练习中遇到的问题阿
FANGAO 2001-07-01
  • 打赏
  • 举报
回复
这个控件在那里下载?
Python 2001-07-01
  • 打赏
  • 举报
回复
1、等待答案
2、在构造函数中进行初始化,或者在FinalContruct中进行初始化,是正确的。但是,有时我需要容器的窗口句柄,怎么办?比如,我要进行子类化(SubclassWindow),怎么办?这个时候,还没有窗口建立起来的呢。
3、在ATL中,也是重载那个函数吗?
4、你的ATL问题集,我保留了,有问题,也会先看一看。有一点,我觉得,你把它叫做ATL问题集,可是,里面有几个问题,还是MFC的ActiveX问题,呵呵。
5、我就是以前的python啊。
6、我正在学习COM,学习ATL,有很多问题,不好意思。

再次表示感谢
vcmfc 2001-07-01
  • 打赏
  • 举报
回复
1.未试。
2.其实最好的初始化地方是你的ATL类的构造函数,我不知道你如何取得容器窗口的句柄??
3.初始化改变控件的属性在你的ATL类的构造函数直接更改,这跟在c++类里更改成员的值是一样的,对于改变控件的大小,请不要用MoveWindows,请重载SetExtent,可参见我的ATL问题集,这里面有你需要的东东。


不知道你是否是以前的Python????
需要用来获得所需的功能在步骤涉及到 IObjectSafetyImpl 用作您的控件派生的类之一,和重写 GetInterfaceSafetyOptions 和 SetInterfaceSafetyOptions。 这使您实现所需的功能在这种情况下意味着将标记为可安全编写脚本和初始化该控件。 若要将 IObjectSafetyImpl 需要将其添加到您的控件派生的类的列表。 是例如多边形教程中您看到以下: class ATL_NO_VTABLE CPolyCtl : ... public IObjectSafetyImpl // ATL's version of // IObjectSafety { public: BEGIN_COM_MAP(CPolyCtl) ... COM_INTERFACE_ENTRY_IMPL(IObjectSafety) // Tie IObjectSafety // to this COM map END_COM_MAP() STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) { ATLTRACE(_T("CObjectSafetyImpl::GetInterfaceSafetyOptions\n")); if (!pdwSupportedOptions || !pdwEnabledOptions) return E_FAIL; LPUNKNOWN pUnk; if (_InternalQueryInterface (riid, (void**)&pUnk) == E_NOINTERFACE) { // Our object doesn't even support this interface. return E_NOINTERFACE; }else{ // Cleanup after ourselves. pUnk->Release(); pUnk = NULL; } if (riid == IID_IDispatch) { // IDispatch is an interface used for scripting. If your // control supports other IDispatch or Dual interfaces, you // may decide to add them here as well. Client wants to know // if object is safe for scripting. Only indicate safe for // scripting when the interface is safe. *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; *pdwEnabledOptions = m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER; return S_OK; }else if ((riid == IID_IPersistStreamInit) || (riid == IID_IPersistStorage)) { // IID_IPersistStreamInit and IID_IPersistStorage are // interfaces used for Initialization. If your control // supports other Persistence interfaces, you may decide to // add them here as well. Client wants to know if object is // safe for initializing. Only indicate safe for initializing // when the interface is safe. *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; *pdwEnabledOptions = m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_DATA; return S_OK; }else{ // We are saying that no other interfaces in this control are // safe for initializing or scripting. *pdwSupportedOptions = 0; *pdwEnabledOptions = 0; return E_FAIL; } } STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) { ATLTRACE(_T("CObjectSafetyImpl::SetInterfaceSafetyOptions\n")); if (!dwOptionSetMask && !dwEnabledOptions) return E_FAIL; LPUNKNOWN pUnk; if (_InternalQueryInterface (riid, (void**)&pUnk) == E_NOINTERFACE) { // Our object doesn't even support this interface. return E_NOINTERFACE; }else{ // Cleanup after ourselves. pUnk->Release(); pUnk = NULL; } // Store our current safety level to return in // GetInterfaceSafetyOptions m_dwSafety |= dwEnabledOptions & dwOptionSetMask; if ((riid == IID_IDispatch) && (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER)) { // Client wants us to disable any functionality that would // make the control unsafe for scripting. The same applies to // any other IDispatch or Dual interfaces your control may // support. Because our control is safe for scripting by // default we just return S_OK. return S_OK; }else if (((riid == IID_IPersistStreamInit) || (riid == IID_IPersistStorage)) && (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_DATA)) { // Client wants us to make the control safe for initializing // from persistent data. For these interfaces, this control // is safe so we return S_OK. For Any interfaces that are not // safe, we would return E_FAIL. return S_OK; }else{ // This control doesn't allow Initialization or Scripting // from any other interfaces so return E_FAIL. return E_FAIL; } } ... } ATL 3.0 中, IObjectSafetyImpl 的实现已更改,使您现在可以作为模板参数提供安全选项。 例如,上述类的声明将显示为 class ATL_NO_VTABLE CPolyCtl : ... public IObjectSafetyImpl { public: BEGIN_COM_MAP(CPolyCtl) ... ,您将不必重写两个方法。 有关其他信息,单击下面,文章编号,以查看 Microsoft 知识库中相应: 192093 PRB: 编译器错误时移植到 ATL 3.0 IObjectSafetyImpl

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧