Autocheckbox von anfang an aktiviert?



  • ich hab folgenden button:

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

    wie erreiche ich, dass dieser von vornherein aktivert ist? also dass das häkchen gesetzt ist?

    Vielen Dank für Anteorten Sirstefen





  • leider kenn ich mich noch net so gut aus und bin noch recht unerfahren... schreib grad mein erstes richtiges Programm in C++ für Windows.
    Könnte mir jemand sagen, was ich genau hinschreiben müsste, damit der Button gesetzt ist?
    Die Microsoft Seite hilft mir grad nicht so wirklich weiter...

    Wär echt nett, vielen Dank Sirstefen





  • Super, vielen Dank...



  • So leider hab ich nun ein neues Problem...

    ich habe einen reset button in mein programm eingefügt und wenn man auf diesen klickt sollen alle autocheckboxen die ich habe wieder gesetzt werden (egal ob sie schon gesetzt sind oder nicht) und ich mache dies in der switch-message schleife unter dem case WM_COMMAND.
    wie kann ich denn von hier aus meine autocheckbex als gesetzt deklarieren?
    mit "SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);" gehts ja nur direkt nachdem ich den button erstellt habe...
    hat jemand ne ahnung? wär echt nett! Vielen Dank schon mal Sirstefen

    hier noch der quellcode:
    [cpp]
    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;

    // hier müsste nun der Code rein, damit alle Autocheckboxen als gesetzt markiert werden!!!

    InvalidateRect(hwnd, NULL, TRUE); // das vorherige Fenster wird gelöscht
    break;
    [/cpp]



  • SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);
    funktioniert immer, sofern hwndButton gültig ist und das Handle eines Buttons ist 😉
    Also wird bei dir vermutlich hwndButton nicht oder nicht mehr gültig sein...



  • und woher weiß dann mein programm welchen button ich meine? ich hab nämlich mehrere und ich gebe ja keine id an oder so was und diese message schaut ja immer gleich aus...



  • solltest du nicht machen, jedes fenster (button, edit, usw usw) sollte ne id und ein eigenes fensterhandle besitzen.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.asp

    fensterhandle == rückgabewert
    id == 9. parameter



  • ja klar jeder button hat ja bei mir ne eindeutige id

    ich mein ja blos dass

    SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);

    keinerlei id oder sowas hat und somit meiner meinung nach nicht einem button zugewiesen werden kann wenn man es nicht direkt nach der erstellung (also bei WM_CREATE) hinschreibt...
    und ich will ja woanders einen button als gesetzt markieren....

    also zumindest seh ich keine id zuweisung bei
    SendMessage(hwndButton, BM_SETCHECK, BST_CHECKED, 0);

    weiß jemand was ich machen muss?



  • Dann hol Dir einen HWND aufgrund der ID mit GetDlgItem(hWndParent, ID_CHILD).

    SendMessage(GetDlgItem(hWndParent, ID_CHILD), BM_SETCHECK, BST_CHECKED, 0);
    

    oder

    SendDlgItemMessage(hWndParent, ID_CHILD, BM_SETCHECK, BST_CHECKED, 0);
    


  • kann ich auch was anderes als "hWndParent" schreiben? wenn ich des schreibe kommt nämlich die fehlermeldung dass ich das noch nicht deklariert habe! und wenn ich was anderes reinschreibe (z.b. "hWnd" oder "hWndButton") dann kommt die fehlermeldung dass das ein falscher Parameter sei... (es bringt auch nix wenn ich vorher "HWND hWndParent;" schreibe...)

    kann ich nicht sowas ähnliches wie hWndButton oder so schreiben?

    Danke für Antworten



  • hwndParent ist wie der name schon sagt das fensterhandle des fensters auf dem sich der button befindet.
    du hast doch bei InvalidateRect(..) auch das fenster angegeben 😕



  • ja scho klar blos bei InvalidateRect geb ich nur "hWnd" an und nicht "hWndParent"

    ich benutze "hWndParent" bisher gar nicht in meinem programm...

    und "hWnd" (so heißt auch mein hauptfenster und der button befindet sich auf dem hauptfenster) funktioniert bei "GetDlgItem" eben nicht...

    würde es funktionieren, wenn ich hWndParent irgendwo deklariere oder so? und wie müsste ich des machen? (ich hab leider hWndParent noch nie benutzt)

    between: vielen dank schonmal für eure geduld... ihr seht ja ich bin noch anfänger...



  • 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;
    

Anmelden zum Antworten