memo 当然可以带图片,只是需要自己写代码完成。如果不想写成控件,可以利用 memo
的重画时间,画出自己的东西,要知道它什么时候重画,就要找到它的窗口方法,分析
进入 memo 的全部消息,从中取得 WM_Paint 消息。
1) 获取和改变 memo 的窗口方法:
var
NewPiont
ointer;
Begin
MemoPiont:=Pointer(GetWindowLong(Memo.Handle,GWL_WNDPROC));
NewPiont:=MakeObjectInstance(MemoWndMethod);
SetWindowLong(memo.Handle, GWL_WNDPROC, Longint(NewPiont));
end;
2)写自己的窗口方法,分离进入 Memo 的消息
procedure TForm1.MemoWndMethod(var Msg: TMessage);
begin
case Msg.Msg of
WM_Paint:
begin
MemoPaint(TWMPaint(Msg));// 分离得到 WM_Paint 消息
Msg.Result:=0;
end;
end;
Msg.Result := CallWindowProc(MemoPiont,Memo.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
end;
3)执行新的重画任务
procedure TForm1.MemoPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
DC: HDC;
Bitmap:TBitmap;
begin
DC := Message.DC;
Bitmap:TBitmap.Create;
Bitmap.LoadFromFile('xx.bmp');
if DC = 0 then
DC := BeginPaint(Memo.Handle, PS);
try
// 这里有点细工夫,就是确定绘图位置,确定滚动等
// 比较烦琐,略掉了.... 然后就是往 memo 画:
BitBlt(DC,x,y,w,h,Bitmap.Canvas.Handle,sx,sy,SrcCopy);
// 其他处理 ....
finally
EndPaint(Memo.Handle, PS);
Bitmap.Free;
end;
end;
原理大概就是这样了,但要做得好,就要花工夫,有专门的控件的话,建议利用。