Giter Club home page Giter Club logo

xcgui's Introduction

XCGUI

release XCGUI golang GoDoc License

程序示例   官方文档   项目文档   官方资源

介绍

English | 简体中文

  • 本库封装自炫彩界面库,功能丰富(近2000个API接口),简单易用,轻量级,高度DIY自定义,支持一键换肤。
  • 炫彩界面库是由C/C++语言开发:软件运行效率高,不需要第三方库的支持,不依赖MFC,ATL,WINDOWS标准控件等。
  • DirectUI设计**:在窗口内没有子窗口,界面元素都是逻辑上的区域(无HWND句柄,安全,灵活),所有UI元素都是自主开发(不受系统限制),更加灵活的实现各种程序界面,满足不同用户的需求。
  • 拥有免费的UI设计器:快速开发工具,所见即所得,高度自定义系统(DIY),让UI开发变的更加简单。
  • 支持Direct2D,硬件加速,能更大程度的发挥硬件特性,创建高性能,高质量的2D图形。
  • WIKI 里有简单的入门教程,有空可以看一下,少走弯路。
  • 有完善的 中文官方文档官方资源社区
  • 官方QQ群(人多用各种语言的都有):2283812,只聊Go语言版的QQ群:793788011

获取

go get github.com/twgh/xcgui

可视化UI设计器

使用UI设计器可以快速设计界面,节省大量代码。

uidesigner

设计器使用例子,只有这么多代码:

package main

import (
	_ "embed"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
)

//go:embed res/qqmusic.zip
var qqmusic []byte

func main() {
	a := app.New(true)
	a.EnableDPI(true)
	a.EnableAutoDPI(true)
	// 从内存zip中加载资源文件
	a.LoadResourceZipMem(qqmusic, "resource.res", "")
	// 从内存zip中加载布局文件, 创建窗口对象
	w := window.NewByLayoutZipMem(qqmusic, "main.xml", "", 0, 0)
    
	// songTitle是在main.xml中给歌曲名(shapeText组件)设置的name属性的值.
	// 通过 GetObjectByName 可以获取布局文件中设置了name属性的组件的句柄.
	// 可简化为: widget.NewShapeTextByName("songTitle").
	song := widget.NewShapeTextByHandle(a.GetObjectByName("songTitle"))
	println(song.GetText()) // 输出: 两只老虎爱跳舞
    
	// 调整布局
	w.AdjustLayout()
	// 显示窗口
	w.Show(true)
	a.Run()
	a.Exit()
}

动态链接库下载

程序运行时需要把xcgui.dll放到程序运行目录。

在开发时最好是放到C:\Windows\System32目录,这样就不需要频繁把dll放到不同程序的运行目录了。

(1)文件直链

64位 点击下载
32位 点击下载

(2)命令行下载

64位

iwr https://pkggo-generic.pkg.coding.net/xcgui/file/xcgui.dll?version=latest -OutFile xcgui.dll

32位

iwr https://pkggo-generic.pkg.coding.net/xcgui/file/xcgui-32.dll?version=latest -OutFile xcgui.dll

(3)使用getxcgui工具下载

请确保 %GOPATH%\bin 在环境变量path中

go install github.com/twgh/getxcgui@latest
getxcgui  

如果要把dll直接下载到C:\Windows\System32目录里,请使用如下命令:

getxcgui -o %windir%\system32\xcgui.dll

此工具的源码在这里,更多flags可以点进去查看

(4)网盘下载

网盘内还包含界面设计器chm帮助文档

网盘 下载地址
百度网盘 下载
蓝奏云 下载

简单窗口(纯代码)

SimpleWindow

package main

import (
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/imagex"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xcc"
)

