又到了一天一问的时候了,呵呵~~

zhenyu362 2004-10-24 02:42:42
问题:如何重载TImage控件的wndproc?
我是这么做的:
头文件:
//---------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
private: // User declarations

void __fastcall myWndProc(Messages::TMessage &Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
单元文件:
//-------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image1->WindowProc=myWndProc;
}
void __fastcall TForm1::myWndProc(Messages::TMessage &Message)
{
switch(Message.Msg)
{
case WM_PAINT:
OutputDebugString("Recv WM_PAINT");
break;
}
Dispatch(&Message);
}
但是根本没有拦截到WM_PAINT这个消息。我哪里搞错了?
...全文
101 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2004-10-25
  • 打赏
  • 举报
回复
已经画在TImage上的东西,想要擦除,只有画的时候采用“异或”、“反”操作才可以恢复原来的图
形,方法就是采用“异或”、“反”操作再画一次。否则是不可能复原的。另外一个办法,就是每次
画的时候,就保存一次TImage上的图形,不过这个办法太低效了。最好的办法,还是使用PaintBox,
自己管理画上去的东西,PaintBox的OnPaint事件里自己画。
Maconel 2004-10-24
  • 打赏
  • 举报
回复
如果要擦出上次的东西,一个是用fillrect来填充一个区域,比如填充整个image。
再一个就是重新在上一次的地方重新画一次,用背景色画。
BenLeak 2004-10-24
  • 打赏
  • 举报
回复
Image1->Bitmap = NULL;
zhenyu362 2004-10-24
  • 打赏
  • 举报
回复
不行,我就想知道Image这个问题如何解决
milkwayhong 2004-10-24
  • 打赏
  • 举报
回复
学习
jishiping 2004-10-24
  • 打赏
  • 举报
回复
如果不希望上次画的东西留在上面,用PaintBox好了。
zhenyu362 2004-10-24
  • 打赏
  • 举报
回复
哦,还有一个问题,就是上次画的东西还会留在上面,不会消失,不知道如何擦除上次画的东西。
比如我本来想拦截WM_PAINT消息,然后画一个移动的点,结果由于以前画的没有擦除,画出来了一条线
zhenyu362 2004-10-24
  • 打赏
  • 举报
回复
感谢JSP 季世平大大,如果这样的话WM_PAINT消息是不是被处理了两次?
是不是这样才是真正的拦截WM_PAINT消息?

。。。。。。。
OutputDebugString("recv wm_paint");
break;
default:
OldWndProc(Message);
break;
}
//-----------------------------------------------
我加入了一个jsp QQ群,高兴得要命,以为是你开的,谁知道是讨论 java script 的
jishiping 2004-10-24
  • 打赏
  • 举报
回复
里上面的写法,调用 Dispatch(&Message); 会导致死循环,正确的写法是:

class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
private: // User declarations
TWndMethod OldWndProc;

void __fastcall MyWndProc(TMessage &Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OldWndProc = Image1->WindowProc;
Image1->WindowProc = MyWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWndProc(TMessage &Message)
{
switch(Message.Msg)
{
case WM_PAINT:
OutputDebugString("Recv WM_PAINT");
break;
}
OldWndProc(Message);
}
zhenyu362 2004-10-24
  • 打赏
  • 举报
回复
晕,犯不着吧?
tccsdn 2004-10-24
  • 打赏
  • 举报
回复
写控件可以

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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