Probleme mit FAQ Anleitung "unsichtbarer Dialog"
-
Hallo!
Ich möchte einen Dialog der unsichtbar startet schreiben.
Da ich das nicht mit einem modalen Dialog hinbekommen habe habe ich das hier versucht:http://www.c-plusplus.net/forum/viewtopic-var-t-is-39094.html
folgender Quellcode ist dabei herausgekommen:
class CTrayapplApp : public CWinApp { public: CTrayapplApp(); // Überladungen // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CTrayapplApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementierung //{{AFX_MSG(CTrayapplApp) // HINWEIS - An dieser Stelle werden Member-Funktionen vom Klassen-Assistenten eingefügt und entfernt. // Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN! //}}AFX_MSG DECLARE_MESSAGE_MAP() };
///////////////////////////////////////////////////////////////////////////// // CTrayapplApp Konstruktion CTrayapplApp::CTrayapplApp() { // ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen // Alle wichtigen Initialisierungen in InitInstance platzieren } ///////////////////////////////////////////////////////////////////////////// // Das einzige CTrayapplApp-Objekt CTrayapplApp theApp; ///////////////////////////////////////////////////////////////////////////// // CTrayapplApp Initialisierung BOOL CTrayapplApp::InitInstance() { // Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. #ifdef _AFXDLL Enable3dControls(); // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen #else Enable3dControlsStatic(); // Diese Funktion bei statischen MFC-Anbindungen aufrufen #endif CTrayapplDlg* dlg=new CTrayapplDlg(); dlg->Create(IDD_TRAYAPPL_DIALOG); dlg->ShowWindow(SW_SHOW); return TRUE; /* CTrayapplDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über OK zu steuern } else if (nResponse == IDCANCEL) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über "Abbrechen" zu steuern } // Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die // Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten. return FALSE; */ }
class CTrayapplDlg : public CDialog { // Konstruktion public: CTrayapplDlg(CWnd* pParent = NULL); // Standard-Konstruktor // Dialogfelddaten //{{AFX_DATA(CTrayapplDlg) enum { IDD = IDD_TRAYAPPL_DIALOG }; // HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CTrayapplDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementierung protected: void OnCancel(); HICON m_hIcon; // Generierte Message-Map-Funktionen //{{AFX_MSG(CTrayapplDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
///////////////////////////////////////////////////////////////////////////// // CTrayapplDlg Dialogfeld CTrayapplDlg::CTrayapplDlg(CWnd* pParent /*=NULL*/) : CDialog(CTrayapplDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTrayapplDlg) // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTrayapplDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTrayapplDlg) // HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTrayapplDlg, CDialog) //{{AFX_MSG_MAP(CTrayapplDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTrayapplDlg Nachrichten-Handler BOOL CTrayapplDlg::OnInitDialog() { CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt. void CTrayapplDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen 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 { CDialog::OnPaint(); } } // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer // das zum Symbol verkleinerte Fenster mit der Maus zieht. HCURSOR CTrayapplDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CTrayapplDlg::OnCancel() { DestroyWindow(); // Nicht EndDialog bzw. CDialog::OnCancel aufrufen } void CTrayapplDlg::PostNcDestroy() { PostQuitMessage(0); delete this; }
Das Problem:
Die Anwendung schliesst sich SOFORT nach dem Aufruf wieder.
Der Prozess erscheint für den Bruchteil einer Sekunde in der Prozessübersicht und terminiert sofort wieder.Was zum Henker ist mein Problem? Das ganze kompiliere ich mit Visual C++ 5.
Danke für eure Hilfe.
Schöne Grüße
adsci
-
Versuch es mal so:
BOOL CTrayapplApp::InitInstance() { // Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. #ifdef _AFXDLL Enable3dControls(); // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen #else Enable3dControlsStatic(); // Diese Funktion bei statischen MFC-Anbindungen aufrufen #endif CTrayapplDlg* dlg=new CTrayapplDlg(); dlg->Create(IDD_TRAYAPPL_DIALOG); dlg->ShowWindow(SW_SHOW); MSG msg; while(msg.message != WM_CLOSE ) { ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE ); ::AfxGetThread()->PumpMessage(); } return TRUE; /*
So sollte es gehen. Un mach Dir nichts draus, der Source unter dem von Dir angegebenen Link läuft auch bei mir nicht.
Gruß
-
hi!
danke, ja so gehts erstmal.
ich frage mich nur, was der faq eintrag bezweckt. immerhin habe ich das gleiche auch nochmal so im netz gefunden. (ganz einfacher nicht-modaler dialog)
wäre toll wenn da jemand noch was zu sagen könnte. vielleicht habe ich etwas wichtiges vergessen?
so wie es zur zeit aussieht ist der faq eintrag schlicht falsch?