VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 891|回复: 5

[求助] 代码如何去掉ICO的毛边呢?

[复制链接]
发表于 2018-12-4 22:23:22 | 显示全部楼层 |阅读模式
正面网站有Delphi语言的代码:https://bbs.csdn.net/topics/360226281
据说通过代码可以去除毛边。
但我不懂Delphi,不知道是否是真?
上传一个ico作例子,它是存在毛边的。

1.rar

16.13 KB, 下载次数: 77

ico图片

发表于 2018-12-6 13:30:16 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-5 11:25:01 | 显示全部楼层
PS修毛边不就好了么。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-12-4 22:26:29 | 显示全部楼层
附上一楼链接 https://bbs.csdn.net/topics/360226281 的源码:

  1. {*******************************************************}
  2. {                                                       }
  3. {       环境:Delphi 7 + IGDIPlus                       }
  4. {                                                       }
  5. {       作者:无幻 http://blog.csdn.net/akof1314        }
  6. {                                                       }
  7. {*******************************************************}
  8. unit Unit1;

  9. interface

  10. uses
  11.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.   Dialogs, IGDIPlus, ExtCtrls, Menus;

  13. type
  14.   TForm1 = class(TForm)
  15.     tmr1: TTimer;
  16.     pm1: TPopupMenu;
  17.     mni_topMost: TMenuItem;
  18.     mni_transparent: TMenuItem;
  19.     mni_exit: TMenuItem;
  20.     procedure FormCreate(Sender: TObject);
  21.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  22.       Shift: TShiftState; X, Y: Integer);
  23.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  24.       Y: Integer);
  25.     procedure tmr1Timer(Sender: TObject);
  26.     procedure mni_topMostClick(Sender: TObject);
  27.     procedure MouseLeave(var Msg: TMessage);message WM_MOUSELEAVE;
  28.     procedure mni_transparentClick(Sender: TObject);
  29.     procedure mni_exitClick(Sender: TObject);
  30.   private
  31.     m_Kind: Integer;        //当前第几行字符串
  32.     m_bBack: Boolean;       //是否显示背景
  33.     m_pszbuf: array[0..5] of WideString;   //要绘制的字符串数组
  34.     function UpdateDisplay(pszbuf: WideString;bBack: Boolean = False;
  35.         Transparent: Integer = 100):Boolean;
  36.   public
  37.     { Public declarations }
  38.   end;

  39. var
  40.   Form1: TForm1;

  41. implementation

  42. {$R *.dfm}
  43. {-------------------------------------------------------------------------------
  44.   过程名:    TForm1.UpdateDisplay
  45.   功能:      绘制桌面歌词
  46.   参数:      pszbuf: WideString;     绘制的字符串
  47.              bBack: Boolean;         是否绘制背景
  48.              Transparent: Integer    透明程度
  49.   返回值:    Boolean
  50. -------------------------------------------------------------------------------}
  51. function TForm1.UpdateDisplay(pszbuf: WideString;bBack: Boolean;Transparent: Integer):Boolean;
  52. var
  53.   hdcTemp,hdcScreen,m_hdcMemory: HDC;
  54.   hBitMap: Windows.HBITMAP;
  55.   blend: BLENDFUNCTION;      //这种结构的混合控制通过指定源和目标位图的混合功能
  56.   rct: TRect;
  57.   ptWinPos,ptSrc: TPoint;
  58.   graphics: IGPGraphics;     //封装一个 GDI+ 绘图图面
  59.   fontFamily: IGPFontFamily; //定义有着相似的基本设计但在形式上有某些差异的一组字样
  60.   path: IGPGraphicsPath;     //表示一系列相互连接的直线和曲线
  61.   strFormat: IGPStringFormat;//封装文本布局信息,显示操作
  62.   pen,pen1,pen2: IGPPen;     //定义用于绘制直线和曲线的对象
  63.   linGrBrush,linGrBrushW: IGPLinearGradientBrush;  //使用线性渐变封装 Brush
  64.   brush: IGPSolidBrush;      //定义单色画笔,画笔用于填充图形形状
  65.   image: TGPImage;           //使用这个类来创建和操作GDI+图像
  66.   i: Integer;
  67.   sizeWindow: SIZE;
  68. begin
  69.   //---------------------开始:初始化操作--------------------------------------
  70.   hdcTemp := GetDC(Self.Handle);
  71.   m_hdcMemory := CreateCompatibleDC(hdcTemp);
  72.   hBitMap := CreateCompatibleBitmap(hdcTemp,755,350);
  73.   SelectObject(m_hdcMemory,hBitMap);
  74.   if (Transparent < 0) or (Transparent > 100) then
  75.     Transparent := 100;
  76.   with blend do
  77.   begin
  78.     BlendOp := AC_SRC_OVER;     //把源图片覆盖到目标之上
  79.     BlendFlags := 0;
  80.     AlphaFormat := AC_SRC_ALPHA;//每个像素有各自的alpha通道
  81.     SourceConstantAlpha :=Trunc(Transparent * 2.55);  //源图片的透明度
  82.   end;
  83.   hdcScreen := GetDC(Self.Handle);
  84.   GetWindowRect(Self.Handle,rct);
  85.   ptWinPos := Point(rct.Left,rct.Top);
  86.   graphics := TGPGraphics.Create(m_hdcMemory);
  87.   graphics.SetSmoothingMode(SmoothingModeAntiAlias); //指定平滑(抗锯齿)
  88.   graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);//指定的高品质,双三次插值
  89.   fontFamily := TGPFontFamily.Create('微软雅黑'); //△字体,效果图为'微软雅黑'字体
  90.   strFormat := TGPStringFormat.Create();
  91.   path := TGPGraphicsPath.Create();
  92.   //---------------------结束:初始化操作--------------------------------------
  93.   path.AddString(pszbuf,          //要添加的 String
  94.                 fontFamily,       //表示绘制文本所用字体的名称
  95.                 0,                //指定应用到文本的字形信息,这里为普通文本
  96.                 38,               //限定字符的 Em(字体大小)方框的高度
  97.                 MakePoint(10,10), //一个 Point,它表示文本从其起始的点
  98.                 strFormat);       //指定文本格式设置信息
  99.   pen := TGPPen.Create(MakeColor(155,215,215,215),3);  //颜色、宽度
  100.   graphics.DrawPath(pen,path);    //初步绘制GraphicsPath
  101.   linGrBrush := TGPLinearGradientBrush.Create(MakePoint(0,0),    //线性渐变起始点
  102.                                                 MakePoint(0,90), //线性渐变终结点
  103.                                                 MakeColor(255,255,255,255), //线性渐变起始色
  104.                                                 MakeColor(255,30,120,195)); //线性渐变结束色
  105.   linGrBrushW := TGPLinearGradientBrush.Create(MakePoint(0,10),
  106.                                                 MakePoint(0,60),
  107.                                                 MakeColor(255,255,255,255),
  108.                                                 MakeColor(15,1,1,1));
  109.   //---------------------开始:画字符串阴影--------------------------------------
  110.   for i := 1 to 8 do
  111.   begin
  112.     pen.SetWidth(i);
  113.     pen.SetColor(MakeColor(62, 0, 2, 2));
  114.     pen.SetLineJoin(LineJoinRound); //指定圆形联接。这将在两条线之间产生平滑的圆弧。
  115.     graphics.DrawPath(pen,path);
  116.   end;
  117.   //---------------------开始:画背景框和背景图----------------------------------
  118.   if bBack then
  119.   begin
  120.     brush := TGPSolidBrush.Create(MakeColor(25,228,228,228));
  121.     pen1 := TGPPen.Create(MakeColor(155,223,223,223));
  122.     pen2 := TGPPen.Create(MakeColor(55,223,223,223));
  123.     image := TGPImage.Create('back.png');             //背景图片
  124.     graphics.FillRectangle(brush,3,5,750,90);         //填充背景框色
  125.     graphics.DrawRectangle(pen1,2,6,751,91);          //内层背景框
  126.     graphics.DrawRectangle(pen2,1,5,753,93);          //外层背景框
  127.     graphics.DrawImage(image,600,25);
  128.   end;
  129.   //---------------------开始:以渐变色笔刷填充GraphicsPath内部-----------------
  130.   graphics.FillPath(linGrBrush,path);
  131.   graphics.FillPath(linGrBrushW,path);
  132.   sizeWindow.cx := 755;
  133.   sizeWindow.cy := 350;
  134.   ptSrc := Point(0,0);
  135.   //---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
  136.   Result := UpdateLayeredWindow(Self.Handle,   //分层窗口的句柄
  137.                                 hdcScreen,     //屏幕的DC句柄
  138.                                 @ptWinPos,     //分层窗口新的屏幕坐标
  139.                                 @sizeWindow,   //分层窗口新的大小
  140.                                 m_hdcMemory,   //用来定义分层窗口的表面DC句柄
  141.                                 @ptSrc,        //分层窗口在设备上下文的位置
  142.                                 0,             //合成分层窗口时使用指定颜色键值
  143.                                 @blend,        //在分层窗口进行组合时的透明度值
  144.                                 ULW_ALPHA);    //使用pblend为混合功能
  145.   //---------------------开始:释放和删除--------------------------------------
  146.   ReleaseDC(Self.Handle,hdcScreen);
  147.   ReleaseDC(Self.Handle,hdcTemp);
  148.   DeleteObject(hBitMap);
  149.   DeleteDC(m_hdcMemory);
  150. end;
