Message zu Parent funktioniert nicht
-
Servus an Alle,
Habe folgendes Problem und zwar will ich über ein Child Window die Farbe eines Dialogs ändern nur leider erkennt dieser meine Message erst gar nicht an. Vieleicht sieht jemand meinen Fehler oder kann um diesen "bug" herum coden.
#include <windows.h> const char szChildName[] = "Farbtabelle"; const UINT WM_COLORCHANGED = WM_APP + 1; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; char szAppName[] = "Das Child Window"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.hIcon = NULL; wc.lpfnWndProc = ChildProc; wc.lpszClassName = szChildName; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int i; static RECT rect; static int iAnzFarben; const int iKasten = 12; const int iKastenOffset = 15; switch (message) { case WM_SIZE: { rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); iAnzFarben = (rect.right / iKastenOffset) - 2; return 0; } case WM_LBUTTONDOWN: { int d=0, e=0; for (i = 0; i < iAnzFarben; i++) { if (15 + i * iKastenOffset <= LOWORD(lParam) && 15 + i * iKastenOffset + iKasten >= LOWORD(lParam) && rect.bottom / 2 - iKasten / 2 <= HIWORD(lParam) && rect.bottom / 2 - iKasten / 2 + iKasten >= HIWORD(lParam)) { int iColor = 255 * i / (iAnzFarben - 1); PostMessage(GetAncestor(hWnd,GA_PARENT), WM_COLORCHANGED,//#####WM_COLORCHANGED ist die Message an den Dialog RGB(iColor, iColor, iColor), 0); MessageBox(hWnd,"hu","at color",MB_OK); d=1; return 0; } if (d==0&&e==0) { MessageBox(hWnd,"hu","at child",MB_OK); e=1; } } return 0; } case WM_PAINT: { HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hWnd, &ps); { for ( i = 0; i < iAnzFarben; i++) { int iColor = 255 * i / (iAnzFarben - 1); HBRUSH hOldBrush = (HBRUSH) SelectObject(hDC, CreateSolidBrush(RGB(iColor, iColor, iColor))); Rectangle(hDC, 15 + i * iKastenOffset, rect.bottom / 2 - iKasten / 2, 15 + i * iKastenOffset + iKasten, rect.bottom / 2 - iKasten / 2 + iKasten); DeleteObject(SelectObject(hDC, hOldBrush)); } } EndPaint(hWnd, &ps); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { const UINT WM_COLORCHANGED = WM_APP + 1; static HWND hChild; static RECT rect; static int iColor = RGB(255, 255, 255); switch (message) { case WM_CREATE: { GetClientRect(hWnd, &rect); hChild = CreateWindow( szChildName, NULL, WS_CHILD | WS_VISIBLE | WS_DLGFRAME, 50, rect.bottom - 105, rect.right - 10, 30, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0; } case WM_SIZE: { rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); MoveWindow(hChild, 50, rect.bottom - 105, rect.right - 10, 30, TRUE); return 0; } case WM_COLORCHANGED://#####hier sollte die Message bearbeitet werden //doch leider kompiliert er erste gar nicht.Stattdessen: /* [C++ Error] File1.c(167): E2313 Constant expression required [C++ Error] File1.c(167): E2172 Duplicate case [C++ Error] File1.c(173): E2128 Case outside of switch [C++ Error] File1.c(173): E2188 Expression syntax [C++ Warning] File1.c(195): W8070 Function should return a value [C++ Warning] File1.c(195): W8004 'WM_COLORCHANGED' is assigned a value that is never used [C++ Error] File1.c(196): E2040 Declaration terminated incorrectly [C++ Error] File1.c(197): E2190 Unexpected*/ { iColor = wParam; InvalidateRect(hWnd, NULL, FALSE); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint(hWnd, &ps); { HBRUSH hOldBrush = (HBRUSH) SelectObject(hDC, CreateSolidBrush(iColor)); Rectangle(hDC, 0, 0, rect.right, rect.bottom); DeleteObject(SelectObject(hDC, hOldBrush)); } EndPaint(hWnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }Bin um jede Hilfe erfreut

-
das hier:
PostMessage(GetAncestor(hWnd,GA_PARENT), WM_COLORCHANGED, RGB(iColor, iColor, iColor), 0);wird zu:
PostMessage(GetParent(hWnd), WM_COLORCHANGED, RGB(iColor, iColor, iColor), 0);
-
Danke,
aber leider funktioniert es immernoch nicht,
er liefert immernoch die gleichen Fehler, und wenn ich es wieder ausklammer tut wieder alles(bis auf die msg eben)
-
Also VC++ schluckt diesen Code so ohne Probleme. Aber versuche es anstelle von const UINT mal über ein #define

-
du hast die konstante auch zweimal definiert und sie wird bei jedem verlassen des scopes zerstört bzw. beim eintritt wieder erstellt. lösche sie mal aus der wndproc.
-
Naja als Const hat des auch nix gebracht, flenn
Mit einfacher ini auch nicht....Aber jetzt fiel mir gerade auf was das Problem ist.
Denn flenders meinte bei ihm tut des mit vc++.
bei mir nun auch da ich statt c nun c++ compiler verwende, sorry.
Leichtsinnsfehler (oder nur blöd wenn man c anclickt....)Vielend dank trotzdem
-
warum kein sendmessage()?
-
Nach meiner Änderung funktioniert es mit Digital Mars (Compiler) auch...