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)一下,问题则解决了。
但这种方法有较长的延迟,不怎么好,我是没法子才这样做的,不知各位还有什么方法?望不啻指教。谢谢
...全文
232 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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...

仅供参考...

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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