C#截取WM_PAINT消息进行图片绘制问题。望不吝赐教...

Keep_Silence_ 2012-07-21 05:26:26
先来说说的想法: 我用子类化的方法对截取到的WM_PAINT消息进行自定义的处理,处理的过程就是在窗口背景上画张图片。但是问题出现了,代码在第一次调试运行的时候有效,但是以后在调试图片就画不出来了。不知道问题出现在哪里,如果有知道原因的还望指导交流下。以下为测试代码:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses GDIPOBJ,GDIPAPI;

{$R *.dfm}

var
OldWinProc: integer;
g_hdc: HDC;
g_hWnd: HWND;

function WinProc(Hwnd,Msg,wParam,lParam:longint):LRESULT;Stdcall;
var
g: TGPGraphics;
img: TGPImage;
ps: tagPAINTSTRUCT;
begin
case Msg of
WM_LBUTTONDBLCLK:
ShowMessage('DoubleClick!');
WM_PAINT:
begin
BeginPaint(g_hWnd,ps);

g := TGPGraphics.Create(g_hdc);
img := TGPImage.Create(ExtractFilePath(ParamStr(0)) + '背景图片.jpg');
g.DrawImage(img,0,0);

img.Free;
g.Free;

EndPaint(g_hWnd,ps);
end;
end;
result := CallWindowProc(pointer(OldWinProc),Hwnd,Msg,wParam,lParam);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
g_hdc := Self.Canvas.Handle;
g_hWnd := Self.Handle;
OldWinProc := SetWindowLong(Self.Handle,GWL_WNDPROC,Integer(@WinProc))
end;

end.

...全文
386 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Keep_Silence_ 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你那个消息过程也是可行的,只是Canvas.Handle是个临时DC。
[/Quote]
怪不得每次我移动窗口让他重绘的时候有部分的图片出现在窗口上。
阿发伯 2012-07-22
  • 打赏
  • 举报
回复
你那个消息过程也是可行的,只是Canvas.Handle是个临时DC。
Keep_Silence_ 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
……
[/Quote]

看来对delphi的消息处理还是不熟,谢谢阿发伯,知道您在图像处理方面很厉害,也关注您的博客。
Keep_Silence_ 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
没接触过delphi中的c#, 这代码怎么看都是o-pascal啊= =,求扫盲
[/Quote]

对不住了,标题打错了,害你有所误解。
阿发伯 2012-07-22
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
OldWndProc: TWndMethod;
procedure WndProc(var Message: TMessage);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses GDIPOBJ, GDIPAPI;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
OldWndProc := WindowProc;
WindowProc := WndProc;
end;

procedure TForm1.WndProc(var Message: TMessage);
var
g: TGPGraphics;
img: TGPImage;
ps: tagPAINTSTRUCT;
DC: HDC;
begin
case Message.Msg of
WM_LBUTTONDBLCLK:
ShowMessage('DoubleClick!');
WM_PAINT:
begin
DC := BeginPaint(Handle, ps);

g := TGPGraphics.Create(DC);
img := TGPImage.Create(ExtractFilePath(ParamStr(0)) + '背景图片.jpg');
g.DrawImage(img,0,0);

img.Free;
g.Free;

EndPaint(Handle, ps);
end;
end;
OldWndProc(Message);
end;

end.
sololie 2012-07-21
  • 打赏
  • 举报
回复
没接触过delphi中的c#, 这代码怎么看都是o-pascal啊= =,求扫盲
Keep_Silence_ 2012-07-21
  • 打赏
  • 举报
回复
对了 上面的代码用来GDI+类库,如果没有的同学可以去这下:
http://www.cnblogs.com/del/archive/2008/06/06/1215319.html

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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