字体选择的返回上,还有些问题

; By 蜜獾哥
CustomColors:=[0x1010E8,0xFFFF17,0x19BFFF,0xE2CC79,0xFF7A00,0xFF9700,0x549E54,0xF0F0F0
    ,0xB1F7FF,0x6DD71D,0xC073D1,0xE8E8E8,0xe05855,0xB9D497,0x0078D7,0xF8B62D]
Gui,Test:Destroy
Gui,Test:+HWNDhTest
Gui,Test:Add, Text,w60 Right section, % "BGR:"
Gui,Test:Add, Edit,ys-4
Gui,Test:Add, Text,w60 Right section xs, % "RGB:"
Gui,Test:Add, Edit,ys-4
Gui,Test:Add, Text,w60 Right section xs, RRGGBB:
Gui,Test:Add, Edit,ys-4
Gui,Test:Add,Text,xm w250 0x10,
Gui,Test:Add, Text,w60 Right section xs, 字体名称:
Gui,Test:Add, Edit,ys-4
Gui,Test:Add, Text,w60 Right section xs, 字体大小:
Gui,Test:Add, Edit,ys-4
Gui,Test:Add, Text,w60 Right section xs, 字体颜色:
Gui,Test:Add, Edit,ys-4
Gui,Test:Add, Checkbox,xm y+10 vcboc1,粗体
Gui,Test:Add, Checkbox,x+0 vcboc2 yp,斜体
Gui,Test:Add, Checkbox,x+0 vcboc3 yp,细体
Gui,Test:Add, Checkbox, x+0 vcboc4 yp,下划线
Gui,Test:Add, Checkbox,x+0 vcboc5 yp,删除线
Gui,Test:Add,Text,xm y+10 w250 0x10,
Gui,Test:Add,Button, gbtn1,取色
Gui,Test:Add,Button,x+10 yp gbtn2,字体
Gui,Test:Show
Return

btn1:
    Dlg_Color(SelectColor,"自定义取色窗口",hTest,CustomColors*)
    if objCount(SelectColor){
        GuiControl,test:,Edit1,% SelectColor.BGR
        GuiControl,test:,Edit2,% SelectColor.RGB
        GuiControl,test:,Edit3,% SelectColor.RRGGBB
        Gui,+OwnDialogs
        MsgBox % "BGR:" SelectColor.BGR
            . "`nRGB:" SelectColor.RGB
            . "`nRRGGBB:" SelectColor.RRGGBB
    }
Return

btn2:
  Dlg_Font(FntObject,"字体选择器",hTest)
  GuiControl,test:,Edit4,% FntObject["名称"]
  GuiControl,test:,Edit5,% FntObject["字号"]
  GuiControl,test:,Edit6,% FntObject["颜色"]
  GuiControl,test:, cboc1,% FntObject["粗体"]?1:0
  GuiControl,test:, cboc2,% FntObject["斜体"]?1:0
  GuiControl,test:, cboc3,% FntObject["细体"]?1:0
  GuiControl,test:, cboc4,% FntObject["下划线"]?1:0
  GuiControl,test:, cboc5,% FntObject["删除线"]?1:0
Return

TestGuiClose:
    ExitApp
