Started the Windows ProgressBar implemetnation. There's still an important detail left over...

This commit is contained in:
Pietro Gagliardi 2014-11-04 09:18:57 -05:00
parent c5aa4bc964
commit 44cd9db87c
3 changed files with 57 additions and 1 deletions

View File

@ -236,3 +236,6 @@ void setSpinboxEditSubclass(HWND hwnd, void *data)
if ((*fv_SetWindowSubclass)(hwnd, spinboxEditSubProc, 0, (DWORD_PTR) data) == FALSE)
xpanic("error subclassing Spinbox edit control to give it its own event handler", GetLastError());
}
// provided for cgo's benefit
LPWSTR xPROGRESS_CLASS = PROGRESS_CLASS;

52
progressbar_windows.go Normal file
View File

@ -0,0 +1,52 @@
// 4 november 2014
package ui
import (
"fmt"
)
// #include "winapi_windows.h"
import "C"
type progressbar struct {
*controlSingleHWND
}
func newProgressBar() ProgressBar {
hwnd := C.newControl(C.xPROGRESS_CLASS,
C.PBS_SMOOTH,
0)
p := &progressbar{
controlSingleHWND: newControlSingleHWND(hwnd),
}
p.fpreferredSize = p.xpreferredSize
p.fnTabStops = func() int {
// progress bars are not tab stops
return 0
}
return p
}
func (p *progressbar) Percent() int {
return int(C.SendMessageW(p.hwnd, C.PBM_GETPOS, 0, 0))
}
func (p *progressbar) SetPercent(percent int) {
if percent < 0 || percent > 100 {
panic(fmt.Errorf("given ProgressBar percentage %d out of range", percent))
}
// TODO circumvent aero
C.SendMessageW(p.hwnd, C.PBM_SETPOS, C.WPARAM(percent), 0)
}
const (
// via http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx
// this is the double-width option
progressbarWidth = 237
progressbarHeight = 8
)
func (p *progressbar) xpreferredSize(d *sizing) (width, height int) {
return fromdlgunitsX(progressbarWidth, d), fromdlgunitsY(progressbarHeight, d)
}

View File

@ -77,6 +77,7 @@ extern void textfieldHideInvalidBalloonTip(HWND);
extern void setGroupSubclass(HWND, void *);
extern HWND newUpDown(HWND, void *);
extern void setSpinboxEditSubclass(HWND, void *);
extern LPWSTR xPROGRESS_CLASS;
// init_windows.c
extern HINSTANCE hInstance;