func main() {
	// 1.初始化UI库
	a := app.New(true)
	a.EnableDPI(true)
	a.EnableAutoDPI(true)
	// 2.创建窗口
	w := window.New(0, 0, 430, 300, "xcgui window", 0, xcc.Window_Style_Default|xcc.Window_Style_Drag_Window)

	// 设置窗口边框大小
	w.SetBorderSize(0, 30, 0, 0)
	// 设置窗口图标
	a.SetWindowIcon(imagex.NewBySvgStringW(svgIcon).Handle)
	// 设置窗口透明类型
	w.SetTransparentType(xcc.Window_Transparent_Shadow)
	// 设置窗口阴影
	w.SetShadowInfo(8, 255, 10, false, 0)

	// 创建按钮
	btn := widget.NewButton(165, 135, 100, 30, "Button", w.Handle)
	// 注册按钮被单击事件
	btn.Event_BnClick(func(pbHandled *bool) int {
		a.MessageBox("提示", btn.GetText(), xcc.MessageBox_Flag_Ok|xcc.MessageBox_Flag_Icon_Info, w.GetHWND(), xcc.Window_Style_Modal)
		return 0
	})

	// 3.显示窗口
	w.Show(true)
	// 4.运行程序
	a.Run()
	// 5.释放UI库
	a.Exit()
}

var svgIcon = `<svg t="1669088647057" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5490" width="22" height="22"><path d="M517.12 512.8704m-432.3328 0a432.3328 432.3328 0 1 0 864.6656 0 432.3328 432.3328 0 1 0-864.6656 0Z" fill="#51C5FF" p-id="5491"></path><path d="M292.1472 418.7136c-85.0432 0-160.4096 41.3696-207.104 105.0624 4.5568 182.7328 122.368 337.3056 285.952 396.032 103.2192-33.28 177.92-130.048 177.92-244.3776 0-141.7216-114.944-256.7168-256.768-256.7168z" fill="#7BE0FF" p-id="5492"></path><path d="M800.2048 571.6992l-101.888-58.8288 101.888-58.8288c16.896-9.728 22.6816-31.3344 12.9536-48.2304l-55.296-95.744c-9.728-16.896-31.3344-22.6816-48.2304-12.9536l-101.888 58.8288V238.336c0-19.5072-15.8208-35.328-35.328-35.328H461.824c-19.5072 0-35.328 15.8208-35.328 35.328v117.6064L324.608 297.1136c-16.896-9.728-38.5024-3.9424-48.2304 12.9536l-55.296 95.744c-9.728 16.896-3.9424 38.5024 12.9536 48.2304l101.888 58.8288-101.888 58.8288c-16.896 9.728-22.6816 31.3344-12.9536 48.2304l55.296 95.744c9.728 16.896 31.3344 22.6816 48.2304 12.9536l101.888-58.8288v117.6064c0 19.5072 15.8208 35.328 35.328 35.328h110.592c19.5072 0 35.328-15.8208 35.328-35.328v-117.6064l101.888 58.8288c16.896 9.728 38.5024 3.9424 48.2304-12.9536l55.296-95.744c9.728-16.896 3.9424-38.5024-12.9536-48.2304z" fill="#CAF8FF" p-id="5493"></path><path d="M517.12 512.8704m-234.24 0a234.24 234.24 0 1 0 468.48 0 234.24 234.24 0 1 0-468.48 0Z" fill="#FFFFFF" p-id="5494"></path><path d="M517.12 512.8704m-103.5776 0a103.5776 103.5776 0 1 0 207.1552 0 103.5776 103.5776 0 1 0-207.1552 0Z" fill="#51C5FF" p-id="5495"></path></svg>`

常量

xcc包里都是常量,像这样使用:xcc.Window_Transparent_Shadow

需要用到xcc包常量的参数注释都是类似这样的,复制Window_Transparent_xcc包 里搜索即可看到相关常量注释:

注释

命令介绍

xc包里包含xcgui.dll里所有的API,有近2000个函数,不习惯使用类的可以直接使用,封装好的类都在其他包里。

在某些情况下,把xc包里的原生函数与封装好的类混合起来使用会更加方便。

炫彩所有的结构体也都在xc包里。

建议使用 Goland 进行开发,以获得最好的开发体验。

事件

炫彩的全部事件都已经定义好了,都是以Event开头的, 以1结尾的事件是会传进去元素的句柄。

