func ScreenRect() (image.Rectangle, error) { hDC := w32.GetDC(0) if hDC == 0 { return image.Rectangle{}, fmt.Errorf("Could not Get primary display err:%d\n", w32.GetLastError()) } defer w32.ReleaseDC(0, hDC) x := w32.GetDeviceCaps(hDC, w32.HORZRES) y := w32.GetDeviceCaps(hDC, w32.VERTRES) return image.Rect(0, 0, x, y), nil }
func (this *Canvas) Dispose() { if !this.doNotDispose && this.hdc != 0 { if this.hwnd == 0 { w32.DeleteDC(this.hdc) } else { w32.ReleaseDC(this.hwnd, this.hdc) } this.hdc = 0 } }
func NewFont(family string, pointSize int, style byte) *Font { if style > FontBold|FontItalic|FontUnderline|FontStrikeOut { panic("Invalid font style") } //Retrive screen DPI hDC := w32.GetDC(0) defer w32.ReleaseDC(0, hDC) screenDPIY := w32.GetDeviceCaps(hDC, w32.LOGPIXELSY) font := Font{ family: family, pointSize: pointSize, style: style, } font.hfont = font.createForDPI(screenDPIY) if font.hfont == 0 { panic("CreateFontIndirect failed") } return &font }
// Draw sets the drawing mode of the window. func (win *window) Draw(mode bool) { if win.isPaint { return } if mode { if win.dc != 0 { return } win.dc = w32.GetDC(win.id) w32.SetBkMode(win.dc, w32.TRANSPARENT) w32.SetBkColor(win.dc, win.back.color) w32.SelectObject(win.dc, w32.HGDIOBJ(win.fore.brush)) w32.SelectObject(win.dc, w32.HGDIOBJ(win.fore.pen)) w32.SelectObject(win.dc, w32.HGDIOBJ(winFont)) w32.SetTextColor(win.dc, win.fore.color) win.curr = win.fore return } if win.dc == 0 { return } w32.ReleaseDC(win.id, win.dc) win.dc = 0 }
func CaptureRect(rect image.Rectangle) (*image.RGBA, error) { hDC := w32.GetDC(0) if hDC == 0 { return nil, fmt.Errorf("Could not Get primary display err:%d.\n", w32.GetLastError()) } defer w32.ReleaseDC(0, hDC) m_hDC := w32.CreateCompatibleDC(hDC) if m_hDC == 0 { return nil, fmt.Errorf("Could not Create Compatible DC err:%d.\n", w32.GetLastError()) } defer w32.DeleteDC(m_hDC) x, y := rect.Dx(), rect.Dy() bt := w32.BITMAPINFO{} bt.BmiHeader.BiSize = uint(reflect.TypeOf(bt.BmiHeader).Size()) bt.BmiHeader.BiWidth = x bt.BmiHeader.BiHeight = -y bt.BmiHeader.BiPlanes = 1 bt.BmiHeader.BiBitCount = 32 bt.BmiHeader.BiCompression = w32.BI_RGB ptr := unsafe.Pointer(uintptr(0)) m_hBmp := w32.CreateDIBSection(m_hDC, &bt, w32.DIB_RGB_COLORS, &ptr, 0, 0) if m_hBmp == 0 { return nil, fmt.Errorf("Could not Create DIB Section err:%d.\n", w32.GetLastError()) } if m_hBmp == w32.InvalidParameter { return nil, fmt.Errorf("One or more of the input parameters is invalid while calling CreateDIBSection.\n") } defer w32.DeleteObject(w32.HGDIOBJ(m_hBmp)) obj := w32.SelectObject(m_hDC, w32.HGDIOBJ(m_hBmp)) if obj == 0 { return nil, fmt.Errorf("error occurred and the selected object is not a region err:%d.\n", w32.GetLastError()) } if obj == 0xffffffff { //GDI_ERROR return nil, fmt.Errorf("GDI_ERROR while calling SelectObject err:%d.\n", w32.GetLastError()) } defer w32.DeleteObject(obj) //Note:BitBlt contains bad error handling, we will just assume it works and if it doesn't it will panic :x w32.BitBlt(m_hDC, 0, 0, x, y, hDC, rect.Min.X, rect.Min.Y, w32.SRCCOPY) var slice []byte hdrp := (*reflect.SliceHeader)(unsafe.Pointer(&slice)) hdrp.Data = uintptr(ptr) hdrp.Len = x * y * 4 hdrp.Cap = x * y * 4 imageBytes := make([]byte, len(slice)) for i := 0; i < len(imageBytes); i += 4 { imageBytes[i], imageBytes[i+2], imageBytes[i+1], imageBytes[i+3] = slice[i+2], slice[i], slice[i+1], slice[i+3] } img := &image.RGBA{imageBytes, 4 * x, image.Rect(0, 0, x, y)} return img, nil }