mehrere eigenständige fenster



  • ich weiss absolut nicht, was ich machen soll, wenn ich den knopf drücke, das z.b bei dem anderen fenster ein text erscheint.

    habs mit globalen variablen probiert.

    das zweite fenster, also z.b in der wndproc des ersten fensters deklariert.
    z.b static HWND hWnd1;

    und ja.. geht alles nicht.



  • metapoint2011 schrieb:

    das zweite fenster, also z.b in der wndproc des ersten fensters deklariert.
    z.b static HWND hWnd1;

    Was genau soll das bringen!? Abgesehen davon is eine static variable in einer Funktion nicht global sondern lokal...



  • ja habe ich dann auch gemerkt.

    weiss nich was das bringen soll, wollte nur mal versuchen wie das alles funktioniert, das ich es schonmal weiss.



  • Ich versteh nicht ganz wo genau jetzt dein Problem liegt. Es ist dein Programm, du hast die Fenster erzeugt und kennst damit die Fensterhandles. Es ist deine WndProc, du kannst darin machen was auch immer du gerne hättest. Wenn du willst dass X passiert wenn Button Y gedrückt wird dann musst du einfach in der WndProc des Fensters auf dem sich Button Y befindet WM_COMMAND behandeln und dafür sorgen dass, wenn es Button Y war der gedrückt wurde, X passiert.



  • aba es sind doch 2 wndproc's, für jedes fenster ein eigenes.

    welche funktion muss ich denn benutzen, wenn der button gedrückt würde, um eine nachricht an die andere proc zu schicken das die z.b ein rechteck zeichnen soll?

    oder sollte ich das alles in einer proc machen?

    oder gibt es eine ganz andere lösung?



  • Ich frag dich mal folgendes: Wofür dient eine WndProc?



  • okay.. ich denke mal um dem jeweiligen fenster befehle zu geben was es machen soll und wie und wo und warum und mit was es das machen soll?



  • Die WndProc() dient als Callback. Wann immer etwas mit dem Fenster passiert (User klickt mit der Maus rum, drückt ne Taste, was auch immer) wird die WndProc() des Fensters aufgerufen um zu entscheiden was getan werden soll. Wenn du also willst dass X passiert wenn der Benutzer Y macht dann musst du eben in der WndProc() des entsprechenden Fensters checken ob Y eingetreten ist und wenn ja X auslösen...



  • aber wenn z.b Y der button ist und der in einer anderen proc als X(das was macht werden soll) ist. dann muss ich doch irgentwie eine nachricht von der proc wo y ist an die proc wo X ist schicken.

    anderst hab ichs mit einer globalen variable versucht.

    z.b static int i;

    und in der proc von X eingetragen:

    if( i == 1)
    ....das und das machen...

    und in der proc des buttons also Y

    switch(LOWORD(wParam))
    {
    case ID_DES_BUTTONS:
    i == 1;
    break;
    }

    das geht aber auch nicht.



  • Und jetzt überleg mal wann dieses if in der Proc von X aufgerufen wird...

    Abgesehen davon dass

    case ID_DES_BUTTONS: 
    i == 1; 
    break;
    

    keine Zuweisung an i ist.



  • oh ja das war ein flüchtigkeitsfehler mit der zuweiseung.

    in WM_PAINT?



  • metapoint2011 schrieb:

    in WM_PAINT?

    Wenn dus im WM_PAINT von X stehen hast dann ja. Dann überleg jetzt mal wann das WM_PAINT von X aufgerufen wird...



  • in

    switch(message)
    {
    case WM_PAINT:
    ...................
    .......
    ....
    }



  • Die Frage ist nicht wo es steht sondern wann es aufgerufen wird. Wann wird dieser Code ausgeführt?



  • achso hmm....

    weiss nicht genau auf was du hinaus willst.

    Eigentlich dann, wenn etwas gezeichnet werden soll.



  • metapoint2011 schrieb:

    Eigentlich dann, wenn etwas gezeichnet werden soll.

    ...und du erwartest ernsthaft dass Windows auf die Idee kommt dass dieses Fenster da links unten neu gezeichnet werden muss weil an Speicherstelle 0x1234 der Wert 1 geschrieben wurde?



  • hmm.. also ich habe jetzt eine gobale statische int variable mit dem namen i deklariert.

    in proc1 eine button gemacht, nach dem man darauf klickt i = 1 wird.

    in proc2 in WM_PAINT das reingeschrieben:

    case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		if(i==1)
    		{
    			TextOut(hdc, 10, 10, _T("Hallo"), 5);
    			InvalidateRect(hWnd1, NULL, TRUE);
    		}
    
    		EndPaint(hWnd1, &ps);
    		break;
    

    da geht bis jetzt noch nix.



  • Jetzt denk doch bitte nochmal drüber nach welcher Code wann ausgeführt wird...



  • hmmm... ich weiss es nicht.

    da fehlt ja noch was.

    weil mit diesem code ^^ oben, geht es erst, wenn ich den button klicke, dann auf das fenster klicke und erst wenn ich den rahmen verziehe wird es angezeigt.
    und dann flackert das noch so rum.

    und invalidateRect muss wo anderst sein.

    das heisst es fehlt noch etwas. Das fenster muss aktiviert werden? oda so?



  • so muss ich nach dem button nurnoch den rahmen verziehen und der text wird angezeigt udn flackert nichtmehr aba das is irgentwie unsinn:

    case WM_COMMAND:
    		if(i==1)
    		{
    			InvalidateRect(hWnd1, NULL, TRUE);
    		}
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		if(i==1)
    		{
    			TextOut(hdc, 10, 10, _T("Hallo"), 5);	
    		}
    
    		EndPaint(hWnd1, &ps);
    		break;
    

Anmelden zum Antworten