ChooseColor
-
Hallo,
ich habe mir eine eigene klasse geschrieben, in der ich den ChooseColor Dialog mit einer callback funktion aufrufe.
ich würde jetzt gerne die nachrichten abfangen, wenn der benutzer auf eine der 16 benutzerfarben klickt.
ich hab mir den dialog mal mit einem spy angekuckt, leider scheint über den farbfeldern ein staticctrl zu liegen, so das ich nicht an die id des einzelnen farbfeldes komme.
hat jemand eine idee wie ich die nachricht abfangen kann wenn ich auf das jeweilige farbfeld klicke?
-
Hallo, es ist einfacher als man denkt:
#include <windows.h> #include <commctrl.h> UINT_PTR CALLBACK CCHookProc(HWND hdlg,UINT uiMsg, WPARAM wParam, LPARAM lParam) { HWND hwndSet; POINT pt; RECT rc1; RECT rc2; int row, col; TCHAR text[32]; switch (uiMsg) { case WM_INITDIALOG: SystemParametersInfo(SPI_GETWORKAREA, 0, &rc1, 0); GetWindowRect(hdlg, &rc2); SetWindowPos(hdlg, 0, ((rc1.right-rc1.left)-(rc2.right-rc2.left))/2, ((rc1.bottom-rc1.top)-(rc2.bottom-rc2.top))/2, 0, 0, SWP_NOSIZE|SWP_NOZORDER); break; case WM_LBUTTONDOWN: #define XSPACING 26 #define YSPACING 23 hwndSet = GetDlgItem(hdlg, 0x2D0); // Grundfarben GetCursorPos(&pt); GetWindowRect(hwndSet, &rc1); if (PtInRect(&rc1, pt)) { col = (pt.x - rc1.left) / XSPACING; row = (pt.y - rc1.top) / YSPACING; wsprintf(text, "column:%d row:%d", col, row); SetWindowText(GetAncestor(hdlg, GA_ROOT), text); } hwndSet = GetDlgItem(hdlg, 0x2D1); // Benutzerdefinierte Farben GetWindowRect(hwndSet, &rc1); if (PtInRect(&rc1, pt)) { col = (pt.x - rc1.left) / XSPACING; row = (pt.y - rc1.top) / YSPACING; wsprintf(text, "column:%d row:%d", col, row); SetWindowText(GetAncestor(hdlg, GA_ROOT), text); } } return FALSE; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { CHOOSECOLOR c; COLORREF acrCustClr[16]; c.lStructSize = sizeof(c); c.hwndOwner = 0; c.lpCustColors = acrCustClr; c.Flags = CC_ANYCOLOR | CC_ENABLEHOOK | CC_FULLOPEN; c.lpfnHook = CCHookProc; c.lpTemplateName = 0; InitCommonControls(); return ChooseColor(&c); }
-

super hat einfandfrei funktioniert
danke!!!
-
ja ich hab da nochmal eine frage...
nachdem ich jetzt auf die einzelnen benutzerfarbspalten reagieren kann und das mit dem abspeichern selbiger einwandfrei klappt, würde ich gerne die zuletzt gewählte farbe der benutzerfarben beim neu erstellen des farbendialoges wieder markieren/selektieren.wie mach ich das?... ich hab nicht mal ansatzweise eine idee wie ich das bewerkstelligen könnte!

-
Das ist noch einfacher:
c.Flags = ... | CC_RGBINIT; c.rgbResult = rgbGespeichert; if (ChooseColor(&c)) { rgbGespeichert = c.rgbResult; }MSDN schrieb:
rgbResult
If the CC_RGBINIT flag is set, rgbResult specifies the color initially selected when the dialog box is created.
-
lol ja wirklich simpel,
ich dachte das rgbResult nur auf die grundfarben reagiert, wenn ich ihr einen wert übergebe.
was aber schlecht an der sache ist, wenn eine benutzerfarbe genau den wert einer grundfarbe hat, wird die grundfarbe selektiert und nicht die benutzerfarbe...