...
 
Commits (7)
    https://gitcode.net/energye/golcl/-/commit/13a687bda6f2815761ce324f80b2a6a253e75206 simples 2023-02-13T19:33:57+08:00 杨红岩 snxamdf@126.com https://gitcode.net/energye/golcl/-/commit/61dfa051d338cac505ae63ed7a3c64cea412a31a //不用energy则要这个初始化 不然报错 2023-07-27T18:42:42+08:00 hakwolf wolfmenst@163.com https://gitcode.net/energye/golcl/-/commit/83f5ab92fc1af24dec77963b3a3bbc61d09a8de9 Merge branch 'main' into dev 2023-07-27T23:12:54+08:00 杨红岩 snxamdf@126.com # Conflicts: # samples/menu/main.go https://gitcode.net/energye/golcl/-/commit/05df28363c46ff01d1f69d6153b2eae3d86b40c4 Merge pull request #1 from hakwolf/dev 2023-07-27T23:13:55+08:00 yanghy 13374948+sxmxta@users.noreply.github.com Dev https://gitcode.net/energye/golcl/-/commit/c0480288aa17e19cd58cc027748d45d554f55b39 Synchronize updates to govcl 2023-08-14T20:12:52+08:00 杨红岩 snxamdf@126.com update lcl * Added: 'TClipboard' adds 'AddFormat', 'SetFormat', 'GetComponent', 'SetComponent' and 'SetComponentAsText' methods. * Added: 'TCanvas' adds 'TryLock' and 'Unlock' methods. https://gitcode.net/energye/golcl/-/commit/391407c59a02b4bfe90a0f98ffff1faa8291d748 Synchronize updates to govcl 2023-08-14T20:17:06+08:00 杨红岩 snxamdf@126.com update lcl * Added: 'TClipboard' adds 'AddFormat', 'SetFormat', 'GetComponent', 'SetComponent' and 'SetComponentAsText' methods. * Added: 'TCanvas' adds 'TryLock' and 'Unlock' methods. https://gitcode.net/energye/golcl/-/commit/c941bad427cd71ca8184d1b12565ca7b830760bf Upgrade: go.mod 2023-08-14T20:39:40+08:00 杨红岩 snxamdf@126.com
