在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近在使用鱼鱼桌面秀和雪狐桌面精灵的时候发现一些很漂亮的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, 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.
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论