Problem mit SendMessage



  • hab folgenden Quellcode:

    (is noch alles im Hauptfenster)

    ...
    		hChild     = CreateWindow (	 szChildName,						// Child Fenster mit seinen Einstellungen
    										szChildName,
    										WS_CHILD | WS_VISIBLE | WS_DLGFRAME,
    										110,
    										10,
    										400,
    										400,
    										hwnd,
    										NULL,
    										((LPCREATESTRUCT) lParam)->hInstance,
    										NULL);
    ...
    
    ...	  
    	case WM_LBUTTONDOWN:
    
    		if (LOWORD(lParam)  >=    0   &&
    			LOWORD(lParam)  <   100   &&
    			HIWORD(lParam)  >=    0   &&
    			HIWORD(lParam)  <   100)
    
    		{
    			SendMessage(hChild, PM_START, 0, 0);
    		}
    
    		return 0;
    ....
    

    (jetzt kommt das Child Fenster)

    ...
    LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)		// Child Fenster
    {
       static RECT  rect;
       static int   cxChar, cyChar;
       HDC          hdc;
       PAINTSTRUCT  ps;
    
       // Bezeichner verkürzen, umbennen und Deklarieren von neuen
    
       switch (message)
       {
    		case WM_CREATE:
    
    			return 0;
    
    		case WM_SIZE:
    
    			rect.right  = LOWORD(lParam);
    			rect.bottom = HIWORD(lParam);
    
    			return 0;
    
    		case PM_START:
    
    			hdc = BeginPaint (hwnd, &ps);
    
    			SelectObject (hdc, GetStockObject (BLACK_PEN));	
    
    			MoveToEx  (hdc, 130, 101, NULL);		 LineTo    (hdc, 139, 101);							
                MoveToEx  (hdc, 134,  97, NULL);		 LineTo    (hdc, 134, 106);				
    
    			MoveToEx  (hdc, 263, 101, NULL);		 LineTo    (hdc, 272, 101);							
                MoveToEx  (hdc, 267,  97, NULL);		 LineTo    (hdc, 267, 106);				
    
    			MoveToEx  (hdc, 130, 201, NULL);		 LineTo    (hdc, 139, 201);							
                MoveToEx  (hdc, 134, 197, NULL);		 LineTo    (hdc, 134, 206);				
    
    			MoveToEx  (hdc, 263, 201, NULL);		 LineTo    (hdc, 272, 201);							
                MoveToEx  (hdc, 267, 197, NULL);		 LineTo    (hdc, 267, 206);				
    
    			MoveToEx  (hdc, 130, 301, NULL);		 LineTo    (hdc, 139, 301);							
                MoveToEx  (hdc, 134, 297, NULL);		 LineTo    (hdc, 134, 306);				
    
    			MoveToEx  (hdc, 263, 301, NULL);		 LineTo    (hdc, 272, 301);							
                MoveToEx  (hdc, 267, 297, NULL);		 LineTo    (hdc, 267, 306);
    
    			EndPaint (hwnd, &ps);
    
    			return 0;
    ...
    ...
    ...
    ...
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam) ;
    }
    

    also das ganze is so aufgebaut, dass ich ein child fenster hab, in dem ich eine simulation durchführen will und diese soll starten wenn ich auf einen button im hauptfenster klicke... ich bin grad dabei zu versuchen wie ich das ganze über das message system übertragen kann und komm leider nicht weiter:

    ich hab folgendes Problem:

    das mit dem SendMessage im zweiten Code Auszug funktioniert leider nicht, wenn ich da im hauptfenster draufdrück, und ich weiß nicht woran es liegt? Is der SendMessage Aufruf bzw. seine Parameter in der Klammer falsch? Oder was muss ich machen?
    Weiß jemand weiter?

    Wär echt nett, wenn ich schnelle Hilfe bekomme, da ich das Programm noch in der Woche so gut wie fertig schreiben will und ich grad wirklich nicht weiterkomme, ich bin auch noch nicht so erfahren...
    Vielen Dank für Hilfe! Sirstefen



  • Zeichnen (BeginPaint/EndPaint) bitte nur als Reaktion auf die Nachricht WM_PAINT machen.



  • hmm hilft mir leider nicht weiter, weil ich nicht genau weiß wie ich das formulieren müsste...

    nach dem "case PM_START: ..." kommt noch "case WM_PAINT: ..." in dem genau dasselbe steht und dann zeichnet er das ganze auch, aber halt von anfang an und er solls ja nur zeichnen wenn man eben auf den button klickt... (also hab ichs halt mal aus "case WM_PAINT:..." entfernt, dann macht er aber gar nix mehr... egal ob ich in dem bereich klicke wodurch er eigentlich die nachricht schicken müsste oder nicht) und wenn ich "SendMessage(hChild, WM_PAINT, 0, 0)" schreibe ändert das auch nix, weil er "case WM_PAINT:..." von anfang an durchführt



  • SendMessage(hChild, WM_PAINT, 0, 0) ist Blödsinn, weil es genau gar nichts bewirkt.

    Wenn du willst, dass dein Fenster neu gezeichnet wird, ist InvalidateRect() die Funktion deiner Wahl. 🙂
    Den Rest macht Windows; mit UpdateWindow kannst du es beschleunigen (wenn das Neuzeichnen sofort geschehen muss).



  • Also tu alles was du zeichnest in den WM_PAINT Handler. Was gezeichnet werden soll bestimmst du durch ein Flag "ButtonPressed". Und dann machst du bei WM_LBUTTONDOWN:

    case WM_LBUTTONDOWN:
        if(...)
        {
            ButtonPressed = true;
            InvalidateRect(hwnd, NULL, TRUE);
        }
        return 0;
    

    Und dann bei WM_PAINT:

    case WM_PAINT:
        BeginPaint(...);
        if(ButtonPressed)
        {
            // zeichnen
        }
        EndPaint(...);
        return 0;
    


  • es funktioniert...
    Vielen Dank schonmal

    Des problem is blos dass ich im hauptfenster einen button habe:

    hwndButton = CreateWindow (		"button",									// Start Button mit seinen Einstellungen
    										"Start",
    										WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    										cxChar * 28, 
    										cyChar * 26,
    										6 * cxChar, 
    										7 * cyChar / 4,
    										hwnd, 
    										NULL,
    										((LPCREATESTRUCT) lParam)->hInstance, 
    										NULL);
    

    und dass es starten soll wenn man auf diesen button klickt.... jetzt is es aber so dass ich wenn ich auf irgendeinen bereich (den ich festlege) in meinem hauptfenster klicke, startet es, blos wenn ich diesen bereich auf den button lege dann funktioniert es leider nicht weil der button ja über dem bereich liegt...
    hast du ne ahnung wie ich die if schleife schreiben muss damit es passiert wenn auf den button geklickt wird?



  • hi,
    Musst in die Nachrichtenschleife deines Hauptfensters auf WM_COMMAAND reagieren.

    case WM_COMMAND:
    		switch (LOWORD(wParam))
    		{
    		case ID_DES_BUTTON:
    			//Tue was du willst;
    			break;
             break;
    

    MfG schirrmie



  • super es geht

    vielen vielen dank für die mühen Sirstefen


Anmelden zum Antworten