在循环中注册事件时,回调函数尽量不要使用匿名函数,使用匿名函数意味着您每次都在创建1个新的回调,最终您将会遇到因创建过多回调导致程序崩溃的报错(大概在2000个回调时会遇到),事件回调函数不使用匿名函数即可避免此问题,一般程序应该不会用到2000个事件,只要注意在多次循环中注册事件时不使用匿名函数就行。这个是Go语言添加的限制,不是xcgui添加的限制。

xc-event.png

一个事件可以注册多个处理函数,执行顺序为先执行最后注册的函数,最后执行第一个注册的函数,当你想拦截当前事件或不想向后传递,只需要将参数*pbHandled=true即可。

关于版本号

1.3.330为例,1仅代表本库是正式版,3.33代表是XCGUI官方3.3.3版本,最后的0代表是基于3.33封装的第1个版本,如果基于3.33还有更新,那么会累加。

JetBrains 开源证书支持

xcgui 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 free JetBrains Open Source license(s) 正版免费授权,在此表达我的谢意。

jetbrains.png

模块继承关系

xcgui模块关系图

封装进度

这些类都是基于xc包里的一千多个函数封装的。

中文名称 包名 类名 是否封装完毕 文档
程序(炫彩全局API) app App 文档
窗口 window Window 文档
框架窗口 window FrameWindow 文档
模态窗口 window ModalWindow 文档
形状对象 widget Shape 文档
圆形形状对象 widget ShapeEllipse 文档
形状对象GIF widget ShapeGif 文档
组框形状对象 widget ShapeGroupBox 文档
直线形状对象 widget ShapeLine 文档
形状对象图片 widget ShapePicture 文档
矩形形状对象 widget ShapeRect 文档
形状对象文本 widget ShapeText 文档
表格 widget Table 文档
按钮 widget Button 文档
下拉组合框 widget ComboBox 文档
编辑框(常规, 富文本, 聊天气泡) widget Edit 文档
代码编辑框 widget Editor 文档
基础元素 widget Element 文档
列表 widget List 文档
列表框 widget ListBox 文档
弹出菜单 widget Menu 文档
进度条 widget ProgressBar 文档
静态文本连接按钮 widget TextLink 文档
布局元素 widget LayoutEle 文档
布局框架 widget LayoutFrame 文档
列表视图 widget ListView 文档
菜单条 widget MenuBar 文档
Pane元素 widget Pane 文档
滚动条 widget ScrollBar 文档
滚动视图 widget ScrollView 文档
滑动条元素 widget SliderBar 文档
标签栏元素 widget TabBar 文档
工具条 widget ToolBar 文档
列表树元素 widget Tree 文档
日期时间 widget DateTime 文档
月历卡片 widget MonthCal 文档
数据适配器-列表视元素 adapter AdapterListView 文档
数据适配器-单列Map-列表头(listHeader) adapter AdapterMap 文档
数据适配器-XList-XListBox adapter AdapterTable 文档
数据适配器-树元素 adapter AdapterTree 文档
背景管理器 bkmanager BkManager 文档
背景对象 bkobj BkObj 文档
字体 font Font 文档
图片操作 imagex Image 文档
SVG矢量图形 svg Svg 文档
列表项模板 tmpl ListItemTemplate 文档
节点 tmpl Node 文档
图形绘制 drawx Draw 文档
动画序列 ani Anima 文档
动画组 ani AnimaGroup 文档
动画项 ani AnimaItem 文档
动画旋转项 ani AnimaRotate 文档
动画缩放项 ani AnimaScale 文档
含有XCGUI所有API和结构体 xc 文档
XCGUI常量 xcc 文档
缓动 ease 文档
资源操作 res 文档
Windows系统api wapi 持续更新 文档
调用wapi封装了对窗口的操作 wapi/wnd 持续更新 文档
调用wapi封装了一些常用函数 wapi/wutil 持续更新 文档

xcgui's People

Contributors

twgh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

xcgui's Issues

Gif图片无法显示出来

package main

import (
	_ "embed"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xc"
	"github.com/twgh/xcgui/xcc"
)


//go:embed 2.gif
var img1 []byte

