#SingleInstance, Force
#NoEnv
SetBatchLines, -1
OnExit, Exit
CustomTrayTip("消息通知:","仿win10 TrayTip通知样式,可用在win7或托盘图标隐藏的脚本上!",1,True)
Sleep,4000
ExitApp
Return
;;;================================================================================================
/*     ; By 蜜獾哥
  仿win10 TrayTip通知,可用在win7或托盘图标隐藏的脚本上!
  title:标题
  text:内容
  Mode:1消息,2警告,3错误
  Dark:true深色模式,False浅色模式
  Transparent:透明度[0-255],0透明,255不透明
  Timeout:显示时长
*/
CustomTrayTip(title,text:="",Mode=1,Dark:=True,Transparent:=225,Timeout:=3500){
  ;;Critical
  Global CTToken,hCTT,CTTimer
  Static Index
  if (title=""&&text=""){
    Return
  }
  Gosub FormatString
  TitleFntSize:=22,TextFntSize:=20,Transparent:=Transparent>255?255:Transparent<0?0:Transparent
  NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
  DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
  SystemFontName:=StrGet(&info + 52)?StrGet(&info + 52):"宋体"
  if !DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
    DllCall("LoadLibrary", "str", "gdiplus")
  VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
  DllCall("gdiplus\GdiplusStartup", "UPtr*", CTToken, "UPtr", &si, "UPtr", 0)
  If !CTToken
  {
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
  }
  Gui, TT: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs +HWNDhCTT -DPIScale
  Gui, TT: Show, NA
  VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(1, bi, 4, "uint")
  NumPut(1, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
  hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
  hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
  obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm), DllCall("gdiplus\GdipCreateFromHDC", "UPtr", hdc, "UPtr*", G)
  DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", SystemFontName, "uint", 0, "UPtr*", hFamily)
  If !hFamily
    DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFamily)
  DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TitleFntSize, "int", text=""&&title<>""?0:1, "int", 0, "UPtr*", tFont)
  DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TextFntSize, "int", 0, "int", 0, "UPtr*", hFont)
  DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", tFormat)
  DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", hFormat)
  VarSetCapacity(TempRC, 16)
  DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", title, "int", -1, "UPtr"
    , tFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
  TitleRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
  VarSetCapacity(TempRC, 16)
  DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", Text, "int", -1, "UPtr"
    , hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
  TextRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
  base64_1=
  (join`r`n LTrim
  iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABMVJREFUeF7tm02IHEUUx/+vdyN+BrZHo
  h4Mxp3uJQGPJnrQQ7KKB00O4kEURPBjtyYnAyqKHhTFCHrK1q4fIIKoJyGJAdHVgx408ZiD7PRsIuZgEu1e8DPETT/puGN2Z7qnq7urqxtmF/qy86rqvd+8e
  l0f/yEM+R8NefxYB7CeAQYIjMmFOwDrHgI2RQ8zXwdg08oTeXA2eojoDANnowcIP1sSE9+U7V5pU6Axt7gLzHcz84MAbswZyCki+ghEn/tT41/m7GNgM60Ar
  jnwQ2MDjQiQ9TDArl6HqQ0OP/iHL8jf9271dfWtBcBN7528/Le/lwURBDPGdTkX1w8RFpkhN14xKn98dMu5omMVBjAm21PEJEC4pagzmdozjjOxXBLuXKZ2P
  caFANiy/RZATxRxoHhbfjsQ7pN5+8kNwJadLwCezDuw3nY0H4jmXXn6zAXAlt4igJvzDFhimxOBcDLXn8wAbOlxiUEU7joQTqaYMhnbsnMM4FsLe1lqB/R9I
  JrbVYdQBtCY9WaYIVQ7rtKOCNKfdloqPigBaMj2awx6RqXDutgQeL8v3GfT/EkFcPE9D5pN6yjr571ztYzawuDptHXCQAAXV3h/LR8rY5FjAgAYxzdeObp90
  IpxIABbek8BeCPrt6tibwTAf47sC4TzZpJPiQCijc1lI6NHy1rbmwIQ7R3OX1jekbSBSgRgz7RfANFLKt9m7W2YXwxa7stxfiYCaEivwyh3Z2cKHAGLvnCay
  gCuld7uEDhoykET41jAnl+Fc6h3rNgMsKX3DoDHTDhmcIx3A+E8rgrgZwDXl+cczQN0ZMTCkV+mxr1onDLWAT3+nw6Ec0MqgMaBhV1sWfNagyc6A+bDFIYf+
  3snYs/2DAAAheFk7/h9U2BMeq8Q8JwuAKq7MxMAGHh1STjPr46tD4Du+U9s3e+3xj9JA2oCAIC+OtAHoCG9gwzsTnNY9XMCf+gL96HV9vacd3sw5Xy75n8Gz
  hkIOOQLZ8/gDJhpfweiHaoBKtidO7+MzRtG8AAR7wTRVjC2mVoJrvGP+WjQcm9LA3ACRFsUAitkUhGAk0HLXXOU118DZtp/gOiqQtEpNK4IwJ9By706LQOGH
  sDQTwHdRTB2QlQ0BdKLoO7XYFI5qAKA2mvQ0EaoCgBKCyHdS+E6ZYDSUjhScxCsrxXeZIVMqsgARnhnr+ok6TzgpwKqDiUwFQA4FQhnc+p2ODJozHb2M/PTS
  pHkNDINgIhe96ebfZc7sRkQ6Xs4DPWeCfSAMg7AsibjdEbJp8Kys6Bf53OJglkA1A5EcyIuWSs7FjcKIM+xuK6LEdUToaRSUvSgJPfFSOSQjquxqgHkvhqLA
  Oi4HK0UQNHL0QhC0evxKgEUvh7vzst6yOGyLjjU5HOpAolLEOoki0uDoS6bUwawUhTrKI/rpZFJLpcJwAqE4ZXJrZoONZTLZZPHdWPJnAHdhnWSzWWRxSntB
  tNKzP8QaiCfU5XDJcWUOwO6HQ61XL4LYah/MLE6tbo/mSGiR3TriyKdDzO/X8ufzMTNrxWd0X0A7i2gNjkN4FMLOByn71GtVYPsCtcAFSci1UloWTuz/GzOC
  sOvktQkKmOq2hgBoOpMFXbrAKqgXqcxhz4D/gVkGDdfoNgmzwAAAABJRU5ErkJggg==
  )
  base64_2=
  (join`r`n LTrim
  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
  )
  base64_3=
  (join`r`n LTrim
  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
  )
  Base64:=Mode=3?base64_3:Mode=2?base64_2:base64_1
  DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
  VarSetCapacity(Dec, DecLen, 0)
  DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
  DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"), "PtrP", pBitmap)
  ;;78感叹号,155问号,110
  ;;pBitmap := Gdip_CreateBitmapFromFile("shell32.dll" ,Mode=3?110:Mode=2?78:278,40)
  DllCall("gdiplus\GdipGetImageWidth", "UPtr", pBitmap, "uint*", ImageWidth)
  DllCall("gdiplus\GdipGetImageHeight", "UPtr", pBitmap, "uint*", ImageHeight)
  Width := Max(Width:=320,ImageWidth+Max(TitleRC[3]+15,TextRC[3]+15)+40), Height := Max(Height:=120,Max(ImageHeight+50,TitleRC[4]+TextRC[4]+50))
  VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(Width, bi, 4, "uint")
  NumPut(Height, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
  hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
  hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
  obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm)
  DllCall("Gdiplus\GdipCreateFromHDC2", "UPtr", hDC, "UPtr", "", "UPtr*", G)
  DllCall("gdiplus\GdipSetSmoothingMode", "UPtr", G, "int", 2)
  ;绘背景色
  DllCall("gdiplus\GdipCreateSolidFill", "UInt", "0x" Format("{:02x}",Transparent) (Dark?"000000":"f0f0f0"), "UPtr*", pBrush)
  DllCall("gdiplus\GdipCreateRegion", "UInt*", Region)
  DllCall("gdiplus\GdipGetClip", "UPtr", G, "UInt", Region)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", 0, "float", 0, "int", 4)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", 0, "float", 0, "float", 0, "int", 4)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", Height, "float", 0, "float", 0, "int", 4)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", Height, "float", 0, "float", 0, "int", 4)
  DllCall("gdiplus\GdipFillRectangle", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", Width, "float", Height)
  DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
  DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
  DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", 0, "float", 0)
  DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", 0, "float", 0, "float", 0)
  DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", Height, "float", 0, "float", 0)
  DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", Height, "float", 0, "float", 0)
  DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
  DllCall("gdiplus\GdipDeleteRegion", "UPtr", Region)
  DllCall("gdiplus\GdipGetImageDimension", "UPtr", pBitmap, "float*", ImageWidth:=Width, "float*", ImageHeight:=Height)
  ImageWidth := Round(ImageWidth),ImageHeight := Round(ImageHeight)
  DllCall("gdiplus\GdipDrawImageRectRect", "UPtr", G, "UPtr", pBitmap, "float", 15, "float", Abs(Height-ImageHeight)/2
    , "float", Width, "float", Height, "float", 0, "float", 0, "float", Width, "float", Height, "int", 2
    , "UPtr", 0, "UPtr", 0, "UPtr", 0)
  ;;绘文字
  TitleRC:=StrSplit(TextToGraphics_Gdip(G,title, "x" ImageWidth+30 " y" Abs(Height-TitleRC[4]-TextRC[4]-10)/2 " cff" (Dark?"f0f0f0":"333333") " s" TitleFntSize (text=""&&title<>""?"":" Bold "), SystemFontName, TitleRC[3]+30, TitleRC[4]),"|")
  TextRC:=StrSplit(TextToGraphics_Gdip(G,Text, "x" TitleRC[1] " y" TitleRC[2]+TitleRC[4]+5 " cff" (Dark?"e3e3e3":"454545") " s" TextFntSize " ", SystemFontName, TextRC[3]+15, TextRC[4]),"|")
  DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
  WinGetPos,TrayWndX,TrayWndY,TrayWndW,TrayWndH,ahk_class Shell_TrayWnd
  Loop,% Width
  {
    xpos:=TrayWndW>TrayWndH?A_ScreenWidth-A_Index-15:TrayWndX>0?A_Index+30-Width:A_ScreenWidth-A_Index-30
    ypos:=TrayWndW>TrayWndH?TrayWndY>0?A_ScreenHeight-TrayWndH-Height-15:TrayWndH+15:A_ScreenHeight-TrayWndW-Height-15
    if ((xpos != "") && (ypos != ""))
      VarSetCapacity(pt, 8), NumPut(xpos, pt, 0, "UInt"), NumPut(ypos, pt, 4, "UInt")
    if (Width = "") || (Height = ""){
      size := VarSetCapacity(rect, 16, 0)
      er := DllCall("dwmapi\DwmGetWindowAttribute"
        , "UPtr", hCTT, "UInt", 9, "UPtr", &rect, "UInt", size, "UInt")
      If er
        DllCall("GetWindowRect", "UPtr", hCTT, "UPtr", &rect, "UInt")
      r := []
      r.x1 := NumGet(rect, 0, "Int"), r.y1 := NumGet(rect, 4, "Int")
      r.x2 := NumGet(rect, 8, "Int"), r.y2 := NumGet(rect, 12, "Int")
      r.w := Abs(max(r.x1, r.x2) - min(r.x1, r.x2))
      r.h := Abs(max(r.y1, r.y2) - min(r.y1, r.y2))
      Width := r.w
      Height := r.h
    }
    DllCall("UpdateLayeredWindow", "UPtr", hCTT, "UPtr", 0, "UPtr", ((xpos = "") && (ypos = "")) ? 0 : &pt
      , "int64*", Width|Height<<32, "UPtr", hdc, "int64*", 0, "uint", 0, "UInt*", 255<<16|1<<24, "uint", 2)
  }
  DllCall("SelectObject", "UPtr", hdc, "UPtr", obm),DllCall("DeleteObject", "UPtr", hbm)
  DllCall("DeleteDC", "UPtr", hdc),DllCall("gdiplus\GdipDeleteGraphics", "UPtr", G)
  OnMessage(0x201, "CloseCustomTrayTip")
  if timeout {
    CTTimer := Func("DllCall").Bind("DestroyWindow", "Ptr", hCTT)
    SetTimer, % CTTimer, % "-" . timeout
  }
  Return WinExist("ahk_id " hCTT)?{HWND:hCTT,x:xpos,y:ypos,w:Width,h:Height}:False
  ;;格式化字符串自动换行,以免过长
  FormatString:
    loopString:=text=""&&title<>""?title:text
    if !InStr(loopString,"`n"){
      Index:=0,String:=""
      Loop,Parse,loopString
      {
        Index:=A_LoopField~="[\x00-\xff]"?Index+1:Index+2
        String:=Mod(Index,44)=0||Mod(Index,44)=1?String "`n" A_LoopField:String A_LoopField
        String:=RegExReplace(String,"(\n.)[\r\n]","$1")
      }
      if (text=""&&title<>"")
        title:= String<>""?String:title
      Else{
        Text:= String<>""?String:Text
      }
    }
  Return
}
CloseCustomTrayTip(wParam, lParam, uMsg, hWnd){
  Global hCTT,CTTimer
  DetectHiddenWindows,Off
  if (A_Gui="TT"&&wParam){
    Try {
      SetTimer, % CTTimer,Off
      DllCall("DestroyWindow","ptr",hWnd)
      ;;DllCall("user32.dll\PostMessage", "ptr", hWnd, "uint", 0x00A1, "ptr", 2, "ptr", 0)
    }
  }
  DetectHiddenWindows,On
}
TextToGraphics_Gdip(pGraphics, Text, Options, Font:="Arial", Width:="", Height:="", Measure:=0, userBrush:=0, Unit:=0) {
  Static Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
    , Alignments := "Near|Left|Centre|Center|Far|Right"
  OWidth := Width,IWidth := Width, IHeight:= Height
  pattern_opts := (A_AhkVersion < "2") ? "iO)" : "i)"
  RegExMatch(Options, pattern_opts "X([\-\d\.]+)(p*)", xpos)
  RegExMatch(Options, pattern_opts "Y([\-\d\.]+)(p*)", ypos)
  RegExMatch(Options, pattern_opts "W([\-\d\.]+)(p*)", PWidth)
  RegExMatch(Options, pattern_opts "H([\-\d\.]+)(p*)", Height)
  RegExMatch(Options, pattern_opts "C(?!(entre|enter))([a-f\d]+)", Colour)
  RegExMatch(Options, pattern_opts "Top|Up|Bottom|Down|vCentre|vCenter", vPos)
  RegExMatch(Options, pattern_opts "NoWrap", NoWrap)
  RegExMatch(Options, pattern_opts "R(\d)", Rendering)
  RegExMatch(Options, pattern_opts "S(\d+)(p*)", Size)
  Width := PWidth
  DllCall("gdiplus\GdipCloneBrush", "UPtr", Colour[2], "UPtr*", pBrushClone)
  if Colour && !DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrushClone){
    Static Integer := "Integer"
    if Colour[2] is Integer
      PassBrush := 1,pBrush := Colour[2]
  }
  if !(IWidth && IHeight) && ((xpos && xpos[2]) || (ypos && ypos[2]) || (Width && Width[2]) || (Height && Height[2]) || (Size && Size[2]))
    return -1
  Style := 0
  For eachStyle, valStyle in StrSplit(Styles, "|")
  {
    if RegExMatch(Options, "\b" valStyle)
      Style |= (valStyle != "StrikeOut") ? (A_Index-1) : 8
  }
  Align := 0
  For eachAlignment, valAlignment in StrSplit(Alignments, "|")
  {
    if RegExMatch(Options, "\b" valAlignment)
      Align |= A_Index//2.1	; 0|0|1|1|2|2
  }
  xpos := (xpos && (xpos[1] != "")) ? xpos[2] ? IWidth*(xpos[1]/100) : xpos[1] : 0
  ypos := (ypos && (ypos[1] != "")) ? ypos[2] ? IHeight*(ypos[1]/100) : ypos[1] : 0
  Width := (Width && Width[1]) ? Width[2] ? IWidth*(Width[1]/100) : Width[1] : IWidth
  Height := (Height && Height[1]) ? Height[2] ? IHeight*(Height[1]/100) : Height[1] : IHeight
  If !PassBrush
    Colour := "0x" (Colour && Colour[2] ? Colour[2] : "ff000000")
  Rendering := (Rendering && (Rendering[1] >= 0) && (Rendering[1] <= 5)) ? Rendering[1] : 4
  Size := (Size && (Size[1] > 0)) ? Size[2] ? IHeight*(Size[1]/100) : Size[1] : 12
  If RegExMatch(Font, "^(.\:\\.)")
  {
    DllCall("gdiplus\GdipNewPrivateFontCollection", "ptr*", hFontCollection)
    hFontFamily := 0
    E := DllCall("gdiplus\GdipPrivateAddFontFile", "ptr", hFontCollection, "str", Font)
    if !E {
      VarSetCapacity(pFontFamily, 10, 0)
      DllCall("gdiplus\GdipGetFontCollectionFamilyList", "ptr", hFontCollection, "int", 1, "ptr", &pFontFamily, "int*", found)
      VarSetCapacity(FontName, 100)
      DllCall("gdiplus\GdipGetFamilyName", "ptr", NumGet(pFontFamily, 0, "ptr"), "str", FontName, "ushort", 1033)
    }
  } Else DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", Font, "uint", 0, "UPtr*", hFontFamily)
  If !hFontFamily
    DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFontFamily)
  DllCall("gdiplus\GdipCreateFont", "UPtr", hFontFamily, "float", Size, "int", Style, "int", Unit, "UPtr*", hFont)
  DllCall("gdiplus\GdipCreateStringFormat", "int", NoWrap ? 0x4000 | 0x1000 : 0x4000, "int", 0, "UPtr*", hStringFormat)
  If !hStringFormat
    DllCall("gdiplus\GdipStringFormatGetGenericTypographic", "UPtr*", hStringFormat)
  if !PassBrush
    DllCall("gdiplus\GdipCreateSolidFill", "UInt", Colour, "UPtr*", pBrush)
  if !(hFontFamily && hFont && hStringFormat && pBrush && pGraphics)
  {
    E := !pGraphics ? -2 : !hFontFamily ? -3 : !hFont ? -4 : !hStringFormat ? -5 : !pBrush ? -6 : 0
    If pBrush
      DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
    If hStringFormat
      DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
    If hFont
      DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
    If hFontFamily
      DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
    If hFontCollection
      DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
    return E
  }
  VarSetCapacity(RC, 16)
  NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
  NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
  DllCall("gdiplus\GdipSetStringFormatAlign", "UPtr", hStringFormat, "int", Align)
  If InStr(Options, "autotrim")
    DllCall("gdiplus\GdipSetStringFormatTrimming", "UPtr", hStringFormat, "int", 3)
  DllCall("gdiplus\GdipSetTextRenderingHint", "UPtr", pGraphics, "int", Rendering)
  VarSetCapacity(TempRC, 16)
  DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
    , "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
  ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
  ReturnRCtest := StrSplit(ReturnRC, "|")
  testX := Floor(ReturnRCtest[1]) - 2
  If (testX>xpos && NoWrap && (PWidth>2 || OWidth>2))
  {
    nxpos := Floor(xpos - (testX - xpos))
    VarSetCapacity(RC, 16)
    NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
    NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
    VarSetCapacity(TempRC, 16)
    DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
      , "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
    ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
  }
  If vPos
  {
    ReturnRC := StrSplit(ReturnRC, "|")
    if (vPos[0] = "vCentre") || (vPos[0] = "vCenter")
      ypos += (Height-ReturnRC[4])//2
    else if (vPos[0] = "Top") || (vPos[0] = "Up")
      ypos += 0
    else if (vPos[0] = "Bottom") || (vPos[0] = "Down")
      ypos += Height-ReturnRC[4]
    VarSetCapacity(RC, 16)
    NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
    NumPut(Width, RC, 8, "float"), NumPut(ReturnRC[4], RC, 12, "float")
    VarSetCapacity(TempRC, 16)
    DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
      , "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
    ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
  }
  thisBrush := userBrush ? userBrush : pBrush
  if !Measure
    _E := DllCall("gdiplus\GdipDrawString", "UPtr", pGraphics, "WStr", Text, "int", -1
      , "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", thisBrush)
  if !PassBrush
    DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
  DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
  DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
  DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
  If hFontCollection
    DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
  return _E ? _E : ReturnRC
}
Exit:
  DllCall("gdiplus\GdiplusShutdown", "UPtr", CTToken)
  if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
    DllCall("FreeLibrary", "UPtr", hModule)
  ExitApp
Return

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。