mehrere fenster

dark80

Grünschnabel
hallo leute,

habe mir ein kleines programm mit menu, editboxen, eingabefeldern, buttons, usw... geschrien. alles funkt einwandfrei.
jetzt will ich aus eine menu punkt eine neues fenster öffnen.
im welchem ich dann auch editboxen und eingabefelder habe.
ich versuche es schon seit eingen tagen auf die beine zu stellen... vergebens :(
kenne jemand ein tuto. ?
oder ein denkansatz wie ich vorgehen könnte.

thx.
 
Also erstmal bitte Gross/Kleinschreibung beachten!
Dann wäre es natürlich noch schön, wenn Du uns dein verwendetes Framework sagen würdest. Dazu vielleicht noch ein bisschen Quellcode, und schon könnten wir Dir helfen.
 
Also das mit der Gross/Kleinschreibung läßt sich einrichten. ;-)

Ich entwickle mein Programm mit der Win32 API.
Alles unwichtige habe ich aus dem code entfernt. :)
Wie schon gesagt, das Programm läuft gut. Ich will noch zusätzlich ein Options Menu einbauen.
Wie bei Skype oder alle anderen Programmen. Wenn man im Menu auf Optionen Klickt, öffnet sich ein neues Fenster in welchem man alles so ändern kann wie es einem paßt.

Im Quellcode ist bis jetzt nur das Hauptfenster mit dem Dialog (ressource) vorhanden.

Der Quellcode:

HTML:
LRESULT CALLBACK WndProc( );
BOOL CALLBACK DlgProc( );

int WINAPI() {
        ....
        RegisterClass( &wndclass );
        ....
      	while( GetMessage( &msg, NULL, 0, 0 ) ) {
		if( child_hwnd == 0 || !IsDialogMessage( child_hwnd, &msg ) ) {
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}
}

LRESULT CALLBACK WndProc( ) {
        switch( message ) {
                case WM_CREATE:
                        child_hwnd = CreateDialogParam( ( ( LPCREATESTRUCT ) lParam               )->hInstance, szTitle, hwnd, DlgProc, 0 );
			.......
                        PopFileInitialize( hwnd );	
			return 0;

		case WM_SETFOCUS:
			SetFocus( child_hwnd );

		case WM_PAINT: {
			hdc = BeginPaint( hwnd, &ps );
			GetClientRect( hwnd, &rect );
                        ....
			EndPaint( hwnd, &ps );
			return 0;
		}

		case WM_COMMAND:
			hmenu = GetMenu( hwnd );
			switch( LOWORD( wParam ) ) {
				case ID_FILE_NEW:
					.....
				case ID_FILE_OPEN:
					.....
                                .....
				case ID_OPTION_DEVICE:
					// öffne fenster mit einstellungen
			}
                        return 0;

		case WM_CLOSE:
                        ...........
		case WM_QUERYENDSESSION:
			....
		case WM_DESTROY:
			PostQuitMessage( 0 );
			return 0;
	}
	return DefWindowProc(  );
}

// dialog...
BOOL CALLBACK DlgProc( ) {
	HDC hdc;
	PAINTSTRUCT ps;
	TEXTMETRIC tm;

	switch( message ) {
		case WM_CREATE:
                        ....
		case WM_SETFOCUS:
			SetFocus( GetDlgItem( child_hwnd, IDC_DLGWINDOW_ID )) ;
			return 0;

		case WM_INITDIALOG:
			CheckRadioButton( child_hwnd, IDC_RADIO1, IDC_RADIO3, IDC_RADIO2 );
			return 0;

		case WM_PAINT: {
			hdc = BeginPaint( child_hwnd , &ps );
			
			for( int i = 0; i < 4; i++ ) 
				paint_rectangle( child_hwnd, srechteck[i], i );
			
			show_text( hdc, child_hwnd );
			EndPaint( child_hwnd, &ps );
			return 0;
		}

		case WM_COMMAND:
			switch( LOWORD( wParam ) ) {	
				case IDC_BUTTON_START: 
					// check und auslesen der eingabefelder..
					
					InvalidateRect( child_hwnd, 0, TRUE );
					return 0 ;
				}
				return 0;
				case IDC_BUTTON_STOP:
                                        ...
					return 1;
			}
	}
	return 0;
}
thx
dark80
 
Um einen Dialog aus einer Resource heraus anzuzeigen nutzt man einfach die Funktion

C++:
INT_PTR DialogBox(          HINSTANCE hInstance,
    LPCTSTR lpTemplate,
    HWND hWndParent,
    DLGPROC lpDialogFunc
);

Und benutzt wird das ganze so (angenommen du hast in den Resourcen ein Dialog "ID_DIALOG")

C++:
BOOL CALLBACK DlgProc(.....);

