Delphi使用GDI+绘制Png图像

时间:2022-11-08 10:53:51

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

 Delphi使用GDI+绘制Png图像

你需要去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,  0 0 0 do
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 <>  $ 80000 then
 36     begin
 37      SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle  or  $ 80000 );
 38     end ;
 39    graph : =  TGPGraphics.Create(HDC_Memory);
 40    graph.DrawImage(m_Image,  0 0 , 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                 200 200 260 280 0 0 , 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.