/* -------------- button.c -------------- */ #include "dflat.h" void PaintMsg(DFWINDOW wnd, DF_CTLWINDOW *ct, DFRECT *rc) { if (DfIsVisible(wnd)) { if (DfTestAttribute(wnd, DF_SHADOW)) { /* -------- draw the button's shadow ------- */ int x; DfBackground = DfWndBackground(DfGetParent(wnd)); DfForeground = BLACK; for (x = 1; x <= DfWindowWidth(wnd); x++) DfWPutch(wnd, (char)223, x, 1); DfWPutch(wnd, (char)220, DfWindowWidth(wnd), 0); } if (ct->itext != NULL) { char *txt; txt = DfCalloc(1, strlen(ct->itext)+10); if (ct->setting == DF_OFF) { txt[0] = DF_CHANGECOLOR; txt[1] = wnd->WindowColors [DF_HILITE_COLOR] [DF_FG] | 0x80; txt[2] = wnd->WindowColors [DF_STD_COLOR] [DF_BG] | 0x80; } DfCopyCommand(txt+strlen(txt),ct->itext,!ct->setting, DfWndBackground(wnd)); DfSendMessage(wnd, DFM_CLEARTEXT, 0, 0); DfSendMessage(wnd, DFM_ADDTEXT, (DF_PARAM) txt, 0); free(txt); } /* --------- write the button's text ------- */ DfWriteTextLine(wnd, rc, 0, wnd == DfInFocus); } } void LeftButtonMsg(DFWINDOW wnd, DFMESSAGE msg, DF_CTLWINDOW *ct) { /* --------- draw a pushed button -------- */ int x; DfBackground = DfWndBackground(DfGetParent(wnd)); DfForeground = DfWndBackground(wnd); DfWPutch(wnd, ' ', 0, 0); for (x = 0; x < DfWindowWidth(wnd); x++) { DfWPutch(wnd, (char)220, x+1, 0); DfWPutch(wnd, (char)223, x+1, 1); } if (msg == DFM_LEFT_BUTTON) DfSendMessage(NULL, DFM_WAITMOUSE, 0, 0); else DfSendMessage(NULL, DFM_WAITKEYBOARD, 0, 0); DfSendMessage(wnd, DFM_PAINT, 0, 0); if (ct->setting == DF_ON) DfPostMessage(DfGetParent(wnd), DFM_COMMAND, ct->command, 0); else DfBeep(); } int DfButtonProc(DFWINDOW wnd, DFMESSAGE msg, DF_PARAM p1, DF_PARAM p2) { DF_CTLWINDOW *ct = DfGetControl(wnd); if (ct != NULL) { switch (msg) { case DFM_SETFOCUS: DfBaseWndProc(DF_BUTTON, wnd, msg, p1, p2); p1 = 0; /* ------- fall through ------- */ case DFM_PAINT: PaintMsg(wnd, ct, (DFRECT*)p1); return TRUE; case DFM_KEYBOARD: if (p1 != '\r') break; /* ---- fall through ---- */ case DFM_LEFT_BUTTON: LeftButtonMsg(wnd, msg, ct); return TRUE; case DFM_HORIZSCROLL: return TRUE; default: break; } } return DfBaseWndProc(DF_BUTTON, wnd, msg, p1, p2); } /* EOF */