Checkboxen, Focus, Zwischenablage und die Enter-Taste



  • Ich brauche mal kurz eure Hilfe um eine kleine Anwendung etwas komfortabler zu
    machen, allerdings kenne ich mich mit der winapi nicht so gut aus.
    a) Kann mir jemand diese Zeile erklären, bzw. die Parameter

    CreateWindow("EDIT","",WS_VISIBLE|WS_CHILD|WS_BORDER,20,20,80,20,hwnd,(HMENU)ID_INPUT,((LPCREATESTRUCT)lParam)->hInstance,0);
    

    Zu dieser Zeile gehört noch eine weitere um den Wert zu bekommen, wie würde das
    aussehen wenn es mehr als ein Edit-Feld für Eingaben gäbe? Das ID_INPUT ist
    ein selbst geschriebenes Makro, so wie 2weitere für den Button und den Output

    #define ID_INPUT    1 
    #define ID_OUTPUT    2 
    #define ID_BUTTON    3
    
    UINT zahl = GetDlgItemInt(hwnd,ID_INPUT,NULL,FALSE);
    

    b) Wie kann ich einem Edit-Feld den Focus zuweisen?
    c) Wie heißt das Makro für die Enter-Taste (sind beide Enter-Tasten die gleiche oder verschiedene?)
    d) Wie kann ich eine Zahl/String in die Zwischenablage kopieren
    e) Wie kann ich eine Checkbox hinzufügen und prüfen ob sie angewählt wurde
    f) Ich hätte gerne einen Text links der Checkbox, wie bekomme ich den so hin,
    dass die Checkbox nicht auf dem Text liegt? Ich kenne nur textout ()

    Ich denke damit wäre mir schon so weit geholfen, dass ich es zusammenbekomme 🙂

    Edit:
    Also das mit dem Tastendruck hab ich soweit, allerdings gehts das nur so lange
    keine der Editboxen den Focus hat. Was muss ich denn ändern, dass dies für die
    gesamte Anwendung gilt einschließlich sämtlicher Editboxen,Checkboxen,Buttons,... ?

    // steht direkt in dem switch für die Windowsmessage
    case WM_KEYDOWN:
          switch (wParam)
           {
             case VK_RETURN:
             {
                UINT zahl = GetDlgItemInt(hwnd,ID_INPUT,NULL,FALSE);  
                UINT erg  = vielfaches(zahl);  
                SetDlgItemInt(hwnd,ID_OUTPUT,erg,FALSE);  
                return (0);  
                break;
             }
            }
          break;
    


  • deleted



  • a) CreateWindow
    Jedes Edit hat eine eindeutige ID (sollte dies haben) - diese gibst du zum Auslesen bei GetDlgItemInt an

    b) SetFocus

    c) Was für ein Makro meinst du 😕

    d) MSDN: Clipboard

    e) CreateWindow mit Fensterklasse BUTTON und dann bei den Styles BS_AUTOCHECKBOX bzw. BS_CHECKBOX mit angeben
    Zum Auslesen kannst du dann z.B. IsDlgButtonChecked verwenden

    f) Bei TextOut kannst du doch im 2. und 3. Parameter die Position angeben 😉



  • Bin mir nicht ganz sicher, aber ich meine, dass bei Enter der Button, den du mit BS_DEFPUSHBUTTON erstellt hast aktiviert wird 🕶



  • flenders schrieb:

    f) Bei TextOut kannst du doch im 2. und 3. Parameter die Position angeben 😉

    ...oder bei CreateWindow für die CheckBox einfach den Style BS_LEFTTEXT (oder aber BS_RIGHTBUTTON, je nach Geschmack) angeben...

    MSDN schrieb:

    BS_LEFTTEXT
    Places text on the left side of the radio button or check box when combined with a radio button or check box style. Same as the BS_RIGHTBUTTON style.



  • Ok danke, jetzt aber nochmal zurück zu dem Problem mit der Return-Taste wie
    kann ich das hinbekommen?
    Mit Makro meinte ich "VK_RETURN" welches ich durch ausprobieren gefunden habe 😃

    Edit:
    Ok die Checkbox bekomme ich angezeigt, aber wie bekomme ich denn den Text daneben?
    Dachte zuerst ich gebe als Text einfach die Beschriftung für den Titel ein, geht
    aber nicht. Und wie bekommt man den Haken rein beim draufklicken im mom tut sich nichts.

    CreateWindow("BUTTON","In Zwischenablage Speichern?",BS_CHECKBOX|BS_RIGHTBUTTON|WS_VISIBLE|WS_CHILD|WS_BORDER, 100,3,15,15,hwnd,(HMENU)4,((LPCREATESTRUCT)lParam)->hInstance,0);
    


  • VK_RETURN ist kein Makro, sondern ein vitual key code - hast du das mit dem BS_DEFPUSHBUTTON mal ausprobiert?

    SirLant schrieb:

    wie bekomme ich denn den Text daneben? Dachte zuerst ich gebe als Text einfach die Beschriftung für den Titel ein, geht aber nicht.

    Erhöhe einfach mal die Breite - bewirkt manchmal Wunder :p

    SirLant schrieb:

    Und wie bekommt man den Haken rein beim draufklicken im mom tut sich nichts.

    Deswegen hatte ich an erster Stelle BS_AUTOCHECKBOX genannte und nicht BS_CHECKBOX 👎



  • Stimmt auf die Autocheckbox hätt ich selbst kommen können, sorry 🤡

    Also selbst in voller größe steht rechts daneben nichts.

    Den Defpushbutton teste ich mal.

    Was sind virtual Keycodes? Dachte da stecken einfach Zahlen dahinter für jede Taste eine.

    Edit:
    Wenn ich beim erstellen bei den Styles BS_DEFPUSHBUTTON mitangebe erhalte ich nur
    ein dickeren Rahmen um den Button und auch beim drücken von Enter in den Edit-Boxen
    passiert nichts außer, dass ein Sound abgespielt wird(dieser wenn etwas nicht geht).



  • SirLant schrieb:

    Also selbst in voller größe steht rechts daneben nichts.

    Bist du dir sicher, dass du die Breite (oben 15) bei dem CreateWindow-Aufrug erhöht hast?! Zeig nochmal den veränderten Aufruf



  • Achso die Breite gilt auch für den Text?



  • SirLant schrieb:

    Was sind virtual Keycodes? Dachte da stecken einfach Zahlen dahinter für jede Taste eine.

    Genau, das sind einfach nur defines, die einem Zahlenwert einen sinvollen Namen zuweisen (siehe MSDN)



  • SirLant schrieb:

    Achso die Breite gilt auch für den Text?

    Nein, die Breite gilt für den gesamten Button (also quadratische Checkbox (immer gleich groß) plus Beschriftung)!

    Das ganze Ding ist ein Button, deshalb kann man den Haken auch setzen, wenn man auf den Text klickt.



  • Ok.
    ich habe jetzt die Checkbox mit Text, die Zwischenablage füge ich später ein,
    wenn der Rest funktioniert.
    Im moment wäre mir ziemlich wichtig, dass das mit dem Enter Funktioniert.
    Und für den setFocus, brauch ich ja das Handle des Edit-Feldes, denn mit ID_INPUT
    funktioniert es nicht. Woher bekomme ich das?



  • SirLant schrieb:

    Und für den setFocus, brauch ich ja das Handle des Edit-Feldes, denn mit ID_INPUT
    funktioniert es nicht. Woher bekomme ich das?

    SetFocus(GetDlgItem(hwnd, ID_INPUT));
    


  • SirLant schrieb:

    Und für den setFocus, brauch ich ja das Handle des Edit-Feldes, denn mit ID_INPUT
    funktioniert es nicht. Woher bekomme ich das?

    z.B. GetDlgItem



  • Ok, damit hab ich den Focus für das Feld. Jetzt fehlt nur noch das funktionieren
    der Return-Taste 😞

    Wie kann ich einen String in ein Edit-Feld schreiben? Bei der MSDN finde ich
    nichts wenn ich nach SetDlgItem suche, da es anscheinend keine Suche nach Teilstrings
    gibt 😞



  • SetDlgItemText oder auch mit SetWindowText oder durch direktes Senden von WM_SETTEXT.



  • SirLant schrieb:

    Wie kann ich einen String in ein Edit-Feld schreiben?

    Da gibt's mehrere Wege...

    SetDlgItemText
    SetWindowText



  • Ok danke 🙂

    Jetzt hab ich aber noch nen kleines Problem, während ich auf eure Antwort
    gewartet hab, habe ich mich an die Zwischenablage gewagt, allerdings kopiert
    es den Text nicht hinein, ich glaube ich habe mit dem Schreiben in die Ablage
    etwas falsch verstanden. Kann ich nicht einfach nen zeiger auf den String
    angeben?

    void CopyToClipboard (int value, HWND hwnd) {
     char item[64];
     snprintf (item,64, "%d",value);
    
     if (!OpenClipboard(hwnd))
     	return;
     if (!EmptyClipboard())
     	return;
     if (!SetClipboardData(CF_TEXT, item))
     	return;
     if (!CloseClipboard())
     	return;
    }
    


  • "Using the Clipboard" in der MSDN

    Schau Dir da mal die Beispiele "Copying Information to the Clipboard" und "Pasting Information from the Clipboard" an...


Anmelden zum Antworten