#include #include long FAR PASCAL _export DlgProc(HWND hDlg, WORD msg, WORD wParam, LONG lParam); class Dialog { public: HANDLE _hInstance; HWND hWindow; FARPROC _DlgProc; char far *name; Dialog(int DlgName, HANDLE hInstance); Dialog(HANDLE hInstance, LPSTR lpTemplateName, HWND hWndParent); ~Dialog(); virtual int InitDialog( WORD wParam, LONG lParam)=0; virtual int MemberDlgProc( WORD message, WORD wParam, LONG lParam)=0; }; Dialog::Dialog(int DlgName, HANDLE hInstance) : _hInstance(hInstance) { _DlgProc = MakeProcInstance((FARPROC)::DlgProc, hInstance); name = MAKEINTRESOURCE(DlgName); } Dialog::~Dialog() { FreeProcInstance(_DlgProc); } #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) long FAR PASCAL _export DlgProc(HWND hDlg, WORD message, WORD wParam, LONG lParam) { static Dialog *pDialog; switch (message) { case WM_INITDIALOG: pDialog = (Dialog*)(void far *)lParam; pDialog->hWindow = hDlg; pDialog->InitDialog( wParam, lParam); //break; return TRUE ; default: return pDialog->MemberDlgProc( message, wParam, lParam); } //return FALSE ; } int PerformDialog(HWND hwndParent, Dialog * d) { return DialogBoxParam(d->_hInstance, d->name, hwndParent, d->_DlgProc, (LONG) d) ; } //------------------------------------------------- #define CTRLCOLORDIALOG_OK 1 #define CTRLCOLORDIALOG_CANCEL 2 class CtrlColorDialog : public Dialog { int color [3] ; public: int r() { return color[0]; } int g() { return color[1]; } int b() { return color[2]; } CtrlColorDialog(int DlgName, HANDLE hInstance, int r, int g, int b) : Dialog(DlgName, hInstance) { color[0] = r; color[1] = g; color[2] = b; } //~CtrlColorDialog(); virtual int InitDialog( WORD wParam, LONG lParam); virtual int MemberDlgProc( WORD message, WORD wParam, LONG lParam); }; int CtrlColorDialog::InitDialog( WORD wParam, LONG lParam) { HWND hwndParent, hCtrl ; int nCtrlID, nIndex ; for (nCtrlID = 10 ; nCtrlID < 13 ; nCtrlID++) { hCtrl = GetDlgItem (hWindow, nCtrlID) ; SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ; SetScrollPos (hCtrl, SB_CTL, color [nCtrlID-10], FALSE) ; SetDlgItemInt (hWindow, nCtrlID + 3, color [nCtrlID-10], FALSE) ; } } int CtrlColorDialog::MemberDlgProc( WORD message, WORD wParam, LONG lParam) { HWND hCtrl ; int nCtrlID, nIndex ; switch (message) { case WM_MOVE: InvalidateRect( GetParent(hWindow), NULL, 1); return 0; case WM_CTLCOLOR: HWND hwnd = GetDlgItem (hWindow, 20); ScreenCanvas s(hwnd); Brusch b( s.DC(),color[0], color[1], color[2] ); RECT r; GetClientRect(hwnd, (LPRECT)&r) ; s.Rect(r); return 0; case WM_HSCROLL : //MessageBeep(0); hCtrl = HIWORD (lParam) ; nCtrlID = GetWindowWord (hCtrl, GWW_ID) ; nIndex = nCtrlID - 10 ; switch (wParam) { case SB_PAGEDOWN : color [nIndex] += 15 ; // fall through case SB_LINEDOWN : color [nIndex] = min (255, color [nIndex] + 1) ; break ; case SB_PAGEUP : color [nIndex] -= 15 ; // fall through case SB_LINEUP : color [nIndex] = max (0, color [nIndex] - 1) ; break ; case SB_TOP: color [nIndex] = 0 ; break ; case SB_BOTTOM : color [nIndex] = 255 ; break ; case SB_THUMBPOSITION : case SB_THUMBTRACK : color [nIndex] = LOWORD (lParam) ; break ; default : return FALSE ; } SetScrollPos (hCtrl, SB_CTL, color [nIndex], TRUE) ; SetDlgItemInt (hWindow, nCtrlID + 3, color [nIndex], FALSE) ; HWND statichwnd = GetDlgItem (hWindow, 20) ; SendMessage(statichwnd,WM_CTLCOLOR,0, (LONG)statichwnd); return TRUE ; case WM_COMMAND: switch (wParam) { case IDOK: //MessageBeep(0); EndDialog(hWindow, wParam); return 1; case IDCANCEL: //MessageBeep(0); EndDialog(hWindow, wParam); return 1; } } return FALSE ; } // example of CtrlColorDialog usage //... // // int r =100; // int g =100; // int b =100; // HANDLE hInstance = ? <--- // substitute proper values here // HWND hwnd = ? <--- // // CtrlColorDialog ddd(1, hInstance, r,g,b); //int dresult = PerformDialog(hwnd, &ddd); // //if(dresult == CTRLCOLORDIALOG_OK) //{ // modify initial values of r, g, b variables // r =d.r(); // g =d.g(); // b =d.b(); //} // //if(dresult == CTRLCOLORDIALOG_CANCEL) //{ //do something else //} // ...