首页 > 其他分享 >[AHK2 ui] 轻松设置主题

[AHK2 ui] 轻松设置主题

时间:2024-03-25 13:11:46浏览次数:28  
标签:default Bgc applyTheme AHK2 轻松 color Theme Fc ui

开始

在写ui工具的时候,常常会设置控件的背景或字体颜色;

通常的做法是在options参数中使用backgroundRed cblack

而如果想使用变量就会出现麻烦的字符串拼接,像这样:

this.AddText('background' bgc ' c' fc)

在控件很多的时候便会像这样(我曾经写的ui):
image

为了解决这种复杂性,有了下面的工具类Theme.ahk

代码

class Theme {

  __New(_builder) {
    this.t := _builder.applyTheme
  }

  Custom := Map()

  SetCtrlOpts(ctrl, opts) {
    this.Custom.Set(ctrl.Hwnd, opts)
    return this
  }

  Apply(target) {
    if not target is Gui {
      throw Error('target is no a gui')
    }
    target.BackColor := this.t.window_Bgc
    ctrls := WinGetControlsHwnd(target)
    for ctrl in ctrls {
      c := GuiCtrlFromHwnd(ctrl)
      if this.Custom.Has(ctrl) {
        c.Opt(this.Custom.Get(ctrl))
        continue
      }
      switch {
        case c is Gui.Edit: c.Opt('+Background' this.t.edit_Bgc ' +c' this.t.edit_Fc)
        case c is Gui.Text: c.Opt('+c' this.t.default_Fc)
        case c is Gui.ListView: c.Opt('+Background' this.t.lv_Bgc ' +c' this.t.lv_Fc)
        case c is Gui.StatusBar: c.Opt('-Theme +Background' this.t.statusBar_Bgc ' +c' this.t.statusBar_Fc)
        default: 
      }
    }
    return target
  }

  static Dark(target) => Theme.Builder().UseTheme('Dark').Build().Apply(target)
  static Light(target) => Theme.Builder().UseTheme('Light').Build().Apply(target)
  static Custom(target, _theme) => Theme.Builder().UseTheme(_theme).Build().Apply(target)

  class Builder {

    __New() {
      this.applyTheme := Theme.Themes()
    }

    UseTheme(_theme := 'Light') {
      switch _theme {
        case 'Dark': this.applyTheme := Theme.Themes.Dark()
        case 'Light': this.applyTheme := Theme.Themes.Light()
        default:
          {
            if _theme is Theme.Themes {
              this.applyTheme := _theme
            } else Throw Error('invalid theme type: ' Type(_theme))
          }
      }
      return this
    }

    Chain(exp) => this
    LTrim3(str) => LTrim(str, '#')
    BackColor(color) => this.Chain(this.applyTheme.window_Bgc := this.LTrim3(color))
    LvFontColor(color) => this.Chain(this.applyTheme.lv_Fc := this.LTrim3(color))
    LvBgc(color) => this.Chain(this.applyTheme.lv_Bgc := this.LTrim3(color))
    TextColor(color) => this.Chain(this.applyTheme.default_Fc := this.LTrim3(color))
    EditFontColor(color) => this.Chain(this.applyTheme.edit_Fc := this.LTrim3(color))
    EditBgc(color) => this.Chain(this.applyTheme.edit_Bgc := this.LTrim3(color))
    StatusBarFc(color) => this.Chain(this.applyTheme.statusBar_Fc := this.LTrim3(color))
    StatusBarBgc(color) => this.Chain(this.applyTheme.statusBar_Bgc := this.LTrim3(color))

    Build() => Theme(this)

  }

  class Themes {
    __New() {
      this.window_Bgc := 'white'
      this.default_Fc := 'Black'
      this.default_Bgc := this.window_Bgc
      this.edit_Fc := this.default_Fc
      this.edit_Bgc := this.default_Bgc
      this.lv_Fc := this.default_Fc
      this.lv_Bgc := this.default_Bgc
      this.statusBar_Fc := this.default_Fc
      this.statusBar_Bgc := 'grey'
    }

    class Dark extends Theme.Themes {
      __New() {
        super.__New()
        this.window_Bgc := '1D2021'
        this.default_Fc := 'FABD2F'
        this.edit_Fc := '61CEDB'
        this.edit_Bgc := '292929'
        this.lv_Fc := 'B9CAE4'
        this.lv_Bgc := '434957'
        this.statusBar_Fc := 'FABD2F'
        this.statusBar_Bgc := '94A3BF'
      }
    }