复制代码


  1. {-------------------------------------------------------------------------------
  2.   功能:      窗体创建初始化
  3. -------------------------------------------------------------------------------}
  4. procedure TForm1.FormCreate(Sender: TObject);
  5. begin
  6.   //设置窗体属性
  7.   SetWindowLong(Application.Handle,
  8.                 GWL_EXSTYLE,
  9.                 GetWindowLong(Application.Handle,GWL_EXSTYLE)
  10.                 or WS_EX_TOOLWINDOW);   //不在任务栏出现
  11.   SetWindowLong(Self.Handle,
  12.                 GWL_EXSTYLE,
  13.                 GetWindowLong(Self.Handle,GWL_EXSTYLE)
  14.                 or WS_EX_LAYERED       //层次窗口
  15.                 or WS_EX_TOOLWINDOW);  //不在alt+tab中出现
  16.   //初始化变量等等
  17.   m_kind := 0;
  18.   m_bBack := False;
  19.   PopupMenu := pm1;
  20.   Self.Cursor := crHandPoint;
  21.   mni_topMost.Checked := True;
  22.   mni_topMostClick(mni_topMost);

  23.   m_pszbuf[0] := '你好 Everyone!';
  24.   m_pszbuf[1] := '这是GDI+绘制的桌面歌词!';
  25.   m_pszbuf[2] := '欢迎光临无幻博客!';
  26.   m_pszbuf[3] := 'http://blog.csdn.net/akof1314!';
  27.   m_pszbuf[4] := '源码根据需要进行修改!';
  28.   UpdateDisplay(m_pszbuf[m_kind],m_bBack);
  29. end;
  30. {-------------------------------------------------------------------------------
  31.   功能:      鼠标按下移动窗体
  32. -------------------------------------------------------------------------------}
  33. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  34.   Shift: TShiftState; X, Y: Integer);
  35. begin
  36.   ReleaseCapture;
  37.   SendMessage(Self.Handle,WM_SYSCOMMAND,SC_MOVE or HTCAPTION,0);
  38. end;
  39. {-------------------------------------------------------------------------------
  40.   功能:      鼠标移过窗体
  41. -------------------------------------------------------------------------------}
  42. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  43.   Y: Integer);
  44. var
  45.   xh: TTrackMouseEvent;
  46. begin
  47.   m_bBack := True;
  48.   UpdateDisplay(m_pszbuf[m_kind],m_bBack);
  49.   with xh do
  50.   begin
  51.     cbSize := SizeOf(xh);
  52.     dwFlags := TME_LEAVE;
  53.     hwndTrack := Self.Handle;
  54.     dwHoverTime := 0;
  55.   end;
  56.   TrackMouseEvent(xh);
  57. end;
  58. {-------------------------------------------------------------------------------
  59.   功能:      鼠标移出窗体时,去掉背景
  60. -------------------------------------------------------------------------------}
  61. procedure TForm1.MouseLeave(var Msg: TMessage);
  62. begin
  63.   m_bBack := False;
  64.   UpdateDisplay(m_pszbuf[m_kind],m_bBack);
  65.   Msg.Result := 0;
  66. end;
  67. {-------------------------------------------------------------------------------
  68.   功能:      定时器切换字符串
  69. -------------------------------------------------------------------------------}
  70. procedure TForm1.tmr1Timer(Sender: TObject);
  71. begin
  72.   Inc(m_Kind);
  73.   if m_kind > 4 then
  74.     m_kind := 0;
  75.   UpdateDisplay(m_pszbuf[m_kind],m_bBack);
  76. end;
  77. {-------------------------------------------------------------------------------
  78.   功能:      窗体置顶
  79. -------------------------------------------------------------------------------}
  80. procedure TForm1.mni_topMostClick(Sender: TObject);
  81. begin
  82.   if mni_topMost.Checked then
  83.   SetWindowPos(Self.Handle,
  84.                HWND_TOPMOST,
  85.                0,0,0,0,
  86.                SWP_NOSIZE or SWP_NOMOVE)    //窗口置顶
  87.   else
  88.   SetWindowPos(Self.Handle,
  89.                HWND_NOTOPMOST,
  90.                0,0,0,0,
  91.                SWP_NOSIZE or SWP_NOMOVE);    //窗口置顶
  92. end;
  93. {-------------------------------------------------------------------------------
  94.   功能:      背景穿透 (相当于锁定桌面)
  95. -------------------------------------------------------------------------------}
  96. procedure TForm1.mni_transparentClick(Sender: TObject);
  97. begin
  98.   SetWindowLong(Self.Handle,
  99.                 GWL_EXSTYLE,
  100.                 GetWindowLong(Self.Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT);
  101.   Application.MessageBox('你已关闭不了程序了,请从任务管理器里关闭',
  102.                         '提示',MB_OK or MB_ICONINFORMATION);
  103. end;
  104. {-------------------------------------------------------------------------------
  105.   功能:      退出
  106. -------------------------------------------------------------------------------}
  107. procedure TForm1.mni_exitClick(Sender: TObject);
  108. begin
  109.   Self.Close;
  110. end;

  111. end.
复制代码



https://blog.csdn.net/akof1314/article/details/6430583
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-5 20:10:08 | 显示全部楼层
JuncoJet 发表于 2018-12-5 11:25
PS修毛边不就好了么。

P完后运行,在任务栏上还是毛边,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-6 19:43:59 | 显示全部楼层
JuncoJet 发表于 2018-12-6 13:30
https://msdn.microsoft.com/en-us/magazine/dd942846.aspx#id0420051

全部是英文,好像看不懂,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-7-17 18:21

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表