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 (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 (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 (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 (c *Canvas) fontHeight(font *Font) (height int, err error) { err = c.withFontAndTextColor(font, 0, func() error { var size win.SIZE if !win.GetTextExtentPoint32(c.hdc, gM, 2, &size) { return newError("GetTextExtentPoint32 failed") } height = int(size.CY) if height == 0 { return newError("invalid font height") } return nil }) return }