首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-08-02 
C#截取WM_PAINT消息进行图片绘制问题。望不吝赐教...先来说说的想法: 我用子类化的方法对截取到的WM_PAINT

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.

热点排行