Checkboxen, Focus, Zwischenablage und die Enter-Taste



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



  • Wenn ich das richtig verstehe geht es in diesem beispiel darum ausgewählten Text
    in das Clipboard zu schreiben, ich habe aber den Text doch bereits, der wird ja
    nicht vom Benutzer bestimmt. Das Beispiel ist ziemlich komplex, dadurch mal sehen
    ob ich trotzdem durchsteige.



  • Wenn der User den Text nicht bestimmt, warum willst Du dann das Clipboard vergewaltigen?

    Also, wenn mir ein Programm einfach so mirnix dirnix meine Zwischenablage überschreiben würde, würde es im selben Atemzug von der Platte verbannt werden, das kann ich Dir sagen...

    Es gibt eigentlich keinen Grund für ein Programm, ohne Befehl des Users die Zwischenablage anzufassen...

    Was willst Du tun?



  • Das Programm ist für mich, auschließlich, und damit ich weniger tippen muss,
    soll es mir den Wert automatisch in die zwischenablage schreiben, allerdings
    nur wenn die Checkbox makiert ist. Das funktioniert ja nur das schreiben in
    das Clipboard nicht.
    Und um ehrlich zu sein ich verstehe das Beispiel kein bischen, habe damit eben
    etwas experimentiert, aber ich verstehe nichtmal wie durch das kopieren in
    lpstrCopy auf einmal der Wert auch in hglbCopy stehen kann.



  • GlobalLock gibt dir doch einen Pointer auf das erste Byte des angegebenen Speicherbereichs an.
    hglbCopy, lpstrCopy zeigen also auf ein und denselben Speicher 😉

    Von der Vorgehensweise her musst du dir eben zu erst mit GlobalAlloc globalen Speicher besorgen, sodass dein String hineinpasst, dann lockst du ihn mit GlobalLock und kopierst deinen String hinein (z.B. lstrcpy). Anschließend mit GlobalUnlock die Sperre wieder aufheben und den Pointer an SetClipboardData übergeben



  • // Hier wird Speicher Global reserviert, hglbCopy ist der HANDLE auf den Speicherbereich
    hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (cch + 1) * sizeof(TCHAR)); 
    
    // Dann gelockt... lptstrCopy zeigt nun auf das erste Byte des Speicherblocks
    lptstrCopy = GlobalLock(hglbCopy); 
    
    // und mit dem Inhalt des Editfeldes beschrieben (&pbox->atchLabel[ich1] ist der Inhalt des Edit-Feldes, bzw. ein Zeiger auf das erste Byte des Inhaltes)
    memcpy(lptstrCopy, &pbox->atchLabel[ich1], cch * sizeof(TCHAR)); 
    
    // abschließend mit '\0' terminiert
    lptstrCopy[cch] = (TCHAR) 0;    // null character 
    
    // ...und wieder unlocked...
    GlobalUnlock(hglbCopy);
    

    Probier doch mal &pbox->atchLabel[ich1] durch einen Zeiger auf Deinen Text-String zu ersetzen...


Anmelden zum Antworten