char **itemlist;
int num_items;
+ int disabled;
+
wgt_callback cb_click;
wgt_callback cb_modify;
};
memset(&wc, 0, sizeof wc);
wc.hInstance = hinst;
- wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
+ wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.lpszClassName = win->cname;
free(w->itemlist);
}
+void wgt_enable_widget(struct wgt_widget *w)
+{
+ w->disabled = 0;
+ EnableWindow(w->handle, 1);
+}
+
+void wgt_disable_widget(struct wgt_widget *w)
+{
+ w->disabled = 1;
+ EnableWindow(w->handle, 0);
+}
+
+int wgt_widget_enabled(struct wgt_widget *w)
+{
+ return !w->disabled;
+}
+
struct wgt_window *wgt_widget_window(struct wgt_widget *w)
{
return w->win;
{
struct wgt_widget *w;
struct wgt_rect textsz;
+ int check_width;
if(!(w = calloc(1, sizeof *w))) {
fprintf(stderr, "wgt_checkbox: failed to allocate widget structure\n");
}
w->win = win;
+ check_width = GetSystemMetrics(SM_CXMENUCHECK);
+
if(width < 0 || height < 0) {
wgt_string_size(win, text, &textsz);
- if(width < 0) width = textsz.width + 32; /* XXX */
+ if(width < 0) width = textsz.width + check_width + 10;
if(height < 0) height = textsz.height;
}
w->rect.width = width;
w->rect.height = height;
- w->cb_modify = modfunc;
+ w->cb_click = modfunc; /* BN_CLICKED is sent for checkbox state changes */
w->next = win->wlist;
win->wlist = w;
return w;
return 0;
}
- max_width = max_height = sum_height = 0;
+ wgt_string_size(win, "00", &textsz);
+ max_width = width < 0 && width != WGT_AUTO ? -width : textsz.width;
+ max_height = height < 0 && height != WGT_AUTO ? -height : textsz.height;
+ sum_height = num_items ? 0 : max_height;
for(i=0; i<num_items; i++) {
wgt_string_size(win, items[i], &textsz);
if(height < 0) height = sum_height * 2;
- if(!(w->handle = CreateWindow("COMBOBOX", items[0],
+ if(!(w->handle = CreateWindow("COMBOBOX", items[0] ? items[0] : "",
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
x, y, width, height, win->handle, 0, GetModuleHandle(0), 0))) {
fprintf(stderr, "wgt_combo: failed to create window\n");
if(sel < 0) sel = 0;
if(sel >= num_items) sel = num_items - 1;
- SendMessage(w->handle, CB_SETCURSEL, sel, 0);
+ if(sel >= 0) {
+ SendMessage(w->handle, CB_SETCURSEL, sel, 0);
+ }
w->rect.x = x;
w->rect.y = y;
default:
break;
}
-
+
default:
return DefWindowProc(wnd, msg, wparam, lparam);
}