Autocheckbox von anfang an aktiviert?



  • hWndParent und ID_CHILD sind nur Platzhalter diese musst du natürlich durch
    deine eignen variablennamen ersetzen.



  • und mit was müsste ich dann beispielsweise hWndParent ersetzen? Mein hauptfenster hab ich folgendermaßen geschrieben:

    hwnd = CreateWindow (	szAppName,									// Hauptfenster		
    							szAppName,									// Titel
    							WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU		// Stil
    							| WS_THICKFRAME	| WS_MINIMIZEBOX, 
    							100,										// X-Position
    							100,										// Y-Position
    							700,								 		// Breite
    							510,										// Höhe
    							NULL, 										// übergeordnetes Fenster
    							NULL, 										// Menü
    							hInstance, 									// Programm-Kopiezähler (Programm ID)
    							NULL);										// zusätzliche Parameter
    

    und in dem befindet sich der button...



  • Tu uns und dir einen Gefallen: Ackere ein C/C++ Tutorial durch!



  • du hast doch eine wndproc in etwa so

    // erster parameter ist das fensterhandle von hauptfenster
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        static HWND hwndBtn;   // fensterhandle des buttons
    
        switch(msg)
        {
    		case WM_CREATE:
    			{
                               hwndBtn = CreateWindow( 
                                    "BUTTON",
                                    "OK",
                                    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                    100,
                                    100,
                                    100,
                                    100,
                                    hwnd,
                                    (HMENU)105,   // ID des Buttons
                                    ((LPCREATESTRUCT)lParam)->hInstance, 
                                    NULL);
    			}
    			break;
    		case WM_COMMAND:
    // usw usw usw usw usw
    

    nimm es mir nicht böse aber vorsatz für das neue jahr sollte sein ein paar winapi tutorials durchzuackern.

    [edit]
    ich war zu langsam.
    @hepi
    zwei menschen ein gedanke 😉



  • ich hab hier ein winapi tutorial (windows programmierung von petzold) und mit dem arbeite ich auch, blos leider steht da auch net alles drin...

    ich hab ich mit der id des buttons kein problem... das wüsstet ihr auch wenn ihr meine vorherigen beiträge durchgelesen hättet! (Wer lesen kann, ist klar im Vorteil)

    vielleicht steh ich grad a weng aufm schlauch (weiß auch net) aber wenn ich den fensterhandle meines buttons ( = hwndButton das wüsstet ihr auch wenn ihr meine vorherigen beiträge gelesen hättet) einsetze, also so:

    SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0);
    

    dann funktioniert das nicht wegen folgender fehlermeldung:

    error C2664: 'GetDlgItem' : Konvertierung des Parameters 2 von 'struct HMENU__ *' in 'int' nicht moeglich
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    so: ich weiß dass ich mich noch net so gut auskenne und ich bin euch ja auch sehr dankbar dass ihr mir helft, aber bevor ihr mir irgendwelche guten vorsätze vorschreibt, solltet ihr vielleicht mal lesen was überhaupt mein problem ist!!! (is nicht böse gemeint blos find ichs a weng unfair dass ihr mich gleich so anmacht)

    mein Button sieht folgendermaßen aus:

    LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	static RECT  rect;
    	static int   cxChar, cyChar;   
    	HDC          hdc;  
    	PAINTSTRUCT  ps;
    
    	switch (msg)
    	{
    	case WM_CREATE:
    		cxChar = LOWORD (GetDialogBaseUnits ());
    		cyChar = HIWORD (GetDialogBaseUnits ());
    
    		HWND  hChild, hwndButton;
    
           		hwndButton = CreateWindow (     "button",									
    										"Welle A",
    										WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
    										cxChar, 
    										cyChar * 2,
    										10 * cxChar, 
    										7 * cyChar / 4,
    										hwnd, 
    										(HMENU) 5,
    										((LPCREATESTRUCT) lParam)->hInstance, 
    										NULL);
    
    		SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
    
    // etc.
    

    so und ich will erreichen, dass der button, falls er mal vom Benutzer als ungesetzt markiert wird, wieder als gesetzt markiert wird, sobald auf einen weiteren button geklickt wird: dass hab ich folgendermaßen gemacht:

    [cpp]case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case (HMENU) 11: // Button Reset wird gedrückt

    ButtonPressed_WelleA = true; // alle Wellenzentren werden aktiviert
    ButtonPressed_WelleB = true;
    ButtonPressed_WelleC = true;
    ButtonPressed_WelleD = true;
    ButtonPressed_WelleE = true;
    ButtonPressed_WelleF = true;
    a1 = 66, b1 = 133, c1 = 66; // Wellenzentren in ihren ursprünglichen Zustand
    a2 = 50, b2 = 50, c2 = 100;
    d1 = 133, e1 = 66, f1 = 133;
    d2 = 100, e2 = 150, f2 = 150;
    SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0); // das funktioniert leider nicht, siehe oben in meinem beitrag die Fehlermeldung
    InvalidateRect(hwnd, NULL, TRUE); // das vorherige Fenster wird gelöscht
    break;

    }
    break;
    [/cpp]

    edit: falls jetzt jemand denkt, dass es daran liegt dass ich hwnd anstatt dem üblichen hWnd geschrieben hab... ich hab einheitlich hwnd geschrieben, also dürfte das nicht das problem sein.... (sorry wegen dem häufigen edit)

    Sirstefen



  • Sirstefen schrieb:

    ich hab ich mit der id des buttons kein problem... das wüsstet ihr auch wenn ihr meine vorherigen beiträge durchgelesen hättet! (Wer lesen kann, ist klar im Vorteil)

    hab alles gelesen, wollt nur nochmal hinschreiben

    Sirstefen schrieb:

    so: ich weiß dass ich mich noch net so gut auskenne und ich bin euch ja auch sehr dankbar dass ihr mir helft, aber bevor ihr mir irgendwelche guten vorsätze vorschreibt, solltet ihr vielleicht mal lesen was überhaupt mein problem ist!!! (is nicht böse gemeint blos find ichs a weng unfair dass ihr mich gleich so anmacht)

    war keine vorschrift sondern ein rat. blöd angemacht hat dich meiner meinung auch keiner. wir versuchen nur zu helfen.

    Sirstefen schrieb:

    vielleicht steh ich grad a weng aufm schlauch (weiß auch net) aber wenn ich den fensterhandle meines buttons ( = hwndButton das wüsstet ihr auch wenn ihr meine vorherigen beiträge gelesen hättet) einsetze, also so:

    SendMessage(GetDlgItem(hwndButton, (HMENU) 5), BM_SETCHECK, BST_CHECKED, 0);
    

    es ist schon richtig das hwndButton ist bzw. war den wenn du den scope verlässt wird diese wieder zerstört.
    bei GetDlgItem musst das handle der hauptfensters angeben. ⚠

    so
    [cpp]
    LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    static RECT rect;
    static int cxChar, cyChar;
    static HWND hChild, hwndButton; // somit hast du gültige handles
    HDC hdc;
    PAINTSTRUCT ps;

    switch (msg)
    {
    case WM_CREATE:
    cxChar = LOWORD (GetDialogBaseUnits ());
    cyChar = HIWORD (GetDialogBaseUnits ());

    hwndButton = CreateWindow ( "button", "Welle A",
    WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
    cxChar,
    cyChar * 2,
    10 * cxChar,
    7 * cyChar / 4,
    hwnd,
    (HMENU) 5,
    ((LPCREATESTRUCT) lParam)->hInstance,
    NULL);

    SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
    // etc.
    [/cpp]

    case WM_COMMAND: 
    		switch (LOWORD(wParam)) 
    		{ 
    		case (HMENU) 11:								              		ButtonPressed_WelleA = true;						        		ButtonPressed_WelleB = true;
    			ButtonPressed_WelleC = true;
    			ButtonPressed_WelleD = true;
    			ButtonPressed_WelleE = true;
    			ButtonPressed_WelleF = true;
    			a1 =  66, b1 = 133, c1 =  66; 							// Wellenzentren in ihren ursprünglichen Zustand
    			a2 =  50, b2 =  50, c2 = 100; 
    			d1 = 133, e1 =  66, f1 = 133;
    			d2 = 100, e2 = 150, f2 = 150;
    
    			SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
    
    			InvalidateRect(hwnd, NULL, TRUE);						// das vorherige Fenster wird gelöscht
    			break;
    		}
    		break;
    


  • hmm selbst wenn ich "static" eingeben ändert sich leider nix... die fehlermeldung kommt immer noch...



  • miller_m schrieb:

    SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
    

    siehe vorheriger post



  • ja dann kompiliert er... aber dann funktionierts im programm nicht, weil dann wieder das problem ist, dass ich nicht nur einen button hab, der "resettet" also wieder gesetzt werden soll, sondern eben sechs, die alle so ausschaun wie der eine, sich aber anhand der id und des namens (nicht "Welle A", sondern "Welle B")



  • ok das problem hat sich gelöst... du hast mich auf ne idee gebracht...

    ich hab alle buttons mit

    "hwndButton = ..." deklariert, des war mein problem

    etz hab ich sie alle anders deklariert

    mit z.b. "hwndButtonA = ..." "hwndButtonB = ..." und etz gehts, weil das programm sie unterscheiden kann

    vielen dank und sorry wenn ich vorhin ein wenig gereizt reagiert habe

    Sirstefen


Anmelden zum Antworten