LBS_STANDARD | LBS_HASSTRINGS,
LBS_NOTIFY | LBS_HASSTRINGS,
static void sesssaver(struct ctlpos *cp, char *text,                      int staticid, int editid, int listid, ...) {    RECT r;    va_list ap;    int lwid, rwid, rpos;    int y;    const int LISTDEFHEIGHT = 66;    rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4;    lwid = rpos - 2*GAPBETWEEN;    rwid = cp->width + GAPBETWEEN - rpos;    /* The static control. */    r.left = GAPBETWEEN; r.top = cp->ypos;    r.right = lwid; r.bottom = STATICHEIGHT;    cp->ypos += r.bottom + GAPWITHIN;    doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid);    /* The edit control. */    r.left = GAPBETWEEN; r.top = cp->ypos;    r.right = lwid; r.bottom = EDITHEIGHT;    cp->ypos += r.bottom + GAPWITHIN;    doctl(cp, r, "EDIT",          WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,          WS_EX_CLIENTEDGE,          "", editid);    /*     * The buttons (we should hold off on the list box until we     * know how big the buttons are).     */    va_start(ap, listid);    y = cp->ypos;    while (1) {        char *btext = va_arg(ap, char *);        int bid;        if (!btext) break;        bid = va_arg(ap, int);        r.left = rpos; r.top = y;        r.right = rwid; r.bottom = PUSHBTNHEIGHT;        y += r.bottom + GAPWITHIN;        doctl(cp, r, "BUTTON",              WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,              0,              btext, bid);    }    /* Compute list box height. LISTDEFHEIGHT, or height of buttons. */    y -= cp->ypos;    y -= GAPWITHIN;    if (y < LISTDEFHEIGHT) y = LISTDEFHEIGHT;    r.left = GAPBETWEEN; r.top = cp->ypos;    r.right = lwid; r.bottom = y;    cp->ypos += y + GAPBETWEEN;    doctl(cp, r, "LISTBOX",          WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL |           LBS_STANDARD | LBS_HASSTRINGS,          WS_EX_CLIENTEDGE,          "", listid);}