Return
;-----------------------------------------字体选择----------------------------------------------------------
/*!
    函数: Dlg_Font(ByRef FntObject, WinTitle:="",hwnd="",effects=1)---->显示用于选择颜色的标准窗口对话框。

    参数:
        FntObject - 存储fontObject的变量的名称,返回结果集{"名称":"","粗体":"","斜体":"","细体":"","字号":"","下划线":"","删除线":"","颜色":""}
        WinTitle - 自定义窗口标题,默认标题为「字体」
        hwnd - 关联对话框对象的窗口ID
        effects -允许选择下划线/删除线/斜体
*/
Dlg_Font(ByRef FntObject, WinTitle:="",hwnd=0,effects=1){
  static logfont
  FntObject:=Object()
  Style := objCount(Style) ? Style: Object() 
  VarSetCapacity(logfont,60),LogPixels:=DllCall("GetDeviceCaps","uint",DllCall("GetDC","uint",0),"uint",90),Effects:=0x041+(Effects?0x100:0)
  for a,b in fontval:={16:style.bold?700:400,20:style.italic,21:style.underline,22:style.strikeout,0:style.size?Floor(style.size*logpixels/72):16}
    NumPut(b,logfont,a)
  cap:=VarSetCapacity(choosefont,A_PtrSize=8?103:60,0)
  NumPut(hwnd,choosefont,A_PtrSize)
  for index,value in [[cap,0,"Uint"],[&logfont,A_PtrSize=8?24:12,"Uptr"],[effects,A_PtrSize=8?36:20,"Uint"],[style.color,A_PtrSize=4?6*A_PtrSize:5*A_PtrSize,"Uint"]]
    NumPut(value.1,choosefont,value.2,value.3)
  SetTimer, AsynchronousWinFntWait, -1
  if (A_PtrSize=8)
    strput(name,&logfont+28),r:=DllCall("comdlg32\ChooseFont","uptr",&CHOOSEFONT,"cdecl"),name:=strget(&logfont+28)
  else
    strput(name,&logfont+28,32,"utf-8"),r:=DllCall("comdlg32\ChooseFontA","uptr",&CHOOSEFONT,"cdecl"),name:=strget(&logfont+28,32,"utf-8")
  if !r
    return False
  for a,b in {bold:16,italic:20,underline:21,strikeout:22}
  {
    style[a]:=NumGet(logfont,b,"UChar")
  }
  l_Color:=NumGet(choosefont,A_PtrSize=4?6*A_PtrSize:5*A_PtrSize),FntObject["名称"]:=name
  FntObject["粗体"]:=style.bold<188?0:1,FntObject["斜体"]:=style.italic?1:0,FntObject["细体"]:=InStr(FntInfo,"细")?1:0
  FntObject["字号"]:=NumGet(CHOOSEFONT,A_PtrSize=8?32:16,"UChar")//10?NumGet(CHOOSEFONT,A_PtrSize=8?32:16,"UChar")//10:DefaultSize
  FntObject["下划线"]:=style.underline?1:0,FntObject["删除线"]:=style.strikeout?1:0
  FntObject["颜色"]:=Format("0x{:06X}",((l_Color&0xFF)<<16)+(l_Color&0xFF00)+((l_Color>>16)&0xFF))
  ;charset:=NumGet(logfont,23,"UChr")
  SetTimer, AsynchronousWinFntWait, Off
  return DllCall("CreateFontIndirect",uptr,&logfont,"cdecl")

  AsynchronousWinFntWait:
    if WinExist("ahk_class #32770", "字体") or (n=60)
      Goto FontWinWait
    n := n="" ? 1 : ++n
    SetTimer AsynchronousWinFntWait, -10
  Return

  FontWinWait:
    if WinTitle&&!WinExist("ahk_class ahk_class #32770",WinTitle){
      WinSetTitle, ahk_class #32770,, %WinTitle%
      ControlGetText, DefaultSize , Edit3, ahk_class #32770
      Control, Disable ,, ComboBox5, ahk_class #32770
      Control, Disable ,, SysLink1, ahk_class #32770
    }
    
  Return
}
;-----------------------------------------配色----------------------------------------------------------
/*!
    函数: Dlg_Color(ByRef r_Color,WinTitle="", hOwner:=0, Palette*)---->显示用于选择颜色的标准窗口对话框。

    参数:
        r_Color - 初始颜色-->默认设置为黑色.返回结果集{RGB:",BGR:"",RRGGBB:"}
        WinTitle - 自定义窗口标题,默认标题为「颜色」
        hOwner - 对话框对象的窗口ID, 如果有的话默认为0, i.e. 没有对象. 如果指定的DlgX和DlgY被忽略.
        Palette -最多16个BGR颜色值的数组。这些将成为对话框中的初始自定义颜色。
    Remarks:
        对话框中的自定义颜色在调用时被标记。如果用户选择OK,则将加载调色板阵列(如果存在)使用对话框中的自定义颜色。
    Returns:
        如果用户选择“确定”,返回True。否则返回False
*/
Dlg_Color(ByRef r_Color, WinTitle:="",hOwner:=0, Palette*){
    Static CHOOSECOLOR, A_CustomColors
    if !VarSetCapacity(A_CustomColors){
        If !objLength(Palette){
            Palette:=[0x1C7399,0xEEEEEC,0x014E8B,0x444444,0x009FE8,0xDEF9FA,0xF8B62D,0x90FC0F,0x0078D7,0x0D1B0A,0xB9D497,0x00ADEF,0x1778BF,0xFDF6E3,0x002B36,0xDEDEDE]
        }
        VarSetCapacity(A_CustomColors,64,0)
        for Index, Value in Palette
            NumPut(Value, A_CustomColors, 4*(Index - 1), "UInt")
    }
    l_Color:=r_Color, l_Color:=((l_Color&0xFF)<<16)+(l_Color&0xFF00)+((l_Color>>16)&0xFF)
    ;-- 创建并填充CHOOSECOLOR结构
    lStructSize:=VarSetCapacity(CHOOSECOLOR,(A_PtrSize=8) ? 72:36,0)
    NumPut(lStructSize,CHOOSECOLOR,0,"UInt")            ;-- lStructSize
    NumPut(hOwner,CHOOSECOLOR,(A_PtrSize=8) ? 8:4,"Ptr")
    ;-- hwndOwner
    NumPut(l_Color,CHOOSECOLOR,(A_PtrSize=8) ? 24:12,"UInt")
    ;-- RGB结果
    NumPut(&A_CustomColors,CHOOSECOLOR,(A_PtrSize=8) ? 32:16,"Ptr")
    ;-- lpCustColors
    NumPut(0x00000103,CHOOSECOLOR,(A_PtrSize=8) ? 40:20,"UInt")
    ;-- Flags
    if (WinTitle!="")
        SetTimer, AsynchronousWinWait, -1
    RC:=DllCall("comdlg32\ChooseColor" . (A_IsUnicode ? "W":"A"),"Ptr",&CHOOSECOLOR)
    ;-- 按下“取消”按钮或关闭对话框
    if (RC=0)
        Return False
    ;-- 收集所选颜色
    l_Color:=NumGet(CHOOSECOLOR,(A_PtrSize=8) ? 24:12,"UInt")
    ;-- 转换为RGB
    TempColor:=((l_Color&0xFF)<<16)+(l_Color&0xFF00)+((l_Color>>16)&0xFF)
    Red:=((TempColor & 0xff0000) >> 16),Green:=((TempColor & 0x00ff00) >> 8),Blue:=(TempColor & 0xff)
    ;-- 用选定的颜色更新
    r_Color:={RGB:Format("0x{:06X}",TempColor)  ;返回16进制RGB
        ,BGR:Format("0x{1:02X}{2:02X}{3:02X}",[Blue,Green,Red]*)  ;返回16进制BGR
        ,RRGGBB:Red "," Green "," Blue}  ;返回10进制RGB
    Return True

    AsynchronousWinWait:
    if WinActive("ahk_class #32770", "颜色") or (n=60)
        Goto ChangeTitle
    n := n="" ? 1 : ++n
    SetTimer AsynchronousWinWait, -10
    Return
    
    ChangeTitle:
    WinSetTitle, ahk_class #32770, 颜色, %WinTitle%
    Return
}

 

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