Implemented Area.Repaint() on Windows.

This commit is contained in:
Pietro Gagliardi 2014-08-21 13:01:50 -04:00
parent 5ddef41133
commit 3a16648b83
3 changed files with 30 additions and 5 deletions

View File

@ -289,10 +289,10 @@ static void adjustAreaScrollbars(HWND hwnd, void *data)
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
}
void repaintArea(HWND hwnd)
void repaintArea(HWND hwnd, RECT *r)
{
// NULL - the whole area; TRUE - have windows erase if possible
if (InvalidateRect(hwnd, NULL, TRUE) == 0)
if (InvalidateRect(hwnd, r, TRUE) == 0)
xpanic("error flagging Area as needing repainting after event", GetLastError());
if (UpdateWindow(hwnd) == 0)
xpanic("error repainting Area after event", GetLastError());
@ -386,10 +386,16 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
return (LRESULT) areaKeyEvent(data, TRUE, wParam, lParam);
case msgAreaSizeChanged:
adjustAreaScrollbars(hwnd, data);
repaintArea(hwnd); // this calls for an update
repaintArea(hwnd, NULL); // this calls for an update
return 0;
case msgAreaGetScroll:
getScrollPos(hwnd, (int *) wParam, (int *) lParam);
return 0;
case msgAreaRepaint:
repaintArea(hwnd, (RECT *) lParam);
return 0;
case msgAreaRepaintAll:
repaintArea(hwnd);
repaintArea(hwnd, NULL);
return 0;
default:
return DefWindowProcW(hwnd, uMsg, wParam, lParam);

View File

@ -46,6 +46,23 @@ func (a *area) SetSize(width, height int) {
C.SendMessageW(a._hwnd, C.msgAreaSizeChanged, 0, 0)
}
func (a *area) Repaint(r image.Rectangle) {
var hscroll, vscroll C.int
var rect C.RECT
C.SendMessageW(a._hwnd, C.msgAreaGetScroll, C.WPARAM(uintptr(unsafe.Pointer(&hscroll))), C.LPARAM(uintptr(unsafe.Pointer(&vscroll))))
r = r.Add(image.Pt(int(hscroll), int(vscroll))) // adjust by scroll position
r = image.Rect(0, 0, a.width, a.height).Intersect(r)
if r.Empty() {
return
}
rect.left = C.LONG(r.Min.X)
rect.top = C.LONG(r.Min.Y)
rect.right = C.LONG(r.Max.X)
rect.bottom = C.LONG(r.Max.Y)
C.SendMessageW(a._hwnd, C.msgAreaRepaint, 0, C.LPARAM(uintptr(unsafe.Pointer(&rect))))
}
func (a *area) RepaintAll() {
C.SendMessageW(a._hwnd, C.msgAreaRepaintAll, 0, 0)
}

View File

@ -30,6 +30,8 @@ enum {
msgCOMMAND, // WM_COMMAND proxy; see forwardCommand() in controls_windows.go
msgNOTIFY, // WM_NOTIFY proxy
msgAreaSizeChanged,
msgAreaGetScroll,
msgAreaRepaint,
msgAreaRepaintAll,
msgTabCurrentTabHasChildren,
msgBeginModal,
@ -122,7 +124,7 @@ extern void calculateBaseUnits(HWND, int *, int *, LONG *);
// area_window.c
#define areaWindowClass L"gouiarea"
extern void repaintArea(HWND);
extern void repaintArea(HWND, RECT *);
extern DWORD makeAreaWindowClass(char **);
extern HWND newArea(void *);