func main() {
	a := app.New(true)
	w := window.NewWindow(0, 0, 415, 296, "", 0, xcc.Window_Style_Default)

	// 加载图片从内存
	hImg := xc.XImage_LoadMemory(img1)

	shapePic := widget.NewShapeGif(8, 30, 400, 260, w.Handle)

	shapePic.SetImage(hImg)

	w.ShowWindow(xcc.SW_SHOW)
	a.Run()
	a.Exit()
}

image.NewImage_LoadMemory的使用

XImage_LoadMemory的第一个参数buffer,但是方法的参数需要传递一个整型,好像这个是一个错误?
应该传递进去一个buffer的指针才对?

如果我理解错误,请给一个例子参考。谢谢

是否支持无显卡或者核显运行流畅?

Bug 描述
对错误是什么的清晰描述。

预期行为
清晰的描述您期望发生的事情。

截图
如果可以,请添加屏幕截图以帮助解释您的问题。

系统:
系统和版本。

其他
其他想说的。

需要特定例子/写法的可以在本贴下面留言

很多人可能没有写过GUI类型的软件,或者没有接触过DriectUI类型的界面库,因此我不知道你们的疑惑会在哪里,需要哪方面更深入的例子,我需要根据你们的需求来继续写出更多的例子,以供所有人查看,请畅所欲言。

list无法添加列文本

list无法添加列文本

复现的代码

package main

import (
	"fmt"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xcc"
)

func main() {

	a := app.New("")

	win := window.NewWindow(0, 0, 466, 300, "炫彩窗口", 0, xcc.Xc_Window_Style_Default)

	list := widget.NewList(50, 50, 300, 300, win.Handle)
	list.CreateAdapterHeader()
	list.CreateAdapter()

	list.AddColumnText(50, "test1", "aaa") //没有显示文本出来
	list.AddColumnText(100, "test2", "bbb") //没有显示文本出来
	list.AddColumnText(100, "test3", "ccc") //没有显示文本出来

	for i:=0; i < 10; i++ {
		index := list.AddItemText(fmt.Sprintf("item-%d", i))
		list.SetItemText(index, 1, fmt.Sprintf("subitem-%d", i))
		list.SetItemText(index, 2, fmt.Sprintf("subitem-%d", i))
	}

	win.ShowWindow(xcc.SW_SHOW)

	a.Run()

	a.Exit()
}

[BUG] failed to GetSelectAll in ListView

failed to GetSelectAll in ListView

func (l *ListView) GetSelectAll(pArray int, nArraySize int) int {
	return xc.XListView_GetSelectAll(l.Handle, pArray, nArraySize)
}

I think the 1st arg should be a pointer to an array but not an int.

lauyoutframe 设置隐藏 UI线程没及时隐藏和显示

func main() {
	a := app.New(true)
        a.LoadResource("resource.res")
	//a.LoadResourceZip("xcgui.zip", "resource.res", "")
	// 从zip中加载布局文件
	hWindow := a.LoadLayout("main.xml", 0, 0)

	if hWindow == 0 {
		panic("error")
	}
	//隐藏对应的id
	laylist := widget.NewLayoutFrameByName("list")

	//主线程ui
	go func() {
		a.CallUiThread(func(data int) int {
			laylist.Show(false)
			return 0
		}, 0)
	}()

	// 创建窗口对象
	win := window.NewWindowByHandle(hWindow)

	//通过name获取对象句柄
	btn := widget.NewButtonByName("btn")
	//添加绑定事件
	btn.Event_BnClick(func(pbHandled *bool) int {
		go func() {
			a.CallUiThread(func(data int) int {
				laylist.Show(false)
				win.AdjustLayout()

				return 0
			}, 0)
		}()

		return btn1(win.GetHWND())
	})
	// 调整布局
	win.AdjustLayout()
	// 显示窗口
	win.ShowWindow(xcc.SW_SHOW)
	a = s
	w = hWindow
	a.SetPaintFrequency(10)
	a.Run()
	a.Exit()
}

绑定事件点击按钮,触发的事件显示layoutframe,窗口的layoutframe没有及时显示,滚动或者缩放才会变化

image

[BUG]

Bug 描述
目前循环调用以下函数一段时间后会触发句柄失效的情况,使用go run或者go build编译成exe文件都会,但是用goland运行程序就不会有这个情况

