TPanel重画问题?

xrdsheng 2005-09-30 03:45:44
我从TPanel中继承下来做了一个类,借用Panel的HANDLE用TextOut输出一些字符,把这个类放到TForm中去用,当TextOut出来的字符被其它窗口覆盖后,重新显示此Form时TextOut的字符不能被刷新,我的刷新函数不知该放在那个事件处理才好,TPanel没有OnPaint事件,TPanel的OnResize事件是做不到的。我在TForm的OnPaint事件中去刷新TPanel,但不行,我想原因是当我刷新过Panel后TForm自己重画时把Panel的内容覆盖了。之后我再TForm里定义了一个重画TPanel的自定义消息,在OnPaint事件PostMessage给Form在自定义消息处理中自己重画TPanel,此消息处理要Sleep(500)一下,问题则解决了。
但这种方法有较长的延迟,不怎么好,我是没法子才这样做的,不知各位还有什么方法?望不啻指教。谢谢
...全文
165 点赞 收藏 14
写回复
14 条回复
alloutoflove 2005年09月30日
this->WindowProc = WinMethod;

应该替换成:
WinMethod(Message);
吧?

否则WinMsgProc只会被执行一次.
回复 点赞
alloutoflove 2005年09月30日
to xrdsheng(旭日东升)

我就是和你说的方法一样做的,可是设断进不了那程序.
回复 点赞
xrdsheng 2005年09月30日
不好意思,结贴发生错误,分没法给了,谢谢大家的回复
回复 点赞
xrdsheng 2005年09月30日
怎么没给成分的,CSDN怎么搞的
回复 点赞
xrdsheng 2005年09月30日
to alloutoflove(andrew):
是可以进的,你在窗口初始化时这样做
OnCreate()
{
WinMethod = this->WindowProc;//WinMethod是TWinMethod对象,是一个函数指针
this->WindowProc = WinMsgProc;把this->WindowProc指向WinMsgProc
...
}

void __fastcall CTermShow::WinMsgProc(TMessage &e)
{
if(e.Msg == WM_PAINT||e.Msg == WM_NCPAINT)
ShowMessage(IntToStr(e.Msg) );
this->WindowProc = WinMethod;
//Disp
}

谢谢FengSC(小猪快跑) ,结贴

回复 点赞
FengSC 2005年09月30日
我是直接看头文件得到的,其实BCB中的头文件和Source很有用的。
回复 点赞
alloutoflove 2005年09月30日
TO: xrdsheng(旭日东升)
我自己也试了一下,不是没有WM_PAINT,是根本没有进WindowProc =_=, 不知道为什么...
对VCL太不了解了,不知道是不是因为PANEL不是标准Windows控件的原因??!
回复 点赞
xrdsheng 2005年09月30日
FengSC(小猪快跑):
你的方法可行,我已试过了,谢谢。
不过问你一下,BCB帮助中可重载的函数怎么在文档找不着的,你在那找的,直接在BCB列出来的组件函数和属性好没有,麻烦再指点一下,下班前结贴,谢谢

VCL中的重载函数在文档的那里找啊,麻烦给点提示???
回复 点赞
xrdsheng 2005年09月30日
TImage也可以,不过我只需TPanel的HANDLE,其它画图我直接用API,没有用TCanvas
回复 点赞
dolaimi 2005年09月30日
为什么不用TImage来完成呢?
回复 点赞
xrdsheng 2005年09月30日
to alloutoflove(andrew) :
此方法已试过,不行,在WndProc收不到WM_PAINT消息,不过也谢谢你的回复

void __fastcall CTermShow::WinMsgProc(TMessage &e)
{
if(e.Msg == WM_PAINT||e.Msg == WM_NCPAINT)
ShowMessage(IntToStr(e.Msg) );
this->WindowProc = WinMethod;
//Disp
}

FengSC(小猪快跑):
你的方法可行,我已试过了,谢谢。
不过问你一下,BCB帮助中可重载的函数怎么在文档找不着的,你在那找的,直接在BCB列出来的组件函数和属性好没有,麻烦再指点一下,下班前结贴,谢谢
回复 点赞
alloutoflove 2005年09月30日
楼上的不说偶还不知道VCL有这个功能, 汗........................
学习ing...
回复 点赞
FengSC 2005年09月30日
从载Paint函数就可以了。
回复 点赞
alloutoflove 2005年09月30日
可以在你的继承类中重载TPanel的WndProc, 然后在该函数中判断WM_PAINT消息, 在这时再TextOut...

仅供参考...
回复 点赞
发动态
发帖子
VCL组件使用和开发
创建于2007-08-02

438

社区成员

1.3w+

社区内容

C++ Builder VCL组件使用和开发
社区公告
暂无公告