int WINAPI WinMain(HINSTANCE hInst, .....)
{
  DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG), NULL, DlgProc);
   ....
}

Und schon wird der Dialog angezeigt :D

Der 3. Parameter ist das Parent Window, also hier dann einfach deinen HWND Wert angeben.
 
Danke für die schnellen Antworten. Das Problem konnte ich aber immer noch nicht ganz Beseitigen.
Wenn ich die Funktion in die WinMain() einsetze, öffnet sich das Fenster gleich beim Start des Programms.
Habe nun versucht die Funktion dort zu plazieren wo ich sie meiner Meinung nach brauche.
Nach dem Klick im Menu->Options.

HTML:
CALLBACK WndProc() {
   ... 
   switch( message ) {
   ....
      case ID_OPTION_DEVICE:
           DialogBox( ((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(ID_DIALOG), phwnd, TabProc);

Wobei TabProc = BOOL CALLBACK TabProc(..) .

Nach dem Aufruf schürzt das Programm ab. :(

So sieht die TabProc aus.
HTML:
BOOL CALLBACK TabProc() {
	switch( message ) {
		case WM_CREATE: 
                         // einfache ausgabe...
			return 0;
	
		case WM_DESTROY:
			PostQuitMessage( 0 );
			return 0;
	}
	return DefWindowProc( child2_hwnd, message, wParam, lParam );
}

Was mache ich hier falsch? An diesem Punkt war ich schon einmal.
 
Die Callback eines Dialoges sieht anders aus, als die eines Fensters.
Es fängt damit an, dass du entweder TRUE oder FALSE zurück gibst.
TRUE gibt man beim Beenden des Dialogs zurück, dazu muss man noch die Funktion
EndDialog(...) aufrufen.
WM_CREATE gibts bei Dialogen nicht. Nutze anstelle WM_INITDIALOG.

C++:
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
    case WM_INITDIALOG: // anstelle von WM_CREATE
      ...
      break;
    case WM_CLOSE:
      EndDialog(hDlg, 0);
      return TRUE;
      break;
  }
  return FALSE;
}
 
Hallo,

...die letzten Tage habe konnte ich nicht ins Inet.
Ich habe alle Aenderungen vorgenommen, leider geht es immer noch nicht.
Im meinem Programm habe ich 2 Dialog. Denn "main" Dialog, welcher gleich als erster ausgefuehrt wird und denn 2, der erst nach Aufforderung gestartet werden soll.
Wenn ich versuche denn Dialog außerhalb von denn ersten Dialog zu starten, Funktioniert das. Innerhalb vom "main" Dialog aber nicht.
Hier stuerzt das Programm immer ab.

*verzweifelt*

thx
 
Hi,

zeig mal bitte etwas von deinem Code.
Was gibst du als Parent Window an?
Und schau mal, ob du irgendwelche Variablen änderst, auf die der andre Dialog auch zugreift.
 
dlg1hwnd wird ohne Probleme gestartet.
Ich habe schon fast alles aus der TabProc und DlgProc entfernt dass eine Fehler verursachen koennte.

HTML:
...
LRESULT CALLBACK WndProc() {
    switch( msg ) {
        case WM_SIZE:
            return 0;
        case WM_CREATE:
            hInst = ((LPCREATESTRUCT)lParam)->hInstance;
            dlg1hwnd = CreateDialogParam( hInst, MAKEINTRESOURCE( IDD_DIALOG1 ), hwnd, DlgProc, 0 );
            return 0;
        case WM_SETFOCUS:
            SetFocus( dlg1hwnd );
        case WM_PAINT:
            ... // diverse routinen...
            return 0;
        case WM_COMMAND:
            hmenu = GetMenu( hwnd );
            switch( LOWORD( wParam )) {
                case ID_FILE_OPEN:
                    return 0;
                case ID_OPTIONS:
                    DialogBox( hInsta, MAKEINTRESOURCE( IDD_DIALOG2 ), hwnd, TabProc ):
            }
            return 0;
        ....
return DefWindowProc( hwnd, msg, wParam, lParam ):
}

BOOL CALLBACK DlgProc( dlg1hwnd, .. ) {
    switch( msg ) {
        case WM_INITDIALOG:
            return FALSE;
     }
    return FALSE;
}

BOOL CALLBACK TabProc( dlg2hwnd, .. ) {
    switch( msg ) {
        case WM_INITDIALOG:
            return FALSE;

        case WM_PAINT:
            return FALSE:

        case WM_CLOSE:
            EndDialog(  dlg2hwnd, 0 );
            return TRUE;
     }
    return FALSE;
}
 
um ein fehler von dialog seite auszuschließen kannst du ja statt "IDD_DIALOG2" nochmal "IDD_DIALOG1" verwenden..
 
Zurück