关于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函数执行之后,还有地方进行了控件属性的初始化,将属性值附为设计时的值,是这样吗?如果我要改控件大小,该在设么地方该呢?

谢谢。
...全文
249 12 打赏 收藏 转发到动态 举报
写回复
用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????

3,245

社区成员

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

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