预期行为
清晰的描述您期望发生的事情。
不会报错
截图
如果可以,请添加屏幕截图以帮助解释您的问题。
1705817956702
image
image

系统:
win11

其他
其他想说的。

代码编辑框提示错误

错误:panic: Failed to find XEditor_SetStyleFunction procedure in xcgui.dll: The specified procedure could not be found.

备注: 自带的代码编辑框的demo, 出错. 把 3.3.3的dll复制过来又可以. 是否这个函数被删除了?

1

fatal error: too many callback functions

不停的调用XC_CallUiThread会报fatal error: too many callback functions错误

这两个帖子好像也提到了超过2000次后会出问题
https://stackoverflow.com/questions/66864829/golang-fatal-error-too-many-callback-functions
golang/go#1912

复现代码

package main

import (
	"fmt"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xc"
	"github.com/twgh/xcgui/xcc"
	"time"
)

func main() {

	a := app.New("")

	win := window.NewWindow(0, 0, 466, 300, "炫彩窗口", 0, xcc.Xc_Window_Style_Default)

	logEdit := widget.NewEdit(100, 100, 100, 100, win.Handle)

	btn_test := widget.NewButton(250, 150, 50, 50, "点击", win.Handle)
	btn_test.Event_BnClick(func(pbHandled *bool) int {
		*pbHandled = true
		go func() {
			// 不断的调用会报错
			for ;; {
				xc.XC_CallUiThread(func(data int) int {
					timeStyle := logEdit.AddStyleEx("微软雅黑",10, 0, xc.RGB(255, 255, 255), true)
						logEdit.AddTextEx(fmt.Sprintf("%s: ", time.Now().Format("2006-01-02 15:04:05")), timeStyle)
					return 0
				}, 1)
				time.Sleep(500 * time.Microsecond)
			}
		}()
		return 0
	})
	// 3.显示窗口
	win.ShowWindow(xcc.SW_SHOW)
	// 4.运行程序
	a.Run()
	// 5.释放UI库
	a.Exit()
}

Does xcgui also compile for Linux and MacOSX

Hello,

I like what I have seen in your Xcgui github site but need something that also compile across platforms for Linux and Mac OSX as well as Windows.

Additionally, I am looking to see if you have any examples that show a type of Spreadsheet and also maybe embedding 3D graphics in a window frame as well.

Any information on any of this would be greatly appreciated.
Thanks

[提问] tree设置字体及字号没有效果,xcgui3.3.8

a := app.New(true)
w := window.New(0, 0, 430, 300, "", 0, xcc.Window_Style_Default)
// 创建Tree
tree := widget.NewTree(12, 33, 400, 260, w.Handle)
tree.SetFont(font.New(50).Handle)
// 创建数据适配器, 这个是必须的, 存储数据的
tree.CreateAdapter()

// 循环添加数据
for i := 0; i < 5; i++ {
	// 插入项
	index := tree.InsertItemText(fmt.Sprintf("item%d", i), xcc.XC_ID_ROOT, xcc.XC_ID_LAST)
	// 插入2个子项
	tree.InsertItemText("subitem-1", index, xcc.XC_ID_LAST)
	subitemIndex := tree.InsertItemText("subitem-2", index, xcc.XC_ID_LAST)
	// 给子项2插入2个子项
	tree.InsertItemText("subitem-2-1", subitemIndex, xcc.XC_ID_LAST)
	tree.InsertItemText("subitem-2-2", subitemIndex, xcc.XC_ID_LAST)
}
w.ShowWindow(xcc.SW_SHOW)
a.Run()
a.Exit()

[提问] goroutine刷新率问题

感谢🌹🌹🌹
之前用过tview与fyne,都有一个问题:【usb发送与接收帧频很慢】

简单界面主流程插了好几个goroutine,分别用于timer,usb 发送,接收,数据处理以及显示刷新,用channel通信。
我在timer里定义每秒30次,实际每秒只有1、2次,【在tview界面我滑动鼠标时通讯速率貌似就正常了】,但我不是专业软件专业水平有限,没找到怎么在程序内部调整这个刷新率。
刚搜到xcgui,不知是否同样存在同样的现象。下周有空试试。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.