C#截取WM_PAINT消息进行图片绘制问题。望不吝赐教...
先来说说的想法: 我用子类化的方法对截取到的WM_PAINT消息进行自定义的处理,处理的过程就是在窗口背景上画张图片。但是问题出现了,代码在第一次调试运行的时候有效,但是以后在调试图片就画不出来了。不知道问题出现在哪里,如果有知道原因的还望指导交流下。以下为测试代码:
- Delphi(Pascal) code
unit Unit1;interfaceuses 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;implementationuses 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.[解决办法]
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.