新增: 壁纸切换(主题/本地图片/Bing/纯色渐变)
This commit is contained in:
119
dialog.go
Normal file
119
dialog.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"unicode/utf16"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
comdlg32 = windows.NewLazySystemDLL("comdlg32.dll")
|
||||
procGetOpenFileNameW = comdlg32.NewProc("GetOpenFileNameW")
|
||||
procChooseColorW = comdlg32.NewProc("ChooseColorW")
|
||||
)
|
||||
|
||||
func slicePtr(s interface{}) uintptr {
|
||||
switch v := s.(type) {
|
||||
case []uint16:
|
||||
if len(v) == 0 { return 0 }
|
||||
return uintptr(unsafe.Pointer(&v[0]))
|
||||
case []uint32:
|
||||
if len(v) == 0 { return 0 }
|
||||
return uintptr(unsafe.Pointer(&v[0]))
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func openFileDialog(owner uintptr) string {
|
||||
type openFileName struct {
|
||||
lStructSize uint32
|
||||
hwndOwner uintptr
|
||||
hInstance uintptr
|
||||
lpstrFilter uintptr
|
||||
lpstrCustomFilter uintptr
|
||||
nMaxCustFilter uint32
|
||||
nFilterIndex uint32
|
||||
lpstrFile uintptr
|
||||
nMaxFile uint32
|
||||
lpstrFileTitle uintptr
|
||||
nMaxFileTitle uint32
|
||||
lpstrInitialDir uintptr
|
||||
lpstrTitle uintptr
|
||||
Flags uint32
|
||||
nFileOffset uint16
|
||||
nFileExtension uint16
|
||||
lpstrDefExt uintptr
|
||||
lCustData uintptr
|
||||
lpfnHook uintptr
|
||||
lpTemplateName uintptr
|
||||
pvReserved uintptr
|
||||
dwReserved uint32
|
||||
FlagsEx uint32
|
||||
}
|
||||
|
||||
// Filter: "Images\0*.jpg;*.png\0All\0*.*\0\0"
|
||||
filterStr := "图片文件\x00*.jpg;*.jpeg;*.png;*.bmp;*.webp;*.gif\x00所有文件\x00*.*\x00\x00"
|
||||
filterUTF16 := utf16.Encode([]rune(filterStr))
|
||||
|
||||
titleUTF16 := utf16.Encode([]rune("选择壁纸图片"))
|
||||
fileBuf := make([]uint16, 260)
|
||||
|
||||
ofn := openFileName{
|
||||
lStructSize: uint32(unsafe.Sizeof(openFileName{})),
|
||||
hwndOwner: owner,
|
||||
lpstrFilter: slicePtr(filterUTF16),
|
||||
lpstrFile: slicePtr(fileBuf),
|
||||
nMaxFile: 260,
|
||||
lpstrTitle: slicePtr(titleUTF16),
|
||||
Flags: 0x00001000 | 0x00000800 | 0x00000004,
|
||||
}
|
||||
|
||||
ret, _, _ := procGetOpenFileNameW.Call(uintptr(unsafe.Pointer(&ofn)))
|
||||
if ret == 0 {
|
||||
return ""
|
||||
}
|
||||
return windows.UTF16ToString(fileBuf)
|
||||
}
|
||||
|
||||
func colorPickerDialog(owner uintptr, initialColor string) string {
|
||||
type chooseColor struct {
|
||||
lStructSize uint32
|
||||
hwndOwner uintptr
|
||||
hInstance uintptr
|
||||
rgbResult uint32
|
||||
lpCustColors uintptr
|
||||
Flags uint32
|
||||
lCustData uintptr
|
||||
lpfnHook uintptr
|
||||
lpTemplateName uintptr
|
||||
}
|
||||
|
||||
custColors := make([]uint32, 16)
|
||||
|
||||
var initRGB uint32
|
||||
if len(initialColor) > 4 && initialColor[0] == '#' {
|
||||
var r, g, b uint32
|
||||
fmt.Sscanf(initialColor[1:], "%02x%02x%02x", &r, &g, &b)
|
||||
initRGB = r | (g << 8) | (b << 16)
|
||||
}
|
||||
|
||||
cc := chooseColor{
|
||||
lStructSize: uint32(unsafe.Sizeof(chooseColor{})),
|
||||
hwndOwner: owner,
|
||||
rgbResult: initRGB,
|
||||
lpCustColors: slicePtr(custColors),
|
||||
Flags: 0x00000002,
|
||||
}
|
||||
|
||||
ret, _, _ := procChooseColorW.Call(uintptr(unsafe.Pointer(&cc)))
|
||||
if ret == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
r := cc.rgbResult & 0xFF
|
||||
g := (cc.rgbResult >> 8) & 0xFF
|
||||
b := (cc.rgbResult >> 16) & 0xFF
|
||||
return fmt.Sprintf("#%02x%02x%02x", r, g, b)
|
||||
}
|
||||
Reference in New Issue
Block a user