    class Light extends Theme.Themes {
      __New() {
        super.__New()
        this.window_Bgc := 'f6eeda'
        this.default_Fc := '682d00'
        this.edit_Fc := '4b0c37'
        this.edit_Bgc := 'fffaf4'
        this.lv_Fc := '00667d'
        this.lv_Bgc := 'fffaed'
        this.statusBar_Fc := '682d00'
        this.statusBar_Bgc := 'e8e1cd'
      }
    }
  }

}

解释

我们使用builder模式和内部类进行封装,这样使它像流式使用,也可以直接使用工厂方法,极大简化操作。

例子

g := Gui('')
g.SetFont('s15', 'consolas')
text := g.AddText(, 'Test')
g.AddEdit('+Background000')
; Use [builder()]
Theme.Builder()
  .UseTheme('Dark')               ; set theme
  .TextFontColor('#abc')          ; set all text font color
  .BackColor('White')             ; set window background color
  .Build()                        ; build
  .SetCtrlOpts(text, '+cblack')   ; set single control's options
  .Apply(g)                       ; finally apply theme
; Use Factory methods
Theme.Dark(g)
; Or use custom theme
class MyTheme extends Theme.Themes {
  __New() {
    super.__New()
    this.default_Fc := 'green'
  }
}
; Then call Theme.Custom()
Theme.Custom(g, MyTheme())
g.Show()

最常用的其实是工厂方法,有了它,我们设置主题的时候就可以简单的在构造函数的最后添加一句:

Theme.Light(this);

多么简洁!

标签:default,Bgc,applyTheme,AHK2,轻松,color,Theme,Fc,ui
From: https://www.cnblogs.com/refiz/p/18094146

相关文章

  • Linux文件上传百度云盘轻松解决数据传输和备份
    本文主要的目的就是在Linux环境下通过命令行来使用百度云盘,直接在服务器上打包压缩备份将数据传输到百度网盘,之后可以进行轻松分享,而且还可以支持备份,解决文件的传输和分享难题插件介绍bypy是一个Python客户端,用于操作百度网盘提供了丰富的命令行操作。该工具能够直接在Lin......
  • [AHK2] 不用结束符的热字串
    开始通常,我们使用热字串是这样的:::;btw::bytheway需要使用结束符(;''.等)来触发。但在官方文档中,找到一种方法可以不使用结束符,基于InputHook的方式。原始的例子就不展示了,我们直接入正题--封装后的代码。代码/***@example*;registeractionsbyconstructor......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • Java项目:汽车租赁管理系统(java+SpringBoot+Vue+ElementUI+Mybaits+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SpringbootVue汽车租赁管理系统角色:管理员、用户、普通管理员三种角色,分为前后台;用户:用户通过用户登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、汽车信息、汽车资讯、汽车论坛、公......
  • 想实现Canvas元素拖拽?速来一探究竟,你也可以轻松做到!
    元素拖拽是一种常见的交互设计模式,在许多场景下都有应用:地图打标、画板图形拖拽、可视化组件拖拽、交互式表格等。实现元素拖拽的核心在于监听和响应鼠标事件,模拟canvas元素事件,并同步更新Canvas绘制。主要需实现:创建元素坐标转换(鼠标事件坐标和canvas坐标转换)事件监听、元......
  • EasyUi之Tabs(选项卡)
    原文链接:https://blog.csdn.net/qianbihua00/article/details/115392143什么是Tabs选项卡是最流行的导航模式之一(与菜单栏和垂直导航一样)。选项卡最大的优点是用户很熟悉,而且经常是持久的内容,所以即使用户在网站或应用程序中跳出刚浏览过的内容,他们也不会迷失。官方示例 ......
  • 鸿鹄电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业
    随着企业的快速发展,招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求,建立一个公平、公开、公正的采购环境至关重要。在这个背景下,我们开发了一款电子招标采购软件,以最大限度地控制采购成本,提高招投标工作的公开性和透明性,并确保符合国家电子招投标......
  • GUID生成器 - 开源研究系列文章
          今天整理原来的代码,把GUID生成器的源码进行了整理。原来的C#和VB6的代码都进行了整理。然后把这个代码发布出来,让需要的读者能够进行复用。 1、项目目录;  2、源码介绍;  3、运行界面;  4、使用介绍......
  • ElementUI的Table控件,合并列
    x//计算需要合并的列for(letk=0;k<that.tableData.length;k++){//判断当前类型是否与下一个类型一致,一致则两个单元格合并。if((k+1)<that.tableData.length&&......