draw2d/wingui/wingdi.go

133 lines
3.4 KiB
Go

package wingui
import (
"syscall"
"unsafe"
)
const (
WM_PAINT = 15
BI_RGB = 0
DIB_PAL_COLORS = 1
DIB_RGB_COLORS = 0
SRCCOPY = 0xCC0020
)
type RECT struct {
Left int32
Top int32
Right int32
Bottom int32
}
type PAINTSTRUCT struct {
HDC uint32
Erase int32 // bool
RcPaint RECT
Restore int32 // bool
IncUpdate int32 // bool
rgbReserved [32]byte
}
type BITMAP struct {
Type int32
Width int32
Height int32
WidthBytes int32
Planes uint16
BitsPixel uint16
Bits *byte
}
type BITMAPINFOHEADER struct {
Size uint32
Width int32
Height int32
Planes uint16
BitCount uint16
Compression uint32
SizeImage uint32
XPelsPerMeter int32
YPelsPerMeter int32
ClrUsed uint32
ClrImportant uint32
}
type BITMAPINFO struct {
Header BITMAPINFOHEADER
Colors [1]RGBQUAD
}
type RGBQUAD struct {
Blue byte
Green byte
Red byte
Reserved byte
}
var (
modgdi32 = loadDll("gdi32.dll")
procGetDC = getSysProcAddr(moduser32, "GetDC")
procCreateCompatibleDC = getSysProcAddr(modgdi32, "CreateCompatibleDC")
procGetObject = getSysProcAddr(modgdi32, "GetObjectW")
procSelectObject = getSysProcAddr(modgdi32, "SelectObject")
procBeginPaint = getSysProcAddr(moduser32, "BeginPaint")
procEndPaint = getSysProcAddr(moduser32, "EndPaint")
procCreateCompatibleBitmap = getSysProcAddr(modgdi32, "CreateCompatibleBitmap")
procCreateDIBSection = getSysProcAddr(modgdi32, "CreateDIBSection")
procBitBlt = getSysProcAddr(modgdi32, "BitBlt")
)
func GetDC(hwnd uint32) (hdc uint32) {
r0, _, _ := syscall.Syscall(procGetDC, 1, uintptr(hwnd), 0, 0)
hdc = uint32(r0)
return hdc
}
func CreateCompatibleDC(hwnd uint32) (hdc uint32) {
r0, _, _ := syscall.Syscall(procCreateCompatibleDC, 1, uintptr(hwnd), 0, 0)
hdc = uint32(r0)
return hdc
}
func GetObject(hgdiobj uint32, cbBuffer int, object uintptr) (size uint32) {
r0, _, _ := syscall.Syscall(procGetObject, 3, uintptr(hgdiobj), uintptr(cbBuffer), object)
size = uint32(r0)
return size
}
func SelectObject(hdc uint32, hgdiobj uint32) uint32 {
r0, _, _ := syscall.Syscall(procSelectObject, 2, uintptr(hdc), uintptr(hgdiobj), 0)
return uint32(r0)
}
func BeginPaint(hwnd uint32, ps *PAINTSTRUCT) (hdc uint32) {
r0, _, _ := syscall.Syscall(procBeginPaint, 2, uintptr(hwnd), uintptr(unsafe.Pointer(ps)), 0)
hdc = uint32(r0)
return hdc
}
func EndPaint(hwnd uint32, ps *PAINTSTRUCT) bool {
syscall.Syscall(procEndPaint, 2, uintptr(hwnd), uintptr(unsafe.Pointer(ps)), 0)
return true
}
func CreateCompatibleBitmap(hdc uint32, width, height int) (hbitmap uint32) {
r0, _, _ := syscall.Syscall(procCreateCompatibleBitmap, 3, uintptr(hdc), uintptr(width), uintptr(height))
return uint32(r0)
}
func CreateDIBSection(hdc uint32, pbmi *BITMAPINFO, iUsage uint, ppvBits uintptr, hSection uint32, dwOffset uint32) (hbitmap uint32) {
r0, _, _ := syscall.Syscall6(procCreateDIBSection, 6, uintptr(hdc), uintptr(unsafe.Pointer(pbmi)), uintptr(iUsage), ppvBits, uintptr(hSection), uintptr(dwOffset))
return uint32(r0)
}
func BitBlt(hdc uint32, nXDest, nYDest, nWidth, nHeight int, hdcSrc uint32, nXSrc, nYSrc int, dwRop uint32) bool {
r0, _, _ := syscall.Syscall9(procBitBlt, 9, uintptr(hdc), uintptr(nXDest), uintptr(nYDest), uintptr(nWidth), uintptr(nHeight), uintptr(hdcSrc), uintptr(nXSrc), uintptr(nYSrc), uintptr(dwRop))
return r0 != 0
}