......@@ -12,7 +12,7 @@ func main() {
### 修改版本 v1.0.0
> 1. 修改 govcl to golcl
>> github.com/ying32/govcl
>> github.com/energye/golcl
>>
>> to
>>
......
......@@ -5,6 +5,7 @@ go 1.18
require (
github.com/Knetic/govaluate v3.0.0+incompatible
github.com/disintegration/gift v1.2.1
github.com/energye/dylib v0.0.0-20230814115552-32dda0972e9e
github.com/fogleman/gg v1.3.0
github.com/go-ole/go-ole v1.2.6
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
......
此差异已折叠。
此差异已折叠。
......@@ -66,7 +66,10 @@ func ToBitmap(img image.Image) (*lcl.TBitmap, error) {
}
func ToBitmap2(img image.Image, bmp *lcl.TBitmap) error {
if bmp == nil || !bmp.IsValid() {
if bmp == nil {
return ErrBitmapInvalid
}
if !bmp.IsValid() {
return ErrBitmapInvalid
}
switch img.(type) {
......@@ -126,10 +129,12 @@ func toBitmap(width, height int, pix []uint8, bmp *lcl.TBitmap) error {
if len(pix) == 0 {
return ErrPixelDataEmpty
}
if bmp == nil || !bmp.IsValid() {
if bmp == nil {
return ErrBitmapInvalid
}
if !bmp.IsValid() {
return ErrBitmapInvalid
}
bmp.SetSize(int32(width), int32(height))
// 总是32位,不然没办法透明。
bmp.SetPixelFormat(types.Pf32bit)
......
......@@ -200,6 +200,14 @@ func (c *TCanvas) TextWidth(Text string) int32 {
return Canvas_TextWidth(c._instance(), Text)
}
func (c *TCanvas) TryLock() bool {
return Canvas_TryLock(c._instance())
}
func (c *TCanvas) Unlock() {
Canvas_Unlock(c._instance())
}
// Assign
//
// 复制一个对象,如果对象实现了此方法的话。
......
......@@ -142,6 +142,26 @@ func (c *TClipboard) GetFormat(FormatID TClipboardFormat, Stream IStream) bool {
return Clipboard_GetFormat(c._instance(), FormatID, CheckPtr(Stream))
}
func (c *TClipboard) AddFormat(FormatID TClipboardFormat, Stream IStream) bool {
return Clipboard_AddFormat(c._instance(), FormatID, CheckPtr(Stream))
}
func (c *TClipboard) SetFormat(FormatID TClipboardFormat, Stream IStream) bool {
return Clipboard_SetFormat(c._instance(), FormatID, CheckPtr(Stream))
}
func (c *TClipboard) GetComponent(Owner IComponent, Parent IComponent) *TComponent {
return AsComponent(Clipboard_GetComponent(c._instance(), CheckPtr(Owner), CheckPtr(Parent)))
}
func (c *TClipboard) SetComponent(Component IComponent) bool {
return Clipboard_SetComponent(c._instance(), CheckPtr(Component))
}
func (c *TClipboard) SetComponentAsText(Component IComponent) bool {
return Clipboard_SetComponentAsText(c._instance(), CheckPtr(Component))
}
// Assign
//
// 复制一个对象,如果对象实现了此方法的话。
......
......@@ -9,6 +9,8 @@
package colors
// Lazarus中的颜色表,Lazarus中的TColor与一般HTML的RGB有点不一样,反过来的以BGR表示.
// 原Delphi中的定义
const (
ClClSysNone = 0x1FFFFFFF
ClSysDefault = 0x20000000
......@@ -170,6 +172,133 @@ const (
ClNull = 0x00000000
)
// Lazarus中的定义
const (
//CLR_NONE = 0xFFFFFFFF
//CLR_DEFAULT = 0xFF000000
//CLR_INVALID = 0xFFFFFFFF
cOLOR_SCROLLBAR = 0
cOLOR_BACKGROUND = 1
cOLOR_ACTIVECAPTION = 2
cOLOR_INACTIVECAPTION = 3
cOLOR_MENU = 4
cOLOR_WINDOW = 5
cOLOR_WINDOWFRAME = 6
cOLOR_MENUTEXT = 7
cOLOR_WINDOWTEXT = 8
cOLOR_CAPTIONTEXT = 9
cOLOR_ACTIVEBORDER = 10
cOLOR_INACTIVEBORDER = 11
cOLOR_APPWORKSPACE = 12
cOLOR_HIGHLIGHT = 13
cOLOR_HIGHLIGHTTEXT = 14
cOLOR_BTNFACE = 15
cOLOR_BTNSHADOW = 16
cOLOR_GRAYTEXT = 17
cOLOR_BTNTEXT = 18
cOLOR_INACTIVECAPTIONTEXT = 19
cOLOR_BTNHIGHLIGHT = 20
cOLOR_3DDKSHADOW = 21
cOLOR_3DLIGHT = 22
cOLOR_INFOTEXT = 23
cOLOR_INFOBK = 24
// PBD: 25 is unassigned in all the docs I can find
// if someone finds what this is supposed to be then fill it in
// note defaults below, and cl[ColorConst] in graphics
cOLOR_HOTLIGHT = 26
cOLOR_GRADIENTACTIVECAPTION = 27
cOLOR_GRADIENTINACTIVECAPTION = 28
cOLOR_MENUHILIGHT = 29
cOLOR_MENUBAR = 30
cOLOR_FORM = 31
cOLOR_ENDCOLORS = cOLOR_FORM
cOLOR_DESKTOP = cOLOR_BACKGROUND
cOLOR_3DFACE = cOLOR_BTNFACE
cOLOR_3DSHADOW = cOLOR_BTNSHADOW
cOLOR_3DHIGHLIGHT = cOLOR_BTNHIGHLIGHT
cOLOR_3DHILIGHT = cOLOR_BTNHIGHLIGHT
cOLOR_BTNHILIGHT = cOLOR_BTNHIGHLIGHT
mAX_SYS_COLORS = cOLOR_ENDCOLORS
sYS_COLOR_BASE = 0x80000000
// The following colors match the predefined Delphi Colors
// standard colors
//ClBlack = 0x000000
//ClMaroon = 0x000080
//ClGreen = 0x008000
//ClOlive = 0x008080
//ClNavy = 0x800000
//ClPurple = 0x800080
//ClTeal = 0x808000
//ClGray = 0x808080
//ClSilver = 0xC0C0C0
//ClRed = 0x0000FF
//ClLime = 0x00FF00
//ClYellow = 0x00FFFF
//ClBlue = 0xFF0000
//ClFuchsia = 0xFF00FF
//ClAqua = 0xFFFF00
//ClLtGray = 0xC0C0C0 // ClSilver alias
//ClDkGray = 0x808080 // ClGray alias
//ClWhite = 0xFFFFFF
// extended colors
//ClMoneyGreen = 0xC0DCC0
//ClSkyBlue = 0xF0CAA6
//ClCream = 0xF0FBFF
//ClMedGray = 0xA4A0A0
// special colors
ClNone = 0x1FFFFFFF
ClDefault = 0x20000000
// system colors
ClScrollBar = sYS_COLOR_BASE | cOLOR_SCROLLBAR
ClBackground = sYS_COLOR_BASE | cOLOR_BACKGROUND
ClActiveCaption = sYS_COLOR_BASE | cOLOR_ACTIVECAPTION
ClInactiveCaption = sYS_COLOR_BASE | cOLOR_INACTIVECAPTION
ClMenu = sYS_COLOR_BASE | cOLOR_MENU
ClWindow = sYS_COLOR_BASE | cOLOR_WINDOW
ClWindowFrame = sYS_COLOR_BASE | cOLOR_WINDOWFRAME
ClMenuText = sYS_COLOR_BASE | cOLOR_MENUTEXT
ClWindowText = sYS_COLOR_BASE | cOLOR_WINDOWTEXT
ClCaptionText = sYS_COLOR_BASE | cOLOR_CAPTIONTEXT
ClActiveBorder = sYS_COLOR_BASE | cOLOR_ACTIVEBORDER
ClInactiveBorder = sYS_COLOR_BASE | cOLOR_INACTIVEBORDER
ClAppWorkspace = sYS_COLOR_BASE | cOLOR_APPWORKSPACE
ClHighlight = sYS_COLOR_BASE | cOLOR_HIGHLIGHT
ClHighlightText = sYS_COLOR_BASE | cOLOR_HIGHLIGHTTEXT
//ClBtnFace = sYS_COLOR_BASE | cOLOR_BTNFACE
ClBtnShadow = sYS_COLOR_BASE | cOLOR_BTNSHADOW
ClGrayText = sYS_COLOR_BASE | cOLOR_GRAYTEXT
ClBtnText = sYS_COLOR_BASE | cOLOR_BTNTEXT
ClInactiveCaptionText = sYS_COLOR_BASE | cOLOR_INACTIVECAPTIONTEXT
ClBtnHighlight = sYS_COLOR_BASE | cOLOR_BTNHIGHLIGHT
Cl3DDkShadow = sYS_COLOR_BASE | cOLOR_3DDKSHADOW
Cl3DLight = sYS_COLOR_BASE | cOLOR_3DLIGHT
ClInfoText = sYS_COLOR_BASE | cOLOR_INFOTEXT
ClInfoBk = sYS_COLOR_BASE | cOLOR_INFOBK
ClHotLight = sYS_COLOR_BASE | cOLOR_HOTLIGHT
ClGradientActiveCaption = sYS_COLOR_BASE | cOLOR_GRADIENTACTIVECAPTION
ClGradientInactiveCaption = sYS_COLOR_BASE | cOLOR_GRADIENTINACTIVECAPTION
ClMenuHighlight = sYS_COLOR_BASE | cOLOR_MENUHILIGHT
ClMenuBar = sYS_COLOR_BASE | cOLOR_MENUBAR
ClForm = sYS_COLOR_BASE | cOLOR_FORM
// synonyms: do not show them in color lists
ClColorDesktop = sYS_COLOR_BASE | cOLOR_DESKTOP
Cl3DFace = sYS_COLOR_BASE | cOLOR_3DFACE
Cl3DShadow = sYS_COLOR_BASE | cOLOR_3DSHADOW
Cl3DHiLight = sYS_COLOR_BASE | cOLOR_3DHIGHLIGHT
ClBtnHiLight = sYS_COLOR_BASE | cOLOR_BTNHILIGHT
ClFirstSpecialColor = ClBtnHiLight
ClMask = ClWhite
ClDontMask = ClBlack
)
// RGB
func RGB(r, g, b byte) uint32 {
return uint32(r) | (uint32(g) << 8) | (uint32(b) << 16)
......
......@@ -70,6 +70,7 @@ const (
PoWorkAreaCenter // center form on working area (depends on DefaultMonitor)
)
// 相关常量见 vcl/types/cussors.go
// TCursor = -32768..32767;
type TCursor int16
......
......@@ -167,25 +167,25 @@ const (
VkLaunchApp1 = 0xB6 // 182
VkLaunchApp2 = 0xB7 // 183
VkSemicolon = 0xBA // 186
VkEqual = 0xBB // 187
VkComma = 0xBC // 188
VkMinus = 0xBD // 189
VkPeriod = 0xBE // 190
VkSlash = 0xBF // 191
VkTilde = 0xC0 // 192
VkLeftBracket = 0xDB // 219
VkBackslash = 0xDC // 220
VkRightBracket = 0xDD // 221
VkQuote = 0xDE // 222
VkPara = 0xDF // 223
VkSemicolon = 0xBA // 186 VK_OEM_1
VkEqual = 0xBB // 187 VK_OEM_PLUS
VkComma = 0xBC // 188 VK_OEM_COMMA
VkMinus = 0xBD // 189 VK_OEM_MINUS
VkPeriod = 0xBE // 190 VK_OEM_PERIOD
VkSlash = 0xBF // 191 VK_OEM_2
VkTilde = 0xC0 // 192 VK_OEM_3
VkLeftBracket = 0xDB // 219 VK_OEM_4
VkBackslash = 0xDC // 220 VK_OEM_5
VkRightBracket = 0xDD // 221 VK_OEM_6
VkQuote = 0xDE // 222 VK_OEM_7
VkPara = 0xDF // 223 VK_OEM_8
VkOem102 = 0xE2 // 226
VkOem102 = 0xE2 // 226 VK_OEM_102
VkIcoHelp = 0xE3 // 227
VkIco00 = 0xE4 // 228
VkProcessKey = 0xE5 // 229
VkIcoClear = 0xE6 // 230
VkPacket = 0xE7 // 231
VkPacket = 0xE7 // 231 VK_PROCESSKEY
VkAttn = 0xF6 // 246
VkCrsel = 0xF7 // 247
VkExsel = 0xF8 // 248
......
......@@ -89,6 +89,10 @@ type SIZE_T = uintptr
type DWORD_PTR = uintptr
type ACCESS_MASK = DWORD
type REGSAM = ACCESS_MASK
// TSet Pascal集合类型 set of xxx
type TSet uint32
......
......@@ -14,6 +14,8 @@ package win
import (
"syscall"
"unsafe"
. "github.com/energye/golcl/lcl/types"
)
var (
......@@ -23,6 +25,8 @@ var (
_OpenProcessToken = advapi32dll.NewProc("OpenProcessToken")
_GetTokenInformation = advapi32dll.NewProc("GetTokenInformation")
_RegOpenKeyEx = advapi32dll.NewProc("RegOpenKeyExW")
)
// OpenProcessToken
......@@ -37,3 +41,9 @@ func GetTokenInformation(TokenHandle uintptr, TokenInformationClass TTokenInform
r, _, _ := _GetTokenInformation.Call(TokenHandle, uintptr(TokenInformationClass), TokenInformation, uintptr(TokenInformationLength), uintptr(unsafe.Pointer(ReturnLength)))
return r != 0
}
// RegOpenKeyEx
func RegOpenKeyEx(hKey HKEY, lpSubKey string, ulOptions DWORD, samDesired REGSAM, phkResult *HKEY) int32 {
r, _, _ := _RegOpenKeyEx.Call(uintptr(hKey), CStr(lpSubKey), uintptr(ulOptions), uintptr(samDesired), uintptr(unsafe.Pointer(phkResult)))
return int32(r)
}
......@@ -510,10 +510,11 @@ const (
SWP_DEFERERASE = 0x2000
SWP_ASYNCWINDOWPOS = 0x4000
HWND_TOP = 0
HWND_BOTTOM = 1
HWND_TOPMOST = ^(-1) // -1
HWND_NOTOPMOST = ^(-2) // -2
HWND_TOP = 0
HWND_BOTTOM = 1
// 见const_386或者const_amd64
//HWND_TOPMOST = ^(0) // -1
//HWND_NOTOPMOST = ^(1) // -2
)
/* Translated from WINGDI.H */
......@@ -631,10 +632,6 @@ const (
CSIDL_FLAG_MASK = 0xFF00 // mask for all possible flag values
)
const (
INVALID_HANDLE_VALUE = ^(-1)
)
/* Init/Uninit */
const (
......
package win
const (
// SetWindowPos Flags
HWND_TOPMOST uintptr = 0xffffffff // -1
HWND_NOTOPMOST uintptr = 0xfffffffe // -2
)
const (
INVALID_HANDLE_VALUE uintptr = 0xffffffff // -1
)
//----------------------------------------
//
// Copyright © ying32. All Rights Reserved.
//
// Licensed under Apache License 2.0
//
//----------------------------------------
package win
const (
// SetWindowPos Flags
HWND_TOPMOST uintptr = 0xffffffffffffffff // -1
HWND_NOTOPMOST uintptr = 0xfffffffffffffffe // -2
)
const (
INVALID_HANDLE_VALUE uintptr = 0xffffffffffffffff // -1
)
......@@ -76,7 +76,7 @@ func SHGetPathFromIDList(pidl *TItemIDList) (bool, string) {
return r != 0, GoStr(szPath)
}
func SHGetFileInfo(pszPath string, dwFileAttributes uint32, psfi *TSHFileInfo, uFlags uint32) DWORD_PTR {
r, _, _ := _SHGetFileInfo.Call(CStr(pszPath), uintptr(dwFileAttributes), uintptr(unsafe.Pointer(psfi)), uintptr(uFlags))
func SHGetFileInfo(pszPath string, dwFileAttributes uint32, psfi *TSHFileInfo, cbFileInfo, uFlags uint32) DWORD_PTR {
r, _, _ := _SHGetFileInfo.Call(CStr(pszPath), uintptr(dwFileAttributes), uintptr(unsafe.Pointer(psfi)), uintptr(cbFileInfo), uintptr(uFlags))
return DWORD_PTR(r)
}
package bass
import (
"math"
"runtime"
"unsafe"
"github.com/energye/dylib"
"github.com/energye/golcl/lcl/types"
)
var (
libbass = dylib.NewLazyDLL(dylibName())
_BASS_GetVersion = libbass.NewProc("BASS_GetVersion")
_BASS_Init = libbass.NewProc("BASS_Init")
_BASS_Free = libbass.NewProc("BASS_Free")
_BASS_StreamCreateFile = libbass.NewProc("BASS_StreamCreateFile")
_BASS_StreamFree = libbass.NewProc("BASS_StreamFree")
_BASS_ChannelPlay = libbass.NewProc("BASS_ChannelPlay")
_BASS_ChannelStop = libbass.NewProc("BASS_ChannelStop")
_BASS_ChannelPause = libbass.NewProc("BASS_ChannelPause")
// 这个因为返回的是double,暂时没找到可解决的办法,只能自己伪造一个了,伪造的函数是猜测的
// 因为不知道怎么才好吧
_BASS_ChannelBytes2Seconds = libbass.NewProc("BASS_ChannelBytes2Seconds")
_BASS_ChannelGetLength = libbass.NewProc("BASS_ChannelGetLength")
_BASS_ChannelGetPosition = libbass.NewProc("BASS_ChannelGetPosition")
_BASS_ChannelSetAttribute = libbass.NewProc("BASS_ChannelSetAttribute")
_BASS_ChannelGetAttribute = libbass.NewProc("BASS_ChannelGetAttribute")
_BASS_ErrorGetCode = libbass.NewProc("BASS_ErrorGetCode")
_BASS_ChannelSetPosition = libbass.NewProc("BASS_ChannelSetPosition")
_BASS_ChannelSeconds2Bytes = libbass.NewProc("BASS_ChannelSeconds2Bytes")
)
const (
BASSVERSION = 0x204 // API version
BASSVERSIONTEXT = "2.4"
)
func dylibName() string {
if runtime.GOOS == "windows" {
return "bass.dll"
} else if runtime.GOOS == "linux" {
return "libbass.so"
} else if runtime.GOOS == "darwin" {
return "libbass.dylib"
}
return ""
}
type HSTREAM uint32
func cbool(b bool) uintptr {
if b {
return 1
}
return 0
}
func BASS_GetVersion() uint32 {
r, _, _ := _BASS_GetVersion.Call()
return uint32(r)
}
func BASS_Init(device int, freq, flags uint32, win types.HWND, dsguid uintptr) bool {
r, _, _ := _BASS_Init.Call(uintptr(device), uintptr(freq), uintptr(flags), uintptr(win), uintptr(dsguid))
return r != 0
}
func BASS_Free() bool {
r, _, _ := _BASS_Free.Call()
return r != 0
}
func BASS_StreamFree(handle HSTREAM) bool {
r, _, _ := _BASS_StreamFree.Call(uintptr(handle))
return r != 0
}
func BASS_ChannelPlay(handle HSTREAM, restart bool) bool {
r, _, _ := _BASS_ChannelPlay.Call(uintptr(handle), cbool(restart))
return r != 0
}
func BASS_ChannelStop(handle HSTREAM) bool {
r, _, _ := _BASS_ChannelStop.Call(uintptr(handle))
return r != 0
}
func BASS_ChannelPause(handle HSTREAM) bool {
r, _, _ := _BASS_ChannelPause.Call(uintptr(handle))
return r != 0
}
func BASS_ChannelGetLength(handle HSTREAM, mode uint32) uint64 {
r1, r2, _ := _BASS_ChannelGetLength.Call(uintptr(handle), uintptr(mode))
return ToUInt64(r1, r2)
}
func BASS_ChannelGetPosition(handle HSTREAM, mode uint32) uint64 {
r1, r2, _ := _BASS_ChannelGetPosition.Call(uintptr(handle), uintptr(mode))
return ToUInt64(r1, r2)
}
func BASS_ChannelSetAttribute(handle HSTREAM, attrib uint32, value float32) bool {
r, _, _ := _BASS_ChannelSetAttribute.Call(uintptr(handle), uintptr(attrib), uintptr(math.Float32bits(value)))
return r != 0
}
func BASS_ChannelGetAttribute(handle HSTREAM, attrib uint32, value *float32) bool {
r, _, _ := _BASS_ChannelGetAttribute.Call(uintptr(handle), uintptr(attrib), uintptr(unsafe.Pointer(value)))
return r != 0
}
func BASS_ErrorGetCode() int {
r, _, _ := _BASS_ErrorGetCode.Call()
return int(r)
}
// 伪造的,经过简单的测试出一个值
//func BASS_ChannelBytes2Seconds(handle HSTREAM, pos uint64) float64 {
// return float64(pos) / 176400.0
//}
//func BASS_ChannelSeconds2Bytes(handle HSTREAM, pos float64) uint64 {
// return uint64(pos * 176400)
//}
package bass
import (
"math"
"github.com/energye/dylib/floatpatch"
)
func ToUInt64(r1, r2 uintptr) uint64 {
ret := uint64(r2)
ret = uint64(ret<<32) + uint64(r1)
return ret
}
func UInt64To(val uint64) (uintptr, uintptr) {
return uintptr(uint32(val)), uintptr(uint32(val >> 32))
}
func BASS_StreamCreateFile(mem bool, file string, offset, length uint64, flags uint32) HSTREAM {
offset1, offset2 := UInt64To(offset)
length1, length2 := UInt64To(length)
r, _, _ := _BASS_StreamCreateFile.Call(cbool(mem), cstr(file), offset1, offset2, length1, length2, uintptr(flags))
return HSTREAM(r)
}
func BASS_ChannelSetPosition(handle HSTREAM, pos uint64, mode uint32) bool {
pos1, pos2 := UInt64To(pos)
r, _, _ := _BASS_ChannelSetPosition.Call(uintptr(handle), pos1, pos2, uintptr(mode))
return r != 0
}
func BASS_ChannelBytes2Seconds(handle HSTREAM, pos uint64) float64 {
pos1, pos2 := UInt64To(pos)
_BASS_ChannelBytes2Seconds.Call(uintptr(handle), pos1, pos2)
return floatpatch.Getfloat64()
}
func BASS_ChannelSeconds2Bytes(handle HSTREAM, pos float64) uint64 {
pos1, pos2 := UInt64To(math.Float64bits(pos))
r1, r2, _ := _BASS_ChannelSeconds2Bytes.Call(uintptr(handle), pos1, pos2)
return ToUInt64(r1, r2)
}
package bass
import (
"math"
"github.com/energye/dylib/floatpatch"
)
func ToUInt64(r1, r2 uintptr) uint64 {
return uint64(r1)
}
//func ToUInt64(r1, r2 uintptr) uint64 {
// ret := uint64(r2)
// ret = uint64(ret<<32) + uint64(r1)
// return ret
//}
//func UInt64To(val uint64) (uintptr, uintptr) {
// return uintptr(val), 0
//}
func BASS_StreamCreateFile(mem bool, file string, offset, length uint64, flags uint32) HSTREAM {
r, _, _ := _BASS_StreamCreateFile.Call(cbool(mem), cstr(file), uintptr(offset), uintptr(length), uintptr(flags))
return HSTREAM(r)
}
func BASS_ChannelSetPosition(handle HSTREAM, pos uint64, mode uint32) bool {
r, _, _ := _BASS_ChannelSetPosition.Call(uintptr(handle), uintptr(pos), uintptr(mode))
return r != 0
}
func BASS_ChannelBytes2Seconds(handle HSTREAM, pos uint64) float64 {
_BASS_ChannelBytes2Seconds.Call(uintptr(handle), uintptr(pos))
return floatpatch.Getfloat64()
}
func BASS_ChannelSeconds2Bytes(handle HSTREAM, pos float64) uint64 {
r, _, _ := _BASS_ChannelSeconds2Bytes.Call(uintptr(handle), uintptr(math.Float64bits(pos)))
return uint64(r)
}
// 作者: ying32
// bass包初用于govcl例程 mp3Player
// bass二进制下载:http://www.un4seen.com/
// windows: http://www.un4seen.com/download.php?bass24
// macOS: http://www.un4seen.com/download.php?bass24-osx
// linux: http://www.un4seen.com/download.php?bass24-linux
package bass
import (
"errors"
"fmt"
)
type TPlayState int
const (
PsUnkown = iota + 0
PsPlaying
PsStoped
PsPaused
)
type TBass struct {
hstream HSTREAM
State TPlayState
}
// 新建播放类
func NewBass() *TBass {
if BASS_GetVersion()>>16 != BASSVERSION {
panic("版本与头文件不符合!")
}
bass := new(TBass)
BASS_Init(-1, 44100, 0, 0, 0)
return bass
}
// 释放库
func BassFree() {
BASS_Free()
}
// 打开一个文件,用作播放的
func (c *TBass) OpenFile(filename string) error {
c.Close()
c.hstream = BASS_StreamCreateFile(false, filename, 0, 0, 0)
return errorFromCode()
}
// 停止并释放一个流
func (c *TBass) Close() error {
c.Stop()
if c.hstream != 0 {
BASS_StreamFree(c.hstream)
c.hstream = 0
}
return errorFromCode()
}
// 播放
func (c *TBass) Play(loop bool) error {
if c.hstream != 0 {
if c.State == PsPlaying {
return nil
}
if BASS_ChannelPlay(c.hstream, loop) {
c.State = PsPlaying
}
}
return errorFromCode()
}
// 停止播放
func (c *TBass) Stop() error {
if c.hstream == 0 || c.State == PsStoped {
return nil
}
if BASS_ChannelStop(c.hstream) {
c.State = PsStoped
}
return errorFromCode()
}
// 暂停播放
func (c *TBass) Pause() error {
if c.hstream == 0 || c.State != PsPlaying {
return nil
}
if BASS_ChannelPause(c.hstream) {
c.State = PsPaused
}
return errorFromCode()
}
// 文件是否效
func (c *TBass) IsValid() bool {
return c.hstream != 0
}
// 在取媒体文件长度
func (c *TBass) GetLength() (uint, error) {
return uint(BASS_ChannelBytes2Seconds(c.hstream, BASS_ChannelGetLength(c.hstream, BASS_POS_BYTE)) * 1000),
errorFromCode()
}
// 获取媒体当前播放的位置
func (c *TBass) GetPosition() (uint, error) {
return uint(BASS_ChannelBytes2Seconds(c.hstream, BASS_ChannelGetPosition(c.hstream, BASS_POS_BYTE)) * 1000),
errorFromCode()
}
// 设置媒体播放位置
func (c *TBass) SetPosition(val uint) error {
BASS_ChannelSetPosition(c.hstream, BASS_ChannelSeconds2Bytes(c.hstream, float64(val)/1000.0), BASS_POS_BYTE)
return errorFromCode()
}
// 获取播放音量
func (c *TBass) GetVolume() (int, error) {
var val float32
BASS_ChannelGetAttribute(c.hstream, BASS_ATTRIB_VOL, &val)
return int(val * 100), errorFromCode()
}
// 设置播放音量
func (c *TBass) SetVolume(val int) error {
BASS_ChannelSetAttribute(c.hstream, BASS_ATTRIB_VOL, float32(val)/100.0)
return errorFromCode()
}
func (c *TBass) TimeStrLabel() string {
lPosi, _ := c.GetPosition()
lLen, _ := c.GetLength()
return fmt.Sprintf("%.2d:%.2d/%.2d:%.2d", lPosi/1000/60, lPosi/1000%60, lLen/1000/60, lLen/1000%60)
}
func GetFileLength(fileName string) int {
hstream := BASS_StreamCreateFile(false, fileName, 0, 0, 0)
if hstream > 0 {
defer BASS_StreamFree(hstream)
return int(BASS_ChannelBytes2Seconds(hstream, BASS_ChannelGetLength(hstream, BASS_POS_BYTE)) * 1000)
}
return 0
}
func errorFromCode() error {
switch BASS_ErrorGetCode() {
case BASS_OK:
return nil //errors.New("all is OK")
case BASS_ERROR_MEM:
return errors.New("memory error")
case BASS_ERROR_FILEOPEN:
return errors.New("can't open the file")
case BASS_ERROR_DRIVER:
return errors.New("can't find a free/valid driver")
case BASS_ERROR_BUFLOST:
return errors.New("the sample buffer was lost")
case BASS_ERROR_HANDLE:
return errors.New("invalid handle")
case BASS_ERROR_FORMAT:
return errors.New("unsupported sample format")
case BASS_ERROR_POSITION:
return errors.New("invalid position")
case BASS_ERROR_INIT:
return errors.New("BASS_Init has not been successfully called")
case BASS_ERROR_START:
return errors.New("BASS_Start has not been successfully called")
case BASS_ERROR_SSL:
return errors.New("SSL/HTTPS support isn't available")
case BASS_ERROR_ALREADY:
return errors.New("already initialized/paused/whatever")
case BASS_ERROR_NOCHAN:
return errors.New("can't get a free channel")
case BASS_ERROR_ILLTYPE:
return errors.New("an illegal type was specified")
case BASS_ERROR_ILLPARAM:
return errors.New("an illegal parameter was specified")
case BASS_ERROR_NO3D:
return errors.New("no 3D support")
case BASS_ERROR_NOEAX:
return errors.New("no EAX support")
case BASS_ERROR_DEVICE:
return errors.New("illegal device number")
case BASS_ERROR_NOPLAY:
return errors.New("not playing")
case BASS_ERROR_FREQ:
return errors.New("illegal sample rate")
case BASS_ERROR_NOTFILE:
return errors.New("the stream is not a file stream")
case BASS_ERROR_NOHW:
return errors.New("no hardware voices available")
case BASS_ERROR_EMPTY:
return errors.New("the MOD music has no sequence data")
case BASS_ERROR_NONET:
return errors.New("no internet connection could be opened")
case BASS_ERROR_CREATE:
return errors.New("couldn't create the file")
case BASS_ERROR_NOFX:
return errors.New("effects are not available")
case BASS_ERROR_NOTAVAIL:
return errors.New("requested data is not available")
case BASS_ERROR_DECODE:
return errors.New("the channel is/isn't a \"decoding channel\"")
case BASS_ERROR_DX:
return errors.New("a sufficient DirectX version is not installed")
case BASS_ERROR_TIMEOUT:
return errors.New("connection timedout")
case BASS_ERROR_FILEFORM:
return errors.New("unsupported file format")
case BASS_ERROR_SPEAKER:
return errors.New("unavailable speaker")
case BASS_ERROR_VERSION:
return errors.New("invalid BASS version (used by add-ons)")
case BASS_ERROR_CODEC:
return errors.New("codec is not available/supported")
case BASS_ERROR_ENDED:
return errors.New("the channel/file has ended")
case BASS_ERROR_BUSY:
return errors.New("the device is busy")
case BASS_ERROR_UNKNOWN:
return errors.New("some other mystery problem")
default:
return errors.New("some other mystery problem")
}
}
package bass
const (
// BASS_ChannelGetLength/GetPosition/SetPosition modes
BASS_POS_BYTE = 0 // byte position
BASS_POS_MUSIC_ORDER = 1 // order.row position, MAKELONG(order,row)
BASS_POS_OGG = 3 // OGG bitstream number
BASS_POS_INEXACT = 0x8000000 // flag: allow seeking to inexact position
BASS_POS_DECODE = 0x10000000 // flag: get the decoding (not playing) position
BASS_POS_DECODETO = 0x20000000 // flag: decode to the position instead of seeking
BASS_POS_SCAN = 0x40000000 // flag: scan to the position
// Channel attributes
BASS_ATTRIB_FREQ = 1
BASS_ATTRIB_VOL = 2
// Error codes returned by BASS_ErrorGetCode
BASS_OK = 0 // all is OK
BASS_ERROR_MEM = 1 // memory error
BASS_ERROR_FILEOPEN = 2 // can't open the file
BASS_ERROR_DRIVER = 3 // can't find a free/valid driver
BASS_ERROR_BUFLOST = 4 // the sample buffer was lost
BASS_ERROR_HANDLE = 5 // invalid handle
BASS_ERROR_FORMAT = 6 // unsupported sample format
BASS_ERROR_POSITION = 7 // invalid position
BASS_ERROR_INIT = 8 // BASS_Init has not been successfully called
BASS_ERROR_START = 9 // BASS_Start has not been successfully called
BASS_ERROR_SSL = 10 // SSL/HTTPS support isn't available
BASS_ERROR_ALREADY = 14 // already initialized/paused/whatever
BASS_ERROR_NOCHAN = 18 // can't get a free channel
BASS_ERROR_ILLTYPE = 19 // an illegal type was specified
BASS_ERROR_ILLPARAM = 20 // an illegal parameter was specified
BASS_ERROR_NO3D = 21 // no 3D support
BASS_ERROR_NOEAX = 22 // no EAX support
BASS_ERROR_DEVICE = 23 // illegal device number
BASS_ERROR_NOPLAY = 24 // not playing
BASS_ERROR_FREQ = 25 // illegal sample rate
BASS_ERROR_NOTFILE = 27 // the stream is not a file stream
BASS_ERROR_NOHW = 29 // no hardware voices available
BASS_ERROR_EMPTY = 31 // the MOD music has no sequence data
BASS_ERROR_NONET = 32 // no internet connection could be opened
BASS_ERROR_CREATE = 33 // couldn't create the file
BASS_ERROR_NOFX = 34 // effects are not available
BASS_ERROR_NOTAVAIL = 37 // requested data is not available
BASS_ERROR_DECODE = 38 // the channel is/isn't a "decoding channel"
BASS_ERROR_DX = 39 // a sufficient DirectX version is not installed
BASS_ERROR_TIMEOUT = 40 // connection timedout
BASS_ERROR_FILEFORM = 41 // unsupported file format
BASS_ERROR_SPEAKER = 42 // unavailable speaker
BASS_ERROR_VERSION = 43 // invalid BASS version (used by add-ons)
BASS_ERROR_CODEC = 44 // codec is not available/supported
BASS_ERROR_ENDED = 45 // the channel/file has ended
BASS_ERROR_BUSY = 46 // the device is busy
BASS_ERROR_UNKNOWN = -1 // some other mystery problem
)
//go:build !windows
// +build !windows
package bass
import "unsafe"
func cstr(str string) uintptr {
return uintptr(unsafe.Pointer(&([]byte(str + "\x00")[0])))
}
package bass
import (
"unsafe"
"github.com/energye/golcl/lcl/win"
)
func cstr(str string) uintptr {
return uintptr(unsafe.Pointer(&win.UTF8ToANSI(str)[0]))
//return uintptr(unsafe.Pointer(&([]byte(str + "\x00")[0])))
}
......@@ -7,7 +7,7 @@
//----------------------------------------
// govcl wke,by: ying32
// https://github.com/ying32/ying32
// https://github.com/energye/ying32
package wke
......
......@@ -7,7 +7,7 @@
//----------------------------------------
// govcl wke测试头文件,by: ying32
// https://github.com/ying32/ying32
// https://github.com/energye/ying32
package wke
......
......@@ -5,6 +5,7 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"math"
"os"
"path/filepath"
......@@ -43,6 +44,7 @@ var (
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.CreateForm(&MainFrom)
lcl.Application.Run()
......
......@@ -10,13 +10,13 @@ import (
"github.com/energye/golcl/lcl"
)
//::private::
// ::private::
type TFormListViewDrawFields struct {
}
func (f *TFormListViewDraw) OnFormCreate(sender lcl.IObject) {
// 加载信息
trainData, err := parseFromFile("testtraindata.json")
trainData, err := parseFromFile("E:\\SWT\\gopath\\src\\github.com\\energye\\golcl\\samples\\Windows\\listviewcustomdraw\\testtraindata.json")
if err == nil {
// 设计器设计的ListView
fullResFormListViewInstance(trainData)
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
lcl.Application.CreateForm(&FormListViewDraw)
......
......@@ -4,11 +4,13 @@
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
......@@ -90,7 +90,7 @@ func main() {
edit.SetAlign(types.AlClient)
edit.Font().SetSize(10)
//edit.SetName("editURL")
// https://github.com/ying32
// https://github.com/energye
edit.SetText("https://www.baidu.com")
edit.SetAlignWithMargins(true)
edit.Margins().SetBounds(10, 5, 10, 5)
......
......@@ -4,6 +4,7 @@ import (
"embed"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/samples/action/src"
)
import _ "github.com/energye/golcl/pkgs/winappres"
......@@ -14,6 +15,6 @@ func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
lcl.Application.CreateForm(&mainForm, true)
lcl.Application.CreateForm(&src.MainForm, true)
lcl.Application.Run()
}
package main
package src
import (
"github.com/energye/golcl/lcl"
......@@ -18,7 +18,7 @@ type TMainForm struct {
MainMenu *lcl.TMainMenu
}
var mainForm *TMainForm
var MainForm *TMainForm
func (f *TMainForm) OnFormCreate(sender lcl.IObject) {
......@@ -39,7 +39,7 @@ func (f *TMainForm) OnActExecute(sender lcl.IObject) {
}
func (f *TMainForm) OnActUpdate(sender lcl.IObject) {
lcl.AsAction(sender).SetEnabled(f.Chk.Checked())
//lcl.AsAction(sender).SetEnabled(f.Chk.Checked())
}
func (f *TMainForm) initComponents() {
......@@ -52,31 +52,31 @@ func (f *TMainForm) initComponents() {
f.ActList = lcl.NewActionList(f)
f.ActList.SetImages(f.ImgList)
// 顶部工具条
f.Tlbar = lcl.NewToolBar(f)
f.Tlbar.SetParent(f)
f.Tlbar.SetImages(f.ImgList)
f.Tlbtn = lcl.NewToolButton(f)
f.Tlbtn.SetParent(f.Tlbar)
// 底部状态条
f.Stbar = lcl.NewStatusBar(f)
f.Stbar.SetParent(f)
f.Stbar.SetAutoHint(true)
f.Stbar.SetSimplePanel(true)
//// 顶部工具条
//f.Tlbar = lcl.NewToolBar(f)
//f.Tlbar.SetParent(f)
//f.Tlbar.SetImages(f.ImgList)
//
//f.Tlbtn = lcl.NewToolButton(f)
//f.Tlbtn.SetParent(f.Tlbar)
//
//// 底部状态条
//f.Stbar = lcl.NewStatusBar(f)
//f.Stbar.SetParent(f)
//f.Stbar.SetAutoHint(true)
//f.Stbar.SetSimplePanel(true)
//
f.Btn = lcl.NewButton(f)
f.Btn.SetParent(f)
f.Btn.SetLeft(80)
f.Btn.SetTop(f.Tlbar.Top() + f.Tlbar.Height() + 10)
f.Chk = lcl.NewCheckBox(f)
f.Chk.SetParent(f)
f.Chk.SetCaption("action状态演示")
f.Chk.SetLeft(f.Btn.Left())
f.Chk.SetTop(f.Btn.Top() + f.Btn.Height() + 10)
f.Chk.SetChecked(true)
//f.Btn.SetTop(f.Tlbar.Top() + f.Tlbar.Height() + 10)
//
//f.Chk = lcl.NewCheckBox(f)
//f.Chk.SetParent(f)
//f.Chk.SetCaption("action状态演示")
//f.Chk.SetLeft(f.Btn.Left())
//f.Chk.SetTop(f.Btn.Top() + f.Btn.Height() + 10)
//f.Chk.SetChecked(true)
// action
f.Act = lcl.NewAction(f)
......@@ -84,7 +84,7 @@ func (f *TMainForm) initComponents() {
f.Act.SetImageIndex(0)
f.Act.SetHint("这是一个提示|长提示了")
f.Act.SetOnExecute(f.OnActExecute)
f.Act.SetOnUpdate(f.OnActUpdate)
//f.Act.SetOnUpdate(f.OnActUpdate)
// mainMenu
f.MainMenu = lcl.NewMainMenu(f)
......@@ -98,5 +98,5 @@ func (f *TMainForm) initComponents() {
menu.Add(subMenu)
f.Btn.SetAction(f.Act)
f.Tlbtn.SetAction(f.Act)
//f.Tlbtn.SetAction(f.Act)
}
package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types/colors"
"fmt"
"github.com/energye/golcl/lcl/types"
_ "github.com/energye/golcl/pkgs/winappres"
)
......@@ -24,57 +26,96 @@ var (
)
func main() {
inits.Init(nil, nil)
lcl.DEBUG = true
lcl.RunApp(&mainForm, &form1)
}
// --------------MainForm -----------------
func (f *TMainForm) OnFormCreate(sender lcl.IObject) {
//f.SetCaption("Hello")
f.SetCaption("Hello")
f.EnabledMaximize(false)
//f.SetWidth(600)
//f.SetHeight(600)
//f.ScreenCenter()
//f.BorderIcons().Exclude(types.BiMaximize)
f.SetBorderStyle(types.BsNone)
f.ShowInTaskBar()
//f.Button1 = lcl.NewButton(f)
//f.Button1.SetParent(f)
//f.Button1.SetCaption("窗口1")
//f.Button1.SetLeft(50)
//f.Button1.SetTop(50)
//f.Button1.SetOnClick(f.OnButton1Click)
//f.Button1.Font().SetStyle(types.NewSet(types.FsBold)) //f.Button1.Font().Style().Include(types.FsBold))
////f.Button1.Hide()
////
//de := lcl.NewDirectoryEdit(f)
//de.SetParent(f)
//cbb := lcl.NewComboBox(f)
//cbb.SetParent(f)
//cbb.SetLeft(100)
//cbb.SetTop(100)
////cbb.SetStyle(types.CsOwnerDrawVariable)
//cbb.Items().Add("1111")
//cbb.Items().Add("2222")
//cbb.Items().Add("3333")
//cbb.SetOnDrawItem(func(control lcl.IWinControl, index int32, aRect types.TRect, state types.TOwnerDrawState) {
// switch index {
// case 0:
// cbb.Canvas().Font().SetColor(colors.ClRed)
// case 1:
// cbb.Canvas().Font().SetColor(colors.ClGreen)
// case 2:
// cbb.Canvas().Font().SetColor(colors.ClBlue)
// }
// cbb.Canvas().TextOut(aRect.Left, aRect.Top, cbb.Items().Strings(index))
f.SetWidth(600)
f.SetHeight(600)
f.ScreenCenter()
f.Button1 = lcl.NewButton(f)
f.Button1.SetParent(f)
f.Button1.SetCaption("窗口1")
f.Button1.SetLeft(50)
f.Button1.SetTop(50)
f.Button1.SetOnClick(f.OnButton1Click)
f.Button1.Font().SetStyle(types.NewSet(types.FsBold)) //f.Button1.Font().Style().Include(types.FsBold))
//f.Button1.Hide()
cbb := lcl.NewComboBox(f)
cbb.SetParent(f)
cbb.SetLeft(100)
cbb.SetTop(100)
cbb.SetStyle(types.CsOwnerDrawVariable)
cbb.Items().Add("1111")
cbb.Items().Add("2222")
cbb.Items().Add("3333")
cbb.SetOnDrawItem(func(control lcl.IWinControl, index int32, aRect types.TRect, state types.TOwnerDrawState) {
switch index {
case 0:
cbb.Canvas().Font().SetColor(colors.ClRed)
case 1:
cbb.Canvas().Font().SetColor(colors.ClGreen)
case 2:
cbb.Canvas().Font().SetColor(colors.ClBlue)
}
cbb.Canvas().TextOut(aRect.Left, aRect.Top, cbb.Items().Strings(index))
})
f.SetOnUTF8KeyPress(func(sender lcl.IObject, utf8key *types.TUTF8Char) {
fmt.Println("打印:1111", utf8key.ToString(), utf8key)
utf8key.SetString("这") //每次只一个字符
fmt.Println("打印:2222", utf8key.ToString(), utf8key)
})
//xx := lcl.NewCheckComboBox(f)
//xx.SetParent(f)
//xx.Items().Add("fff")
//xx.Items().Add("bbb")
//xx.Items().Add("ccc")
//xx.SetOnItemChange(func(sender lcl.IObject, index int32) {
// fmt.Println("checked: ", xx.Checked(index))
//})
//x := lcl.NewFloatSpinEdit(f)
//x.SetParent(f)
//x.SetLeft(100)
//x.SetTop(100)
//x.SetMaxValue(10.0)
//x.SetIncrement(0.2)
//x.SetMinValue(0.1)
//x.SetValue(3.0)
//x.SetWidth(100)
//
//f.SetOnUTF8KeyPress(func(sender lcl.IObject, utf8key *types.TUTF8Char) {
// fmt.Println("打印:1111", utf8key.ToString(), utf8key)
// utf8key.SetString("这") //每次只一个字符
// fmt.Println("打印:2222", utf8key.ToString(), utf8key)
//d := lcl.NewDirectoryEdit(f)
//d.SetParent(f)
//d.SetLeft(100)
//d.SetTop(150)
//d.SetWidth(200)
//d.SetDirectory("C:\\xxxxx")
//c := lcl.NewColorButton(f)
//c.SetParent(f)
//c.SetOnColorChanged(func(sender lcl.IObject) {
// fmt.Println(c.ButtonColor())
//})
//pnl := lcl.NewPanel(f)
//pnl.SetParent(f)
//pnl.SetBounds(20, 150, 200, 300)
//pnl.SetOnMouseMove(func(sender lcl.IObject, shift types.TShiftState, x, y int32) {
// // x < 5时显示左右调节指针样式
// if x < 5 {
// pnl.SetCursor(types.CrSizeE)
// // y<5时显示上下调节指针样式
// } else if y < 5 {
// pnl.SetCursor(types.CrSizeN)
// } else {
// pnl.SetCursor(types.CrDefault)
// }
//})
}
......
此差异已折叠。
package main
import (
"fmt"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types/keys"
"github.com/energye/golcl/lcl/types"
)
//::private::
type TForm1Fields struct {
}
func (f *TForm1) OnFormCreate(sender lcl.IObject) {
fmt.Println(Form1.Caption(), f.PixelsPerInch())
// 遍历组件
// 只要owner设置为Form的都可以通过这个方法来遍历。
var i int32
for i = 0; i < f.ComponentCount(); i++ {
comp := f.Components(i)
//fmt.Println(i, "=", comp.Name())
if comp.Is().Memo() {
fmt.Println(i, "=", comp.Name(), ", 继承自TMemo")
mem := lcl.AsMemo(comp)
mem.SetOnKeyUp(f.memoOnKeyup)
}
}
}
func (f *TForm1) memoOnKeyup(sender lcl.IObject, key *types.Char, shift types.TShiftState) {
if shift.In(types.SsCtrl) && *key == /*keys.VkA*/ keys.VkB {
lcl.AsMemo(sender).SelectAll()
}
}
func (f *TForm1) OnActExitExecute(lcl.IObject) {
lcl.Application.Terminate()
}
func (f *TForm1) OnButton2Click(lcl.IObject) {
result := Form2.ShowModal()
if result == types.MrOk {
lcl.ShowMessage("Form2返回了OK")
} else if result == types.MrClose || result == types.MrNone {
lcl.ShowMessage("Form2返回了Close")
} else if result == types.MrCancel {
lcl.ShowMessage("Form2返回了Cancel")
}
}
func (f *TForm1) OnActFileNewExecute(lcl.IObject) {
lcl.ShowMessage("ActFileNew Execute.")
}
func (f *TForm1) OnFormCloseQuery(sender lcl.IObject, canClose *bool) {
fmt.Println("关闭。")
}
func (f *TForm1) OnCheckBox1Click(sender lcl.IObject) {
f.Button1.SetEnabled(f.CheckBox1.Checked())
}
func (f *TForm1) OnButton1Click(sender lcl.IObject) {
//lcl.ShowMessage("Hello!")
jpg := lcl.NewJPEGImage()
defer jpg.Free()
jpg.LoadFromFile("a.jpg")
}
package main
import "github.com/energye/golcl/lcl"
//::private::
type TForm2Fields struct {
}
func (m *TForm2) OnFormCreate(sender lcl.IObject) {
}
// Automatically generated by the res2go, do not edit.
package main
import "github.com/energye/golcl/lcl"
type TForm2 struct {
*lcl.TForm
RadioGroup1 *lcl.TRadioGroup
Button1 *lcl.TButton
Button2 *lcl.TButton
//::private::
TForm2Fields
}
var Form2 *TForm2
// Loaded in bytes.
// lcl.Application.CreateForm(&Form2)
func NewForm2(owner lcl.IComponent) (root *TForm2) {
lcl.CreateResForm(owner, &root)
return
}
var Form2Bytes = []byte("\x54\x50\x46\x30\x0B\x54\x44\x65\x73\x69\x67\x6E\x46\x6F\x72\x6D\x05\x46\x6F\x72\x6D\x32\x04\x4C\x65\x66\x74\x02\x08\x06\x48\x65\x69\x67\x68\x74\x03\xC1\x00\x03\x54\x6F\x70\x02\x08\x05\x57\x69\x64\x74\x68\x03\x2E\x01\x07\x43\x61\x70\x74\x69\x6F\x6E\x06\x05\x46\x6F\x72\x6D\x32\x0C\x43\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74\x03\xC1\x00\x0B\x43\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68\x03\x2E\x01\x05\x43\x6F\x6C\x6F\x72\x07\x09\x63\x6C\x42\x74\x6E\x46\x61\x63\x65\x0A\x46\x6F\x6E\x74\x2E\x43\x6F\x6C\x6F\x72\x07\x0C\x63\x6C\x57\x69\x6E\x64\x6F\x77\x54\x65\x78\x74\x0B\x46\x6F\x6E\x74\x2E\x48\x65\x69\x67\x68\x74\x02\xF3\x09\x46\x6F\x6E\x74\x2E\x4E\x61\x6D\x65\x06\x06\x54\x61\x68\x6F\x6D\x61\x08\x50\x6F\x73\x69\x74\x69\x6F\x6E\x07\x10\x70\x6F\x4D\x61\x69\x6E\x46\x6F\x72\x6D\x43\x65\x6E\x74\x65\x72\x00\x0B\x54\x52\x61\x64\x69\x6F\x47\x72\x6F\x75\x70\x0B\x52\x61\x64\x69\x6F\x47\x72\x6F\x75\x70\x31\x04\x4C\x65\x66\x74\x02\x12\x06\x48\x65\x69\x67\x68\x74\x02\x7E\x03\x54\x6F\x70\x02\x06\x05\x57\x69\x64\x74\x68\x03\x0C\x01\x08\x41\x75\x74\x6F\x46\x69\x6C\x6C\x09\x07\x43\x61\x70\x74\x69\x6F\x6E\x06\x0B\x52\x61\x64\x69\x6F\x47\x72\x6F\x75\x70\x31\x1C\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x4C\x65\x66\x74\x52\x69\x67\x68\x74\x53\x70\x61\x63\x69\x6E\x67\x02\x06\x1D\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x45\x6E\x6C\x61\x72\x67\x65\x48\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x07\x18\x63\x72\x73\x48\x6F\x6D\x6F\x67\x65\x6E\x6F\x75\x73\x43\x68\x69\x6C\x64\x52\x65\x73\x69\x7A\x65\x1B\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x45\x6E\x6C\x61\x72\x67\x65\x56\x65\x72\x74\x69\x63\x61\x6C\x07\x18\x63\x72\x73\x48\x6F\x6D\x6F\x67\x65\x6E\x6F\x75\x73\x43\x68\x69\x6C\x64\x52\x65\x73\x69\x7A\x65\x1C\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x53\x68\x72\x69\x6E\x6B\x48\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x07\x0E\x63\x72\x73\x53\x63\x61\x6C\x65\x43\x68\x69\x6C\x64\x73\x1A\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x53\x68\x72\x69\x6E\x6B\x56\x65\x72\x74\x69\x63\x61\x6C\x07\x0E\x63\x72\x73\x53\x63\x61\x6C\x65\x43\x68\x69\x6C\x64\x73\x12\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x4C\x61\x79\x6F\x75\x74\x07\x1D\x63\x63\x6C\x4C\x65\x66\x74\x54\x6F\x52\x69\x67\x68\x74\x54\x68\x65\x6E\x54\x6F\x70\x54\x6F\x42\x6F\x74\x74\x6F\x6D\x1B\x43\x68\x69\x6C\x64\x53\x69\x7A\x69\x6E\x67\x2E\x43\x6F\x6E\x74\x72\x6F\x6C\x73\x50\x65\x72\x4C\x69\x6E\x65\x02\x01\x0C\x43\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74\x02\x69\x0B\x43\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68\x03\x08\x01\x0D\x49\x74\x65\x6D\x73\x2E\x53\x74\x72\x69\x6E\x67\x73\x01\x06\x01\x31\x06\x01\x32\x06\x01\x33\x06\x01\x34\x06\x01\x35\x00\x08\x54\x61\x62\x4F\x72\x64\x65\x72\x02\x00\x00\x00\x07\x54\x42\x75\x74\x74\x6F\x6E\x07\x42\x75\x74\x74\x6F\x6E\x31\x04\x4C\x65\x66\x74\x02\x72\x06\x48\x65\x69\x67\x68\x74\x02\x19\x03\x54\x6F\x70\x03\x92\x00\x05\x57\x69\x64\x74\x68\x02\x4B\x07\x43\x61\x70\x74\x69\x6F\x6E\x06\x02\x4F\x4B\x0B\x4D\x6F\x64\x61\x6C\x52\x65\x73\x75\x6C\x74\x02\x01\x08\x54\x61\x62\x4F\x72\x64\x65\x72\x02\x01\x00\x00\x07\x54\x42\x75\x74\x74\x6F\x6E\x07\x42\x75\x74\x74\x6F\x6E\x32\x04\x4C\x65\x66\x74\x03\xC3\x00\x06\x48\x65\x69\x67\x68\x74\x02\x19\x03\x54\x6F\x70\x03\x92\x00\x05\x57\x69\x64\x74\x68\x02\x4B\x07\x43\x61\x70\x74\x69\x6F\x6E\x06\x06\x43\x61\x6E\x63\x65\x6C\x0B\x4D\x6F\x64\x61\x6C\x52\x65\x73\x75\x6C\x74\x02\x02\x08\x54\x61\x62\x4F\x72\x64\x65\x72\x02\x02\x00\x00\x00")
// 注册窗口资源
var _ = lcl.RegisterFormResource(Form2, &Form2Bytes)
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
"github.com/energye/golcl/samples/basicResForm/src"
)
// windows : stdcall; 其他平台: cdecl
......@@ -20,9 +18,8 @@ import (
}*/
func main() {
inits.Init(nil, nil)
//lcl.Application.SetRunLoopReceived(runLoopReceivedProc)
lcl.RunApp(&src.Form1, &src.Form2)
lcl.RunApp(&Form1, &Form2)
//lcl.Application.SetScaled(true)
//lcl.Application.Initialize()
......
......@@ -12,6 +12,7 @@ import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
)
import _ "github.com/energye/golcl/pkgs/winappres"
......@@ -20,6 +21,9 @@ type TMainForm struct {
btn *lcl.TButton
btn2 *lcl.TButton
btn3 *lcl.TButton
btn4 *lcl.TButton
btn5 *lcl.TButton
img *lcl.TImage
}
var mainForm *TMainForm
......@@ -52,6 +56,26 @@ func (f *TMainForm) OnFormCreate(sender lcl.IObject) {
f.btn3.SetWidth(120)
f.btn3.SetCaption("SetText")
f.btn3.SetOnClick(f.onBtn3Click)
f.btn4 = lcl.NewButton(f)
f.btn4.SetParent(f)
f.btn4.SetTop(f.btn3.Top() + 50)
f.btn4.SetWidth(120)
f.btn4.SetCaption("SetBmp")
f.btn4.SetOnClick(f.onBtn4Click)
f.btn5 = lcl.NewButton(f)
f.btn5.SetParent(f)
f.btn5.SetTop(f.btn4.Top() + 50)
f.btn5.SetWidth(120)
f.btn5.SetCaption("GetBmp")
f.btn5.SetOnClick(f.onBtn5Click)
f.img = lcl.NewImage(f)
f.img.SetParent(f)
f.img.SetTop(f.btn5.Top() + 30)
f.img.SetWidth(200)
f.img.SetHeight(200)
}
func (f *TMainForm) onBtnClick(sender lcl.IObject) {
......@@ -69,3 +93,44 @@ func (f *TMainForm) onBtn3Click(sender lcl.IObject) {
lcl.Clipboard.SetAsText("afdsdf")
}
func (f *TMainForm) onBtn4Click(sender lcl.IObject) {
//ss := lcl.NewStringList()
//defer ss.Free()
//lcl.Clipboard.SupportedFormats(ss)
//lcl.ShowMessage(ss.Text())
//return
mem := lcl.NewMemoryStream()
defer mem.Free()
// only bmp
mem.LoadFromFile("bg.bmp")
mem.SetPosition(0)
// 注册自定义的格式
//lcl.RegisterClipboardFormat()
// 预定义格式
format := lcl.PredefinedClipboardFormat(types.PcfBitmap)
fmt.Println("format:", format)
if !lcl.Clipboard.SetFormat(format, mem) {
lcl.ShowMessage("设置格式失败")
} else {
lcl.ShowMessage("设置成功")
}
}
func (f *TMainForm) onBtn5Click(sender lcl.IObject) {
if !lcl.Clipboard.HasPictureFormat() {
return
}
bmpFormat := lcl.Clipboard.FindPictureFormatID()
mem := lcl.NewMemoryStream()
defer mem.Free()
if lcl.Clipboard.GetFormat(bmpFormat, mem) {
mem.SetPosition(0)
f.img.Picture().LoadFromStream(mem)
}
}
package main
import (
"github.com/energye/golcl/lcl"
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
......@@ -13,7 +13,7 @@ import (
// 事件公用。啥叫事件公用呢,比如btn, btn2两个控件,处理的大部分是相同的,只是根据不同按钮处理进行不同的选择
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
......@@ -4,8 +4,9 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/lcl/locales/zh_CN"
"github.com/energye/golcl/lcl/rtl"
"github.com/energye/golcl/lcl/rtl/version"
......@@ -20,7 +21,7 @@ var (
)
func main() {
inits.Init(nil, nil)
// 异常捕获
defer func() {
err := recover()
......
......@@ -2,14 +2,16 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"math/rand"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
mainForm := lcl.Application.CreateForm()
......
......@@ -2,13 +2,15 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
mainForm := lcl.Application.CreateForm()
mainForm.SetWidth(700)
......
......@@ -10,8 +10,9 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
_ "github.com/energye/golcl/pkgs/winappres"
......@@ -45,6 +46,7 @@ var (
)
func main() {
inits.Init(nil, nil)
lcl.RunApp(&mainForm)
}
......
......@@ -29,7 +29,7 @@ const jsonData = `{
"avatar_url": "https://avatars1.githubusercontent.com/u/7037165?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/ying32",
"html_url": "https://github.com/ying32",
"html_url": "https://github.com/energye",
"followers_url": "https://api.github.com/users/ying32/followers",
"following_url": "https://api.github.com/users/ying32/following{/other_user}",
"gists_url": "https://api.github.com/users/ying32/gists{/gist_id}",
......
......@@ -2,8 +2,9 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
_ "github.com/energye/golcl/pkgs/winappres"
......@@ -12,6 +13,7 @@ import (
// 简单介绍下Lazarus中控件的布局方式
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
......@@ -8,7 +9,7 @@ import (
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.RunApp(&Form1)
}
......@@ -2,6 +2,7 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"runtime"
"time"
......@@ -38,6 +39,7 @@ var (
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.CreateForm(&MainFrom)
lcl.Application.Run()
......
......@@ -3,14 +3,13 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/pkgs/macapp"
"github.com/energye/golcl/lcl"
"runtime"
"github.com/energye/golcl/lcl/types/colors"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
......@@ -24,7 +23,6 @@ var (
)
func main() {
macapp.MacApp.SetEnergyEnv("dev")
inits.Init(nil, nil)
lcl.RunApp(&mainForm)
}
......
......@@ -3,8 +3,8 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/messages"
_ "github.com/energye/golcl/pkgs/winappres"
......@@ -36,7 +36,6 @@ func (f *TForm1) OnFormCreate(sender lcl.IObject) {
func (f *TForm1) OnFormWndProc(msg *types.TMessage) {
// 这句一定要
f.InheritedWndProc(msg)
fmt.Println("msg", msg)
switch msg.Msg {
case messages.WM_MOUSEMOVE:
......
//go:build darwin
// +build darwin
package main
import _ "github.com/energye/golcl/pkgs/macapp"
此差异已折叠。
// 在这里写你的事件
package main
import (
"fmt"
"github.com/energye/golcl/lcl"
"os"
"path/filepath"
"runtime"
"strings"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/pkgs/bass"
)
//::private::
type TForm1Fields struct {
bassPlayer *bass.TBass
playCtl *TPlayControl
progress *TImageTrackBar
volbar *TImageTrackBar
}
func (f *TForm1) OnFormCreate(sender lcl.IObject) {
f.SetDoubleBuffered(true)
f.EnabledMaximize(false)
//f.SetColor(0x39302c)
f.playCtl = NewPlayControl(f)
f.playCtl.SetParent(f.Panel2)
f.playCtl.SetAlign(types.AlClient)
f.playCtl.OnSelect = f.OnPlayListSelect
f.playCtl.SingerPic = lcl.AsBitmap(f.ImgSinger.Picture().Graphic())
f.progress = NewImageTrackBar(f)
f.progress.SetParent(f)
f.progress.SetImages(f.ImgThumb, f.ImgBk, f.ImgFore)
f.progress.SetLeft(58)
f.progress.SetTop(288)
f.progress.SetWidth(200)
f.progress.SetPosition(0)
f.volbar = NewImageTrackBar(f)
f.volbar.SetParent(f)
f.volbar.SetImages(f.ImgThumb, f.ImgBk, f.ImgFore)
f.volbar.SetLeft(82)
f.volbar.SetTop(318)
f.volbar.SetWidth(80)
f.volbar.SetPosition(60)
f.volbar.OnTrackChange = f.OnVolChange
f.bassPlayer = bass.NewBass()
// 我的测试
switch runtime.GOOS {
case "windows":
f.addFoler("F:\\KuGou")
case "darwin":
usrHome := os.Getenv("HOME")
f.addFoler(usrHome + "/Music/网易云音乐")
f.addFoler(usrHome + "/Music/iTunes/iTunes Media/Music")
case "linux":
f.addFoler("/home/ying32/音乐")
}
}
func (f *TForm1) OnFormDestroy(sender lcl.IObject) {
f.bassPlayer.Close()
bass.BassFree()
}
func (f *TForm1) OnMIAddFileClick(sender lcl.IObject) {
if f.OpenDialog1.Execute() {
f.addFile(f.OpenDialog1.FileName())
}
}
func (f *TForm1) OnMIAddFolderClick(sender lcl.IObject) {
if ok, str := lcl.SelectDirectory2("选择目录", "", false); ok {
f.addFoler(str)
}
}
func (f *TForm1) addFile(fileName string) {
name := filepath.Base(fileName)
ext := strings.ToLower(filepath.Ext(name))
if ext != ".mp3" && ext != ".m4a" {
return
}
name = name[:len(name)-len(ext)]
nameArr := strings.Split(name, "-")
caption := ""
singer := ""
if len(nameArr) >= 2 {
caption = strings.TrimSpace(nameArr[1])
singer = strings.TrimSpace(nameArr[0])
} else {
caption = strings.TrimSpace(name)
singer = caption
}
lenVal := int32(bass.GetFileLength(fileName))
f.playCtl.Add(TPlayListItem{caption, singer, lenVal, "", fileName})
}
func (f *TForm1) addFoler(rootPath string) {
defer func() {
if err := recover(); err != nil {
fmt.Println("addFoler: ", err)
}
}()
_, err := os.Stat(rootPath)
if os.IsNotExist(err) {
return
}
filepath.Walk(rootPath, func(path string, info os.FileInfo, err error) error {
ext := filepath.Ext(info.Name())
if ext == ".mp3" || ext == ".m4a" {
f.addFile(path)
}
return nil
})
}
func (f *TForm1) OnPlayListSelect(sender lcl.IObject, item TPlayListItem) {
f.stopPlay()
f.bassPlayer.Close()
f.bassPlayer.OpenFile(item.FileName)
f.bassPlayer.SetVolume(f.volbar.Position())
f.play()
str := item.Caption + " - " + item.Singer
f.SetCaption(str)
}
func (f *TForm1) OnBtnPlayClick(sender lcl.IObject) {
f.play()
}
func (f *TForm1) OnTimer1Timer(sender lcl.IObject) {
if f.bassPlayer.IsValid() && f.bassPlayer.State == bass.PsPlaying {
f.LblTime.SetCaption(f.bassPlayer.TimeStrLabel())
pos, _ := f.bassPlayer.GetPosition()
mLen, _ := f.bassPlayer.GetLength()
if pos >= mLen {
if f.playCtl.CanNext() {
f.playCtl.Next()
} else {
f.stopPlay()
f.playCtl.Stop()
}
}
f.progress.SetPosition(int(float32(pos) / float32(mLen) * 100))
caption := []rune(f.Caption())
if len(caption) > 0 {
temp := caption
c := temp[:1]
temp = temp[1:]
f.SetCaption(string(temp) + string(c))
}
}
}
func (f *TForm1) OnVolChange(sender lcl.IObject) {
f.bassPlayer.SetVolume(f.volbar.Position())
}
func (f *TForm1) OnBtnPauseClick(sender lcl.IObject) {
f.pause()
}
func (f *TForm1) OnBtnMinClick(sender lcl.IObject) {
lcl.Application.Minimize()
}
func (f *TForm1) OnBtnCloseClick(sender lcl.IObject) {
lcl.Application.Terminate()
}
func (f *TForm1) stopPlay() {
f.Timer1.SetEnabled(false)
f.bassPlayer.Stop()
f.bassPlayer.SetPosition(0)
f.progress.SetPosition(0)
f.BtnPause.Hide()
f.BtnPlay.Show()
f.SetCaption("Mp3Player")
}
func (f *TForm1) play() {
f.bassPlayer.Play(false)
f.BtnPlay.Hide()
f.BtnPause.Show()
f.Timer1.SetEnabled(true)
}
func (f *TForm1) pause() {
f.bassPlayer.Pause()
f.BtnPause.Hide()
f.BtnPlay.Show()
f.Timer1.SetEnabled(false)
}
func (f *TForm1) OnPanel1MouseDown(sender lcl.IObject, button types.TMouseButton, shift types.TShiftState, x, y int32) {
if button == types.MbLeft {
//f.Perform(messages.WM_SYSCOMMAND, message)
}
}
func (f *TForm1) OnBtnPrevClick(sender lcl.IObject) {
f.playCtl.Prev()
}
func (f *TForm1) OnBtnNextClick(sender lcl.IObject) {
f.playCtl.Next()
}
这个例程主要是测试我的dylib包,检测是否有问题。
bass包初用于govcl例程 mp3Player
bass二进制下载:http://www.un4seen.com/
* windows: http://www.un4seen.com/download.php?bass24
* macOS: http://www.un4seen.com/download.php?bass24-osx
* linux: http://www.un4seen.com/download.php?bass24-linux
![s1.jpg](s1.jpg)
\ No newline at end of file
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
lcl.Application.CreateForm(&Form1)
lcl.Application.Run()
}
package main
import (
"fmt"
. "github.com/energye/golcl/lcl"
. "github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
)
type TPlayListItem struct {
Caption string // 歌曲名
Singer string // 歌手
Length int32 // 歌曲长度
Lyric string // 歌词文件
FileName string // 歌曲文件名
}
type TPlayControl struct {
*TDrawGrid
datas []TPlayListItem
focusedColor TColor
playColor TColor
mouseMoveColor TColor
mouseMoveIndex int32
playingIndex int32
// 导出,测试用
SingerPic *TBitmap
OnSelect func(sender IObject, item TPlayListItem)
}
func NewPlayControl(owner IComponent) *TPlayControl {
m := new(TPlayControl)
m.TDrawGrid = NewDrawGrid(owner)
m.TDrawGrid.SetDefaultDrawing(false)
m.TDrawGrid.SetDefaultRowHeight(24)
m.TDrawGrid.SetOptions(NewSet(GoRangeSelect, GoRowSelect))
// 2.0及之后的版本出现此bug了。。。
//m.TDrawGrid.SetRowCount(1)
m.TDrawGrid.SetColCount(4)
m.TDrawGrid.SetFixedRows(0)
m.TDrawGrid.SetFixedCols(0)
m.TDrawGrid.SetGridLineWidth(0)
m.TDrawGrid.SetBorderStyle(BsNone)
m.TDrawGrid.SetScrollBars(SsVertical)
m.TDrawGrid.SetWidth(536)
m.TDrawGrid.SetHeight(397)
//m.TDrawGrid.SetDrawingStyle(GdsThemed)
// 加载时取消第一行永远被选中
m.TDrawGrid.SetSelection(TGridRect{-24, -24, -24, -24})
m.TDrawGrid.SetColWidths(0, 60)
m.TDrawGrid.SetColWidths(1, 215)
m.TDrawGrid.SetColWidths(2, 100)
m.TDrawGrid.SetColWidths(3, 80)
//m.TDrawGrid.SetColor(0x39302c) //0x00EDEEF9)
m.TDrawGrid.SetDoubleBuffered(true)
m.focusedColor = colors.ClMoneyGreen //0x20302c //0x00C8CBEB
m.playColor = m.focusedColor + 12
m.mouseMoveColor = m.focusedColor - 12
m.mouseMoveIndex = -1
m.playingIndex = -1
m.TDrawGrid.SetOnDblClick(m.onDblClick)
m.TDrawGrid.SetOnMouseMove(m.onMouseMove)
//m.TDrawGrid.SetOnMouseDown(m.onMouseDown)
m.TDrawGrid.SetOnDrawCell(m.onDrawCell)
//m.TDrawGrid.SetOnMouseEnter(m.onMouseEnter)
m.TDrawGrid.SetOnMouseLeave(m.onMouseLeave)
return m
}
func (p *TPlayControl) Add(item TPlayListItem) int32 {
p.datas = append(p.datas, item)
p.SetRowCount(int32(len(p.datas)))
return int32(len(p.datas)) - 1
}
func (p *TPlayControl) CanNext() bool {
return int(p.playingIndex) < len(p.datas)-1
}
func (p *TPlayControl) Next() {
if p.CanNext() {
p.playingIndex++
p.SetRow(p.playingIndex)
p.Invalidate()
if p.OnSelect != nil {
p.OnSelect(p, p.datas[int(p.playingIndex)])
}
}
}
func (p *TPlayControl) CanPrev() bool {
return int(p.playingIndex) > 0
}
func (p *TPlayControl) Prev() {
if p.CanPrev() {
p.playingIndex--
p.SetRow(p.playingIndex)
p.Invalidate()
if p.OnSelect != nil {
p.OnSelect(p, p.datas[int(p.playingIndex)])
}
}
}
func (p *TPlayControl) Stop() {
p.playingIndex = -1
p.Invalidate()
}
func (p *TPlayControl) onDrawCell(sender IObject, aCol, aRow int32, rect TRect, state TGridDrawState) {
if len(p.datas) > 0 {
canvas := p.Canvas()
if aRow < int32(len(p.datas)) {
drawFlags := NewSet(TfVerticalCenter, TfSingleLine, TfEndEllipsis)
item := p.datas[int(aRow)]
if p.mouseMoveIndex == aRow && p.playingIndex != aRow && !state.In(GdFocused) && !state.In(GdSelected) {
canvas.Brush().SetColor(p.focusedColor - 12)
} else if state.In(GdFocused) || state.In(GdSelected) {
canvas.Brush().SetColor(p.focusedColor)
} else {
canvas.Brush().SetColor(p.Color())
}
if p.playingIndex == aRow {
canvas.Brush().SetColor(p.focusedColor + 12)
p.SetRowHeights(aRow, 50)
if p.RowHeights(aRow) < 50 {
p.ScrollBy(0, aRow+2)
}
} else {
p.SetRowHeights(aRow, 24)
}
canvas.FillRect(rect)
r := p.CellRect(aCol, aRow)
switch aCol {
case 0:
if aRow == p.playingIndex {
if !p.SingerPic.Empty() {
r.Left += 1
r.Top += +1
r.Bottom -= -1
canvas.StretchDraw(r, p.SingerPic)
}
} else {
r.Inflate(-10, 0)
s := fmt.Sprintf("%d.", aRow+1)
canvas.TextRect2(&r, s, drawFlags.Include(TfRight))
}
case 1:
if aRow == p.playingIndex {
r.Inflate(-10, 0)
canvas.Font().SetSize(11)
canvas.Font().SetStyle(NewSet(FsBold))
canvas.TextRect2(&r, item.Caption, drawFlags)
} else {
r.Inflate(-5, 0)
canvas.TextRect2(&r, item.Caption, drawFlags)
}
canvas.Font().SetSize(8)
canvas.Font().SetStyle(0)
case 2:
r.Inflate(-5, 0)
canvas.TextRect2(&r, item.Singer, drawFlags)
case 3:
r.Inflate(-5, 0)
canvas.TextRect2(&r, p.mediaLengthToTimeStr(item.Length), drawFlags.Include(TfRight))
}
}
} else {
p.Canvas().Brush().SetColor(p.Color())
p.Canvas().FillRect(rect)
}
}
func (p *TPlayControl) onMouseMove(sender IObject, shift TShiftState, x, y int32) {
if !p.Enabled() {
return
}
var col, row int32
p.MouseToCell(x, y, &col, &row)
p.mouseMoveIndex = row
if p.mouseMoveIndex == -1 {
return
}
p.Invalidate()
}
func (p *TPlayControl) onMouseDown(sender IObject, button TMouseButton, shift TShiftState, x, y int32) {
}
func (p *TPlayControl) onDblClick(sender IObject) {
if !p.Enabled() {
return
}
row := p.Row()
if row == -1 {
return
}
p.playingIndex = row
p.Invalidate()
if p.OnSelect != nil {
p.OnSelect(p, p.datas[row])
}
}
func (p *TPlayControl) onMouseEnter(sender IObject) {
}
func (p *TPlayControl) onMouseLeave(sender IObject) {
if !p.Enabled() {
return
}
p.mouseMoveIndex = -1
p.Invalidate()
}
func (p *TPlayControl) mediaLengthToTimeStr(alen int32) string {
return fmt.Sprintf("%.2d:%.2d", int(float32(alen)/1000.0)/60, int(float32(alen)/1000.0)%60)
}
package main
import (
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
)
//
type TImageTrackBar struct {
*lcl.TPanel
thumb *lcl.TImage
background *lcl.TImage
fore *lcl.TImage
//max int
//min int
mouseDown bool
position float32 // 最大100,百分比
OnTrackChange lcl.TNotifyEvent
}
func NewImageTrackBar(owner lcl.IComponent) *TImageTrackBar {
t := new(TImageTrackBar)
t.TPanel = lcl.NewPanel(owner)
t.TPanel.SetBevelOuter(types.BvNone)
t.TPanel.SetHeight(8)
t.TPanel.SetParentColor(true)
t.TPanel.SetDoubleBuffered(true)
t.background = lcl.NewImage(owner)
t.fore = lcl.NewImage(owner)
t.thumb = lcl.NewImage(owner)
t.background.SetParent(t.TPanel)
t.fore.SetParent(t.TPanel)
t.thumb.SetParent(t.TPanel)
t.background.SetAlign(types.AlClient)
t.background.SetStretch(true)
t.fore.SetWidth(100)
t.fore.SetStretch(true)
//t.thumb.SetAutoSize(true)
t.thumb.SetCursor(types.CrHandPoint)
//fmt.Println(t.thumb.)
t.thumb.SetOnMouseDown(t.onMouseDown)
t.thumb.SetOnMouseUp(t.onMouseUp)
t.thumb.SetOnMouseMove(t.onMouseMove)
return t
}
func (t *TImageTrackBar) SetImages(thumb, background, fore *lcl.TImage) {
t.thumb.Picture().Assign(thumb.Picture())
t.background.Picture().Assign(background.Picture())
t.fore.Picture().Assign(fore.Picture())
t.thumb.SetWidth(thumb.Picture().Width())
t.thumb.SetHeight(thumb.Picture().Height())
}
func (t *TImageTrackBar) Free() {
t.thumb.Free()
t.background.Free()
t.fore.Free()
t.TPanel.Free()
}
func (t *TImageTrackBar) adjust() {
r := t.ClientRect()
//t.background.SetBounds(0, 0, r.Right, r.Bottom)
posi := int32(t.position / 100.0 * float32(r.Right))
t.fore.SetBounds(0, 0, posi, r.Bottom)
thumbPosi := posi
w := t.thumb.Width()
if posi <= 0 {
thumbPosi = 0
} else if posi+w >= r.Right {
thumbPosi = r.Right - w
}
t.thumb.SetLeft(thumbPosi)
}
func (t *TImageTrackBar) SetPosition(value int) {
t.setPosition(float32(value))
}
func (t *TImageTrackBar) Position() int {
return int(t.position)
}
func (t *TImageTrackBar) setPosition(value float32) {
t.position = value
if t.position < 0 {
t.position = 0
}
if t.position > 100 {
t.position = 100
}
t.adjust()
if t.OnTrackChange != nil {
t.OnTrackChange(t)
}
}
func (t *TImageTrackBar) onMouseDown(sender lcl.IObject, button types.TMouseButton, shift types.TShiftState, x, y int32) {
if button == types.MbLeft {
t.mouseDown = true
}
}
func (t *TImageTrackBar) onMouseUp(sender lcl.IObject, button types.TMouseButton, shift types.TShiftState, x, y int32) {
t.mouseDown = false
}
func (t *TImageTrackBar) onMouseMove(sender lcl.IObject, shift types.TShiftState, x, y int32) {
if t.mouseDown {
pt := t.thumb.ClientToParent(types.TPoint{x, y}, t)
val := (float32(pt.X) / float32(t.Width())) * 100
t.setPosition(val)
}
}
......@@ -2,9 +2,7 @@
package main
import (
"github.com/energye/golcl/lcl"
)
import "github.com/energye/golcl/lcl"
type TForm1 struct {
*lcl.TForm
......
......@@ -4,6 +4,7 @@ package main
import (
"fmt"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/i18n"
"github.com/energye/golcl/lcl/types"
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/i18n"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
i18n.InitDefaultLang()
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
......@@ -13,7 +14,7 @@ var (
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
前往 https://github.com/ying32/rproxy 查看
前往 https://github.com/energye/rproxy 查看
![s1.jpg](https://github.com/ying32/rproxy/raw/master/imgs/client_gui.jpg)
\ No newline at end of file
![s1.jpg](https://github.com/energye/rproxy/raw/master/imgs/client_gui.jpg)
\ No newline at end of file
......@@ -2,14 +2,14 @@ package main
import (
"fmt"
"time"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......@@ -151,79 +151,79 @@ func main() {
}
})
// TListBox
top += cb.Height() + 5
lst := lcl.NewListBox(mainForm)
lst.SetParent(mainForm)
lst.SetBounds(10, top, 167, 50)
lst.Items().Add("1")
lst.Items().Add("2")
lst.Items().Add("3")
// TPanel
top += lst.Height() + 5
pnl := lcl.NewPanel(mainForm)
pnl.SetParent(mainForm)
pnl.SetCaption("fff")
// pnl.SetShowCaption(false)
pnl.SetBounds(10, top, 167, 50)
// color
top += pnl.Height() + 5
clr := lcl.NewColorBox(mainForm)
clr.SetParent(mainForm)
clr.SetLeft(10)
clr.SetTop(top)
clr.SetOnChange(func(lcl.IObject) {
if clr.ItemIndex() != -1 {
lbl.Font().SetColor(clr.Selected())
}
})
// TPageControl
top += clr.Height() + 5
pgc := lcl.NewPageControl(mainForm)
pgc.SetParent(mainForm)
pgc.SetBounds(10, top, 167, 100)
pgc.SetOnChange(func(lcl.IObject) {
fmt.Println("当前索引:", pgc.ActivePageIndex())
})
sheet := lcl.NewTabSheet(mainForm)
sheet.SetPageControl(pgc)
sheet.SetCaption("一")
btn = lcl.NewButton(mainForm)
btn.SetParent(sheet)
btn.SetLeft(10)
btn.SetTop(10)
btn.SetCaption("按钮1")
sheet = lcl.NewTabSheet(mainForm)
sheet.SetPageControl(pgc)
sheet.SetCaption("二")
btn = lcl.NewButton(mainForm)
btn.SetParent(sheet)
btn.SetLeft(10)
btn.SetTop(10)
btn.SetCaption("按钮2")
sheet = lcl.NewTabSheet(mainForm)
sheet.SetPageControl(pgc)
sheet.SetCaption("三")
btn = lcl.NewButton(mainForm)
btn.SetParent(sheet)
btn.SetLeft(10)
btn.SetTop(10)
btn.SetCaption("按钮3")
// TImage
top += pgc.Height() + 5
img := lcl.NewImage(mainForm)
img.SetBounds(10, top, 167, 97)
img.SetParent(mainForm)
img.Picture().LoadFromFile("1.jpg")
//img.SetStretch(true)
img.SetProportional(true)
//// TListBox
//top += cb.Height() + 5
//lst := lcl.NewListBox(mainForm)
//lst.SetParent(mainForm)
//lst.SetBounds(10, top, 167, 50)
//lst.Items().Add("1")
//lst.Items().Add("2")
//lst.Items().Add("3")
//// TPanel
//top += lst.Height() + 5
//pnl := lcl.NewPanel(mainForm)
//pnl.SetParent(mainForm)
//pnl.SetCaption("fff")
//// pnl.SetShowCaption(false)
//pnl.SetBounds(10, top, 167, 50)
//
//// color
//top += pnl.Height() + 5
//clr := lcl.NewColorBox(mainForm)
//clr.SetParent(mainForm)
//clr.SetLeft(10)
//clr.SetTop(top)
//clr.SetOnChange(func(lcl.IObject) {
// if clr.ItemIndex() != -1 {
// lbl.Font().SetColor(clr.Selected())
// }
//})
//
//// TPageControl
//top += clr.Height() + 5
//pgc := lcl.NewPageControl(mainForm)
//pgc.SetParent(mainForm)
//pgc.SetBounds(10, top, 167, 100)
//pgc.SetOnChange(func(lcl.IObject) {
// fmt.Println("当前索引:", pgc.ActivePageIndex())
//})
//
//sheet := lcl.NewTabSheet(mainForm)
//sheet.SetPageControl(pgc)
//sheet.SetCaption("一")
//btn = lcl.NewButton(mainForm)
//btn.SetParent(sheet)
//btn.SetLeft(10)
//btn.SetTop(10)
//btn.SetCaption("按钮1")
//
//sheet = lcl.NewTabSheet(mainForm)
//sheet.SetPageControl(pgc)
//sheet.SetCaption("二")
//btn = lcl.NewButton(mainForm)
//btn.SetParent(sheet)
//btn.SetLeft(10)
//btn.SetTop(10)
//btn.SetCaption("按钮2")
//
//sheet = lcl.NewTabSheet(mainForm)
//sheet.SetPageControl(pgc)
//sheet.SetCaption("三")
//btn = lcl.NewButton(mainForm)
//btn.SetParent(sheet)
//btn.SetLeft(10)
//btn.SetTop(10)
//btn.SetCaption("按钮3")
//
//// TImage
//top += pgc.Height() + 5
//img := lcl.NewImage(mainForm)
//img.SetBounds(10, top, 167, 97)
//img.SetParent(mainForm)
//img.Picture().LoadFromFile("E:\\SWT\\gopath\\src\\github.com\\energye\\golcl\\samples\\stdcontrols\\1.jpg")
////img.SetStretch(true)
//img.SetProportional(true)
left = 210
top = 10
......@@ -265,42 +265,42 @@ func main() {
dtp.SetTimeSeparator(".")
dtp.SetHideDateTimeParts(dtp.HideDateTimeParts().Include(types.DtpYear))
top += dtp.Height() + 10
mdtp := lcl.NewMonthCalendar(mainForm)
mdtp.SetParent(mainForm)
mdtp.SetBounds(left, top, 250, 250)
mdtp.SetOnClick(func(lcl.IObject) {
fmt.Println(mdtp.Date())
})
top += mdtp.Height() + 10
dtp.SetDateTime(time.Now().Add(time.Hour * 48))
dtp.SetDate(time.Now().AddDate(1, 0, 0))
fmt.Println("time: ", mdtp.Date(), dtp.DateTime())
btn = lcl.NewButton(mainForm)
btn.SetParent(mainForm)
btn.SetLeft(left)
btn.SetTop(top)
btn.SetCaption("改变日期")
btn.SetOnClick(func(lcl.IObject) {
mdtp.SetDate(time.Now().AddDate(7777, 1, 23))
})
top += btn.Height() + 10
spinedit := lcl.NewSpinEdit(mainForm)
spinedit.SetParent(mainForm)
spinedit.SetLeft(left)
spinedit.SetTop(top)
spinedit.SetWidth(100)
spinedit.SetMaxValue(10000)
spinedit.SetMinValue(50)
spinedit.SetValue(100)
spinedit.SetOnChange(func(sender lcl.IObject) {
fmt.Println(spinedit.Value())
})
//top += dtp.Height() + 10
//
//mdtp := lcl.NewMonthCalendar(mainForm)
//mdtp.SetParent(mainForm)
//mdtp.SetBounds(left, top, 250, 250)
//mdtp.SetOnClick(func(lcl.IObject) {
// fmt.Println(mdtp.Date())
//})
//
//top += mdtp.Height() + 10
//dtp.SetDateTime(time.Now().Add(time.Hour * 48))
//dtp.SetDate(time.Now().AddDate(1, 0, 0))
//
//fmt.Println("time: ", mdtp.Date(), dtp.DateTime())
//
//btn = lcl.NewButton(mainForm)
//btn.SetParent(mainForm)
//btn.SetLeft(left)
//btn.SetTop(top)
//btn.SetCaption("改变日期")
//btn.SetOnClick(func(lcl.IObject) {
// mdtp.SetDate(time.Now().AddDate(7777, 1, 23))
//})
//
//top += btn.Height() + 10
//spinedit := lcl.NewSpinEdit(mainForm)
//spinedit.SetParent(mainForm)
//spinedit.SetLeft(left)
//spinedit.SetTop(top)
//spinedit.SetWidth(100)
//spinedit.SetMaxValue(10000)
//spinedit.SetMinValue(50)
//spinedit.SetValue(100)
//spinedit.SetOnChange(func(sender lcl.IObject) {
// fmt.Println(spinedit.Value())
//})
// run
lcl.Application.Run()
......
......@@ -2,8 +2,9 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
"github.com/energye/golcl/lcl/types"
......@@ -17,6 +18,7 @@ type TMainForm struct {
var MainForm *TMainForm
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.CreateForm(&MainForm, true)
lcl.Application.Run()
......
......@@ -2,10 +2,12 @@
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
)
func main() {
inits.Init(nil, nil)
lcl.Application.SetScaled(true)
lcl.Application.SetTitle("project1")
lcl.Application.Initialize()
......
......@@ -3,9 +3,9 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
"runtime"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
_ "github.com/energye/golcl/pkgs/winappres"
//"github.com/energye/golcl/lcl/rtl"
......
......@@ -2,6 +2,7 @@ package main
import (
"fmt"
"github.com/energye/golcl/energy/inits"
"runtime"
"github.com/energye/golcl/lcl"
......@@ -11,7 +12,7 @@ import (
)
func main() {
inits.Init(nil, nil)
lcl.Application.SetIconResId(3)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
......
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(true)
lcl.Application.CreateForm(&Form1)
......
......@@ -2,12 +2,13 @@
package main
import (
"github.com/energye/golcl/energy/inits"
"github.com/energye/golcl/lcl"
_ "github.com/energye/golcl/pkgs/winappres"
)
func main() {
inits.Init(nil, nil)
lcl.Application.SetScaled(true)
lcl.Application.SetTitle("videosrtgui")
lcl.Application.Initialize()
......
......@@ -36,7 +36,7 @@ func main() {
sp := strings.Split(gopaths, ";")
libLCLBinResDir := strings.TrimSpace(sp[0])
for _, s := range sp {
s = strings.TrimSpace(s) + "/src/github.com/ying32/liblclbinres"
s = strings.TrimSpace(s) + "/src/github.com/energye/liblclbinres"
if fileExists(s) {
libLCLBinResDir = s
break
......
**注意:res2go命令行工具已经废弃,请改用[res2go IDE插件](https://github.com/ying32/res2go-ide-plugin),[使用方法](https://gitee.com/ying32/govcl/wikis/pages?sort_id=2645001&doc_id=102420)。**
**注意:res2go命令行工具已经废弃,请改用[res2go IDE插件](https://github.com/energye/res2go-ide-plugin),[使用方法](https://gitee.com/ying32/govcl/wikis/pages?sort_id=2645001&doc_id=102420)。**
----
**Note: The res2go command line tool has been deprecated, please use [res2go IDE plugin](https://github.com/ying32/res2go-ide-plugin), [Usage(Chinese)](https://gitee.com/ying32/govcl/wikis/pages?sort_id=2645001&doc_id=102420).**
**Note: The res2go command line tool has been deprecated, please use [res2go IDE plugin](https://github.com/energye/res2go-ide-plugin), [Usage(Chinese)](https://gitee.com/ying32/govcl/wikis/pages?sort_id=2645001&doc_id=102420).**