zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    ExtJs中ComboBox使用之技巧
    Ethernet帧结构
    Sqlite修改表
    Solr系列:Linux下部署Solr
    Ethernet帧的接收流程
    使用SQLite作为Quartz.Net的Job Store
    Quartz.Net的一个Bug
    获取程序集的Public key token
    SQLite数据类型
    shell取出多列文件中某一列重复的数据
  • 原文地址:https://www.cnblogs.com/sun_catboy/p/1299000.html
Copyright © 2011-2022 走看看