func (le *LineEdit) initCharWidth() { font := le.Font() if font == le.charWidthFont { return } le.charWidthFont = font le.charWidth = 8 hdc := win.GetDC(le.hWnd) if hdc == 0 { newError("GetDC failed") return } defer win.ReleaseDC(le.hWnd, hdc) defer win.SelectObject(hdc, win.SelectObject(hdc, win.HGDIOBJ(font.handleForDPI(0)))) buf := []uint16{'M'} var s win.SIZE if !win.GetTextExtentPoint32(hdc, &buf[0], int32(len(buf)), &s) { newError("GetTextExtentPoint32 failed") return } le.charWidth = int(s.CX) }
func (wb *WindowBase) calculateTextSizeImpl(text string) Size { hdc := win.GetDC(wb.hWnd) if hdc == 0 { newError("GetDC failed") return Size{} } defer win.ReleaseDC(wb.hWnd, hdc) hFontOld := win.SelectObject(hdc, win.HGDIOBJ(wb.window.Font().handleForDPI(0))) defer win.SelectObject(hdc, hFontOld) var size Size lines := strings.Split(text, "\n") for _, line := range lines { var s win.SIZE str := syscall.StringToUTF16(strings.TrimRight(line, "\r ")) if !win.GetTextExtentPoint32(hdc, &str[0], int32(len(str)-1), &s) { newError("GetTextExtentPoint32 failed") return Size{} } size.Width = maxi(size.Width, int(s.CX)) size.Height += int(s.CY) } return size }
func (wb *WindowBase) dialogBaseUnits() Size { // The window may use a font different from that in WindowBase, // like e.g. NumberEdit does, so we try to use the right one. window := windowFromHandle(wb.hWnd) hdc := win.GetDC(wb.hWnd) defer win.ReleaseDC(wb.hWnd, hdc) hFont := window.Font().handleForDPI(0) hFontOld := win.SelectObject(hdc, win.HGDIOBJ(hFont)) defer win.SelectObject(hdc, win.HGDIOBJ(hFontOld)) var tm win.TEXTMETRIC if !win.GetTextMetrics(hdc, &tm) { newError("GetTextMetrics failed") } var size win.SIZE if !win.GetTextExtentPoint32( hdc, dialogBaseUnitsUTF16StringPtr, 52, &size) { newError("GetTextExtentPoint32 failed") } return Size{int((size.CX/26 + 1) / 2), int(tm.TmHeight)} }
func (cb *ComboBox) calculateMaxItemTextWidth() int { hdc := win.GetDC(cb.hWnd) if hdc == 0 { newError("GetDC failed") return -1 } defer win.ReleaseDC(cb.hWnd, hdc) hFontOld := win.SelectObject(hdc, win.HGDIOBJ(cb.Font().handleForDPI(0))) defer win.SelectObject(hdc, hFontOld) var maxWidth int count := cb.model.ItemCount() for i := 0; i < count; i++ { var s win.SIZE str := syscall.StringToUTF16(cb.itemString(i)) if !win.GetTextExtentPoint32(hdc, &str[0], int32(len(str)-1), &s) { newError("GetTextExtentPoint32 failed") return -1 } maxWidth = maxi(maxWidth, int(s.CX)) } return maxWidth }
func newCanvasFromHWND(hwnd win.HWND) (*Canvas, error) { hdc := win.GetDC(hwnd) if hdc == 0 { return nil, newError("GetDC failed") } return (&Canvas{hdc: hdc, hwnd: hwnd}).init() }
func init() { // Retrieve screen DPI hDC := win.GetDC(0) defer win.ReleaseDC(0, hDC) screenDPIX = int(win.GetDeviceCaps(hDC, win.LOGPIXELSX)) screenDPIY = int(win.GetDeviceCaps(hDC, win.LOGPIXELSY)) // Initialize default font var err error if defaultFont, err = NewFont("MS Shell Dlg 2", 8, 0); err != nil { panic("failed to create default font") } }
func hBitmapFromImage(im image.Image) (win.HBITMAP, error) { var bi win.BITMAPV5HEADER bi.BiSize = uint32(unsafe.Sizeof(bi)) bi.BiWidth = int32(im.Bounds().Dx()) bi.BiHeight = -int32(im.Bounds().Dy()) bi.BiPlanes = 1 bi.BiBitCount = 32 bi.BiCompression = win.BI_BITFIELDS // The following mask specification specifies a supported 32 BPP // alpha format for Windows XP. bi.BV4RedMask = 0x00FF0000 bi.BV4GreenMask = 0x0000FF00 bi.BV4BlueMask = 0x000000FF bi.BV4AlphaMask = 0xFF000000 hdc := win.GetDC(0) defer win.ReleaseDC(0, hdc) var lpBits unsafe.Pointer // Create the DIB section with an alpha channel. hBitmap := win.CreateDIBSection(hdc, &bi.BITMAPINFOHEADER, win.DIB_RGB_COLORS, &lpBits, 0, 0) switch hBitmap { case 0, win.ERROR_INVALID_PARAMETER: return 0, newError("CreateDIBSection failed") } // Fill the image bitmap_array := (*[1 << 30]byte)(unsafe.Pointer(lpBits)) i := 0 for y := im.Bounds().Min.Y; y != im.Bounds().Max.Y; y++ { for x := im.Bounds().Min.X; x != im.Bounds().Max.X; x++ { r, g, b, a := im.At(x, y).RGBA() bitmap_array[i+3] = byte(a >> 8) bitmap_array[i+2] = byte(r >> 8) bitmap_array[i+1] = byte(g >> 8) bitmap_array[i+0] = byte(b >> 8) i += 4 } } return hBitmap, nil }