Delphi使用GDI+绘制Png图像

最近在使用鱼鱼桌面秀和雪狐桌面精灵的时候发现一些很漂亮的png图片,但是在Delphi里面没有办法直接加载Png图片进行绘制,所以试用了GDI+进行绘制.效果如下,我使用了雪狐桌面精灵里面的一张图片

 

你需要去www.2ccc.com先下载GDI+的Pascal头文件,连接地址如下

http://mirror1.2ccc.com/downloads/vcl/graphics/gdiplus.zip

下载之后请将其解压,然后把里面的Pas目录加入到Delphi的LibraryPath里面,这样Delphi才能找到他们,或者你可以直接将pas目录文件Copy到你的工程目录下面放在一起也可以.我就这么干地:-)

全部源代码如下:

 1.Project.dpr文件内容:

 1 program Project1;
 2 
 3 
 4 uses
 5   Windows,
 6   PublicUnit in 'PublicUnit.pas',
 7   MainWindow in 'MainWindow.pas';
 8 
 9 var
10   Msg:TMsg;
11 begin
12   while GetMessage(Msg, 000do
13   begin
14     TranslateMessage(Msg);
15     DispatchMessage(Msg);
16   end;
17 end.

2.MainWindow.pas文件内容如下

 

  1 unit MainWindow;
  2 
  3 interface
  4 uses
  5   Windows, Messages,PublicUnit,GDIPAPI,GDIPOBJ;
  6 var
  7   m_Image: TGPImage;
  8   dwExStyle: DWORD;
  9   HDC_Memory: HDC;
 10   m_Blend: BLENDFUNCTION;
 11 function UpdateLayeredWindow(Handle: THandle; hdcDest: HDC; pptDst: PPoint; _psize: PSize;
 12                              hdcSrc: HDC; pptSrc: PPoint; crKey: COLORREF; pblend: PBLENDFUNCTION; dwFlags: DWORD): Boolean; stdcall;
 13 implementation
 14 function UpdateLayeredWindow; external 'user32.dll' name 'UpdateLayeredWindow';
 15 
 16 procedure PaintForm(hWnd:Handle);
 17 var
 18   hdcTemp, hdcScreen: HDC;
 19   hBit_Map: HBITMAP;
 20   rec: TRect;
 21   ptWinPos, ptSrc: TPoint;
 22   graph: TGPGraphics;
 23   size: TSize;
 24 begin
 25 
 26   hdcTemp := GetDC(0);
 27   HDC_Memory := CreateCompatibleDC(hdcTemp);
 28   hBit_Map := CreateCompatibleBitmap(hdcTemp,
 29   m_Image.GetWidth(), m_Image.GetHeight());
 30   SelectObject(HDC_Memory, hBit_Map);
 31   hdcScreen := GetDC(0);
 32   GetWindowRect(FormHandle, rec);
 33   ptWinPos.X := rec.Left;
 34   ptWinPos.Y := rec.Top;
 35   if ((dwExStyle and $80000<> $80000then
 36   begin
 37     SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle or $80000);
 38   end;
 39   graph := TGPGraphics.Create(HDC_Memory);
 40   graph.DrawImage(m_Image, 00, m_Image.GetWidth, m_Image.GetHeight);
 41   size.cx := m_Image.GetWidth;
 42   size.cy := m_Image.GetHeight;
 43   ptSrc.X := 0;
 44   ptSrc.Y := 0;
 45   UpdateLayeredWindow(hWnd, hdcScreen, @ptWinPos,
 46     @size, HDC_Memory, @ptSrc, 0, @m_Blend, 2);
 47   graph.ReleaseHDC(HDC_Memory);
 48   ReleaseDC(0, hdcScreen);
 49   ReleaseDC(0, hdcTemp);
 50   DeleteObject(hBit_Map);
 51   DeleteDC(HDC_Memory);      
 52 end;
 53 
 54   // 窗体过程回调函数
 55 function MainProc(hMain, MsgID, WParam, LParam: DWORD): DWORD; stdcall;
 56 begin
 57   case MsgID of
 58      WM_LBUTTONDOWN:
 59       begin
 60         ReleaseCapture;
 61         SendMessage(hMain,WM_SYSCOMMAND,SC_MOVE, 0);
 62       end;
 63       WM_RBUTTONUP:
 64       begin
 65         PostQuitMessage(0);
 66       end;  
 67     WM_PAINT:
 68       begin
 69         PaintForm(hMain);
 70       end;
 71     WM_CREATE:
 72       begin
 73         m_Image := TGPImage.Create(ExtractFilePath(ParamStr(0))+'1.png');
 74         m_Blend.BlendOp := 0;
 75         m_Blend.BlendFlags := 0;
 76         m_Blend.AlphaFormat := 1;
 77         m_Blend.SourceConstantAlpha := 255;
 78         dwExStyle := GetWindowLong(hMain, GWL_EXSTYLE);
 79       end;
 80 
 81     WM_DESTROY:
 82       begin
 83         PostQuitMessage(0); // 放WM_QUIT到消息队列
 84       end;
 85   end;
 86   Result := DefWindowProc(hMain, MsgID, WParam, LParam); // 标准处理
 87 end;
 88 
 89   // 建立主窗体
 90 procedure Create_MainWindow;
 91 var
 92   MainClass: TWndClass;
 93 begin
 94   MainClass.Style := CS_HREDRAW or CS_VREDRAW;
 95   MainClass.lpfnWndProc := @MainProc;
 96   MainClass.cbClsExtra := 0;
 97   MainClass.cbWndExtra := 0;
 98   MainClass.hInstance := SysInit.HInstance;
 99   MainClass.hIcon := LoadIcon(0,nil);
100   MainClass.hCursor := LoadCursor(0, IDC_ARROW);
101   MainClass.hbrBackground := COLOR_BTNFACE + 1;
102   MainClass.lpszMenuName := nil;
103   MainClass.lpszClassName := 'MainWindowClass';
104   if RegisterClass(MainClass)=0 then
105     begin
106       Halt;
107     end;
108   FormHandle:=CreateWindowEx(WS_EX_TOPMOST, MainClass.lpszClassName, '空白窗体',
109                 WinStyleFrom,
110               20020026028000, HInstance, nil);
111   if FormHandle=0 then
112      begin
113        Halt;
114      end;  
115 end;
116 
117 initialization
118   Create_MainWindow;
119 
120 end.
121 

3.PublicUnit.pas公共函数单元

 1 unit PublicUnit;
 2 
 3 interface
 4 uses
 5   Windows;
 6 type
 7   Handle=LongWord; 
 8 const
 9   WinStyleDlg=WS_TILED or WS_VISIBLE or WS_SYSMENU;
10   WinStyleFrom=WS_VISIBLE or WS_TILED or WS_SYSMENU or WS_MINIMIZEBOX or WS_SIZEBOX or WS_MAXIMIZEBOX;  
11 var
12   FormHandle:Handle;
13 function ExtractFilePath(const FileName: string): string// 解析出文件路径
14 implementation
15     // -- 解析出文件路径 -- //
16 function ExtractFilePath(const FileName: string): string;
17 var
18   P: Integer;
19 begin
20   P := Length(FileName);
21   while (P > 0)and(FileName[P] <> '\')and(FileName[P] <> ':'do Dec(P);
22   Result := Copy(FileName, 1, P);
23 end;
24 end.

 

 

 

 

posted on 2008-09-25 17:55  流浪猫  阅读(5415)  评论(10编辑  收藏  举报

导航