Probleme mit Dialogboxen und Hintergrundänderungen brauche bitte Hilfe



  • Hallo Leuts,

    habe ein Problem mit meinem Programm. Ich schreibe gerade an einer Anwendung, bestehend aus Dialogboxen. Wie schaffe ich es, wenn ich durch Drücken eines Buttons ein neues Dialogfenster öffne, das alte gleich zu schliessen? Sorry, die frage klingt zwar simpel, aber ich bin ein absolut blutiger Anfänger und habe keine Ahnung in C++ und Visual Studio. Bitte sagt mir wo ich welche Befehle eingeben muss, damit ich ein Fenster bei Knopfdruck schliessen kann, ohne dass das neu geöffnete sich mit schliesst.

    Habe noch ein weiteres Problem: brauche einen Hintergrund für meine Dialogboxen. Möchte das mit Bitmaps machen und habe auch schon welche in die Rescourcen geladen. Aus dem Buch "Visual C++ 6.0 für Einsteiger und Fortgeschrittene von Hans-Jürgen Scheibl", habe ich folgenden Text dazu gefunden, den ich wie vorgegeben unter void CProjektDlg::OnPaint() unter dem "else" eingetragen habe:

    HBITMAP hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP5));
    HDC hMemDC=CreateCompatibleDC(NULL);
    SelectObject(hMemDC,hbitmap);
    ::StretchBlt(dc.m_hDC,50,50,80,80,hMemDC,0,0,110,110,SRCCOPY);
    ::DeleteDC(hMemDC);
    ::DeleteObject(hbitmap);
    CDialog::OnPaint();
    

    folgende Fehlermeldung zeigt er mir an, wenn ich kompiliere: "dc : nicht deklarierter Bezeichner" unnd "Der linke Teil von '.m_hDC' muss eine Klasse/Struktur/Union sein" was meint das Programm damit? wie soll ich das ändern? im Buch stand nichts dazu.

    Bitte Helft mir bei den Problemen, finde sonst nirgends eine Lösung dazu.
    Vielen Dank.



  • Hi!

    Es geht ihm um diese Zeile:

    ::StretchBlt(dc.m_hDC,50,50,80,80,hMemDC,0,0,110,110,SRCCOPY);
    

    Leider hast du nur einen Ausschnitt der Funktion gezeigt, so kann ich dir nicht sagen, wie es richtig wäre.
    Aber du hast einfach keine Variable, die dc heißt. Schau weiter oben, heißt die vielleicht pDC oder so ähnlich? (Denk dran, wenns ein Pointer ist, musst du mit -> statt . arbeiten.)

    🙂



  • Danke estartu_de für deine schnelle Antwort.
    Ja, die Fehlermeldung bezieht sich auf die Zeile von ::StrechtBlt, hab vergessen das anzugeben.

    Tja, das mit dem Ausschnitt ist so eine Sache, das ist nämlich fast der gesamte Text, der in dem Buch als Beispiel angegeben ist.

    Jip, nachdem ich mir den Text nochmal angesehen habe ist mir mein Fehler aufgefallen, upsi. Das war aber auch gemein vom Autor: Die Zeile "CPaintDC dc(this); // Gerätekontext für Zeichnen" in der Datei ProjektDlg.cpp steht eigentlich unter der Zeile "if (IsIconic())" und vor "SendMessage(WM_ICONERASEBKGND..." aber der hat die einfach vor das if.. geschoben. deswegen habe ich es nicht bemerkt beim vergleich.

    Trotzdem vielen Dank für den Hinweis mit dem GANZEN Text. Beim nächsten Mal lese ich die Angaben genauer durch!

    Weisst du vielleicht auch eine Lösung zu meinem ersten Proglem?



  • Oh sorry, die Frage hatte ich übersehen. 🙄

    Du rufst einfach vor dem DoModal von dem anderen Dialog CDialog::OnCancel oder CDialog::OnOK (je nachdem, was passt) auf.



  • Vielen Dank estartu_de! Es funktioniert! 😃 😃

    juhuu, auch das mit dem Hintergrund klappt jetzt. aber leider nur bei dem ersten Dialogfeld 😞 (misst!)
    das ist der ganze text zu "CProjektDlg::OnPaint" in der Datei ProjektDlg.cpp:

    void CProjektDlg::OnPaint() 
    {
    
    	CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    	if (IsIconic())
    	{
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{	
    	CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    	HBITMAP hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP5));
    	HDC hMemDC=CreateCompatibleDC(NULL);
    	SelectObject(hMemDC,hbitmap);
    	::StretchBlt(dc.m_hDC,0,0,630,390,hMemDC,0,0,110,110,SRCCOPY);
    	::DeleteDC(hMemDC);
    	::DeleteObject(hbitmap);
    	CDialog::OnPaint();
    
    	}
    }
    

    jetzt hab ich mir gedacht (was natürlich wieder falsch war...), wenn es beim ersten funktioniert, dann kopier ich einfach den Text so wie er ist in die datei ProjektDlg2.cpp (mein zweites Dialogfenster, dass nach drücken eines Buttons vom Ersten geöffnet wird) und ändere alle entsprechenden Bezeichnungen auf ProjektDlg2 um. Hab auch unter projekt2.h das "OnPaint" deklariert, genauso wie "m_hIcon", was der Kompiler mir nämlich nach dem ersten Startversuch angemerkt hat. Trotzdem klappt es nicht.
    Was hab ich da falsch gemacht oder nicht beachtet? 😕
    Kannst du mir da bitte weiterhelfen? Danke



  • Ich vermute mal, du hast die Zeile in der MessageMap vergessen. Such mal nach WM_PAINT. 🙂
    Das Icon brauchst du übrigens nicht.

    Achja, zwei Kleinigkeiten noch, die den Antwortenden das Leben leichter machen:
    1.) Ein "es geht nicht" ist nicht wirklich hilfreich. Schreib lieber, woran du siehst, dass es nicht geht. (Es passiert nix, es kompiliert nicht, Fehlermedlung...)
    2.) Lies mal: sfds Ich habe das in beiden Posts nachgearbeitet, aber so schwer isses ja nicht. 😉



  • ich habe jetzt das On_WM_Paint() gefunden und in die entsprechende Zeile im ProjektDlg2.cpp kopiert, das sieht dann so aus:

    void CProjektDlg2::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(ProjektDlg2)
    		// HINWEIS: Der Klassen-Assistent fügt hier DDX- und DDV-Aufrufe ein
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CProjektDlg2, CDialog)
    	//{{AFX_MSG_MAP(ProjektDlg2)
    	ON_BN_CLICKED(ID_ZWEI, OnZwei)
    	ON_WM_PAINT() // <-- da habe ich es eingefügt
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

    (jetzt hab ich das mit dem syntaxcoloring mal probiert)

    ➡ aber wenn ich die Anwendung starte und das zweite Dialogfenster öffne, ist es immer noch mausgrau.



  • Läuft er denn durch OnPaint durch?
    Wenn beide gleich aussehen, sollte das doch klappen. 😕

    Du hast das auf jeden Fall an die richtige Stelle der MessageMap gepackt. 🙂



  • danke für den Hinweis, den Debug-Modus hab ich ja völlig vergessen.
    Ja, er durchläuft die Schleife.

    Hab den Fehler dann auch gefunden: während dem Debug-Modus ist mir eine Befehlszeile aufgefallen, die ich ausversehen zweimal hineingesetzt habe:

    else
    {	
    CPaintDC dc(this); // Gerätekontext für Zeichnen <--- diese Zeile habe ich jetzt gelöscht
    
    HBITMAP hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP5));
    HDC hMemDC=CreateCompatibleDC(NULL);
    SelectObject(hMemDC,hbitmap);
    ::StretchBlt(dc.m_hDC,0,0,630,390,hMemDC,0,0,110,110,SRCCOPY);
    ::DeleteDC(hMemDC);
    ::DeleteObject(hbitmap);
    CDialog::OnPaint();
    
    }
    

    jetzt funktioniert es.

    So, jetzt kann ich wieder weiter an meiner Anwendung herumprobieren.

    Möchte mich bei dir für die schnelle Hilfe und Ratschläge bedanken.
    Ich finde das Forum hier wirklich klasse. 👍
    Vielen Dank 🙂



  • Na super! 👍
    Viel Spaß noch. 🙂


Anmelden zum Antworten