2 Fragen : Wert in Dialog speichern und 2 Windows Fenster öffnen



  • Also,

    ich hab hier den VC++ 6 und habe mir einen Dialog erstellt in dem ein Eingabefeld IDC_EDIT1 ist, wen sich dieser Dialog öffnet möchte ich in diesem Feld eine etwas ausgeben bei case WM_INITDIALOG: , ich hab es schon per SetWindowText versucht usw. komme nicht zu einem Ergebnis.

    Meine 2 Frage ist, wen ich ein normales Programm schreibe habe ich ein Fenster, was für Änderungen müsste man vornehmen wen ich 2 Fenster haben möchte beim Start des Programm, das jeder dann seine eigene Window Prozedur hat ist klar, ich möchte dann nämmlich beispielsweise in ein Textfeld etwas eingeben und dann einen button drücken, danach sollte der Wert in einem Textfeld im zweiten Fenster erscheinen. Muss ja irgendwie machbar sein alles...



  • ich hab hier den VC++ 6 und habe mir einen Dialog erstellt in dem ein Eingabefeld IDC_EDIT1 ist, wen sich dieser Dialog öffnet möchte ich in diesem Feld eine etwas ausgeben bei case WM_INITDIALOG: , ich hab es schon per SetWindowText versucht usw. komme nicht zu einem Ergebnis.

    SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), "dein Text");
    //oder
    SetDlgItemInt(hDlg, IDC_EDIT1, 815, TRUE);// nur für Zahlen (hier 815)
    //oder
    SetDlgItemText(hDlg, IDC_EDIT1, "dein Text");
    

    Meine 2 Frage ist, wen ich ein normales Programm schreibe habe ich ein Fenster, was für Änderungen müsste man vornehmen wen ich 2 Fenster haben möchte beim Start des Programm, das jeder dann seine eigene Window Prozedur hat ist klar, ich möchte dann nämmlich beispielsweise in ein Textfeld etwas eingeben und dann einen button drücken, danach sollte der Wert in einem Textfeld im zweiten Fenster erscheinen. Muss ja irgendwie machbar sein alles...

    ganz einfach: zwei verschiedene Fensterlassen registrieren (es muss nur der Klassenname und in deinem Fall halt die WndProc-Adresse zwischen den beiden RegisterClass-Aufrufen geändert werden), zwei Fenster (von jeder Klasse eins!) erstellen (evtl. eins als Child des anderen, sonst hast du auch zwei Einträge in der Taskleiste).

    Für die Übergabe der Variable muss das eine Fenster das Handle des anderen kennen. Dies könnte man zum Beispiel noch in WinMain, nachdem beide Fenster erstellt wurden, mit einer "application-defined" Nachricht machen. Genauso kriegst du die Variable beim Buttonclick in die WndProc dss anderen Fensters.



  • Das mit den 2 Fenstern ist wirklich ganz einfach, solange man das ShowWindow und UpdateWindow nicht vergisst 🙂

    Für den Tipp mit dem Dialog möchte ich mich bedanken, funktioniert wunderbar.

    Nur noch eins :

    "application-defined" Nachricht ich finde dazu nichts, könntest du mir da weiter helfen, wie ich das machen könnte.



  • Du legst dir einfach eine eigene Nachricht fest (die nur dein Programm versteht). Windows verwendet Nachrichten die bis zu einem Wert gehen, der durch WM_USER (=0x0400) defniniert wurde. Du kannst dir jetzt zum Beispiel die Nachricht WM_SENDWINDOWHANDLE definieren und dieser dann als WPARAM dein Windowshandle mitschicken.

    #define WM_SENDWINDOWHANDLE WM_USER+0 /*diese Nachricht kann weder Windows, noch irgendein anderes Programm korrekt verarbeiten, weil sie "Application-Defined" ist*/
    

    Wenn du noch mehr Nachrichten brauchst, für die selbe WindowProc, dann erhöhst du einfach den Wert nach WM_USER (+1, +2, +3, ...)



  • Das ist heute mein Tag,

    ich habe :

    Windows Prozedur 1
    {
    Hier hab ich einen button ( hbutton )
    WM_COMMAND :
    if(lParam == (LPARAM) hbutton)
    {
    if(HIWORD(wParam) == BN_CLICKED)
    // CODE
    }
    return 0;
    // WEITERER CODE
    }

    Windows Prozedur 2
    {
    // HIER HABE ICH EIN EDITFELD namens HEdit
    }

    Button wird geklickt, Nachricht senden an HEdit in Window Prozedur 2 , z.B. gebe "Hallo" aus.

    Du hast von den etwas mehr Ahnung da ich grad wieder Anfange mit WIN API , also ich wär dir sehr dankbar für einwenig CODE.

    THX



  • das unter die Header-Includes:

    #define WM_SENDWINDOWHANDLE WM_USER+0
    #define WM_SHOWSTRING WM_USER+1
    

    dann nach dem erstellen beider Fenster (in WinMain)

    SendMessage(hwnd1, WM_SENDWINDOWHANDLE, (WPARAM)hwnd2, 0);// damit Fenster1 Fenster2 kennt
    

    in die WndProc1 muss dann noch eine statische Variable (man könnte auch hwnd2 global machen, dann spart man sich auch den SendMessage Aufruf in WinMain, aber global is ja nix 😉 )

    static HWND hwnd2=NULL;
    

    und die Nachrichtenbearbeitung von WM_SENDWINDOWHANDLE

    case WM_SENDWINDOWHANDLE:
        hwnd2=(HWND)wParam;// im wParam steht das Handle, siehe SendMessage in WinMain
    return 0;
    

    so, dann in WndProc1, da wo bei dir "// Code" steht

    SendMessage(hwnd2, WM_SHOWSTRING, (WPARAM)"dein String", 0);//wird beim Buttonclick ausgeführt
    

    und in WndProc2 die Nachrichtenbearbeitung von WM_SHOWSTRING

    case WM_SHOWSTRING:
        SetWindowText(HEdit, (TCHAR*)wParam);//im wParam steht der String, siehe SendMessage, beim Buttonclick
    return 0;
    

    ich hoffe ich hab jetzt nix vergessen, sag Bescheid, wenns Fehler gibt
    Viel Spaß damit



  • Jetzt klappt es wunderbar, dank deinem Code ( Wie soll man den auf sowas kommen , wen man das noch nie gemacht hat , tzzz 😉 )

    Danke dir


Anmelden zum Antworten