Verstehe Programm nicht



  • Ich habe in einem Beitrag ein Programm gefunden, das mein Problem lösen würde.
    Es minimiert das Dialogfenster und zeigt im ray den Icon an.
    Dsa minimieren klappt auch, aber den Programmteil zu maximieren verstehe ich nicht.
    Kann mir jeand sagen wo der Programmteil zum maximieren hin muß, oder muß noch was eingebunden werden.
    ---Ich hab keineAhnung---

    Ist mit dem VC++ mit Assistenten gemacht.

    Hier mal das Prog

    minimieren: (Wird aus einem Timer aufgerufen)

    void CMessengerDlg::Icon() 
    { 
        char    toolTip[64]; 
    
        NOTIFYICONDATA tnd; 
        ShowWindow(SW_HIDE); 
        ZeroMemory(&tnd, sizeof (NOTIFYICONDATA)); 
        tnd.cbSize = sizeof (NOTIFYICONDATA); 
        tnd.hWnd = this ->m_hWnd; 
        tnd.uID = 1; 
        tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; 
        tnd.uCallbackMessage = m_WMChatMessage; 
        tnd.hIcon = (HICON) LoadImage(AfxGetApp()->m_hInstance, 
        MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON, 
        32,32,LR_SHARED|LR_DEFAULTCOLOR); 
        tnd.szTip[*toolTip]; 
        lstrcpyn(tnd.szTip,"Nachrichtensystem",sizeof(tnd.szTip)); 
        Shell_NotifyIcon(NIM_ADD,&tnd); 
    
    }
    

    maximieren:

    LRESULT CMessengerDlg::OnShowDlg(WPARAM wParam, LPARAM lParam) 
    { 
        if (lParam == WM_LBUTTONDOWN) 
        { 
            ShowWindow(SW_SHOW); 
                NOTIFYICONDATA    tnd;         
                tnd.cbSize = sizeof(NOTIFYICONDATA);     
                tnd.hWnd = this ->m_hWnd;   
                tnd.uID = 1;   
                tnd.uFlags = NIF_MESSAGE|NIF_ICON; 
                tnd.uCallbackMessage= m_WMChatMessage;   
                tnd.hIcon = 0; 
                tnd.szTip[0] = '\0';     
                Shell_NotifyIcon(NIM_DELETE,&tnd); 
                return 1; 
        } 
    
        return 0; 
    }
    

    Vielen Dank schon mal.



  • Hi,
    wie ich das durchschaue steht der Code zum Maximieren schon da, es handelt sich dabei um die 2 Funktion. Das Problem dürfte sein, dass die Funktion nicht aufgerufen wird, wenn du sie mit dem Anwendungsassistenten erstellt hast, da eine benutzerdefinierte Nachricht zum Einsatz kommt.
    Ich versuche einfach mal zu korrigieren:

    tnd.uCallbackMessage = m_WMChatMessage;
    

    Hier wird die Nachricht festgelegt, die gesendet wird, wenn der Cursor ueber das Icon in der Taskleiste faehrt. Dein Eintrag verstehe ich nicht 😃 eine Variable in dem Sinn erscheint mir dort fehl am Platz.
    Ich haette das so geloest:

    m_NotifyIcon.uCallbackMessage = WM_SYSTRAY;
    

    und am Anfang der Datei noch die Definition

    #define WM_SYSTRAY WM_APP + 1
    

    Damit Sollte die entsprechende Nachricht gesendet werden.
    Jetzt muss sie noch zu der Funktion geleitet werden.
    Dazu musst du sie manuell eintragen, das sieht dann so aus:

    BEGIN_MESSAGE_MAP(CSystemTrayDlg, CDialog)
    	//{{AFX_MSG_MAP(CSystemTrayDlg)
    ...
    	ON_MESSAGE(WM_SYSTRAY, OnShowDlg)
    ...
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

    Btw haette ich die Variable vom Typ NOTIFYICON als Membervariable deklariert, so kann man sich die 2. Deklaration sparen

    Shell_NotifyIcon(NIM_DELETE, &m_tnd);
    

    So muesste es aber auch gehen.

    Hoffe ich konnte helfen
    Gruss,
    DeSoVoDaMu



  • Geht leider nicht, bekomme immer Fehlermeldung:

    Kompilierung läuft...
    OnlinetimerDlg.cpp
    C:\Dokumente und Einstellungen\Markus\Desktop\Onlinetimer\OnlinetimerDlg.cpp(62) : error C2065: 'OnShowDlg' : nichtdeklarierter Bezeichner
    C:\Dokumente und Einstellungen\Markus\Desktop\Onlinetimer\OnlinetimerDlg.cpp(62) : error C2440: 'type cast' : 'int ' kann nicht in 'long (__thiscall CWnd::)(unsigned int,long)' konvertiert werden
    Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
    Fehler beim Ausführen von cl.exe.

    Onlinetimer.exe - 2 Fehler, 0 Warnung(en)

    Wenn ich den Aufruf wegmache Compilert er ohne Fehler.

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    // Keine Nachrichten-Handler
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_SYSTRAY, OnShowDlg) // Hier liegt der Fehler

    END_MESSAGE_MAP()



  • Hm, da koennte ich jetzt nur Vermutungen anstellen:
    Wie es aussieht ist die Funktion nicht bekannt. Ich verstehe nicht, warum du den Eintrag in der Message Map zum About Dlg machst. Du willst das Tray Icon doch sicherlich für das Hauptfenster haben. Ansonsten kann es noch sein, dass du die Funktion umbenannt hast, dann musst du hier

    ON_MESSAGE(WM_SYSTRAY, OnShowDlg/*<---hier*/)
    

    natürlich auch den Namen ändern.
    Zu dem zweiten Fehler kann ich dir keine Auskunft geben, du müsstest mir exakt die Zeile posten, die den Fehler enthält.
    Gruss,
    DeSoVoDaMu



  • Nein umbenannt hab ich die Funktion nicht.
    Die zwei Fehler sind exakt in der Zeile:

    ON_MESSAGE(WM_SYSTRAY, OnShowDlg)

    Fehlermeldung:

    OnlinetimerDlg.cpp
    C:\Dokumente und Einstellungen\Markus\Desktop\Onlinetimer\OnlinetimerDlg.cpp(62) : error C2065: 'OnShowDlg' : nichtdeklarierter Bezeichner
    C:\Dokumente und Einstellungen\Markus\Desktop\Onlinetimer\OnlinetimerDlg.cpp(62) : error C2440: 'type cast' : 'int ' kann nicht in 'long (__thiscall CWnd::)(unsigned int,long)' konvertiert werden
    Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
    Fehler beim Ausführen von cl.exe.

    Onlinetimer.exe - 2 Fehler, 0 Warnung(en)



  • Das ist doch in der Headerdatei so:

    LRESULT OnShowDlg(WPARAM wParam, LPARAM lParam)
    

    oder ?



  • // OnlinetimerDlg.h : Header-Datei
    //
    
    #if !defined(AFX_ONLINETIMERDLG_H__2167DE3F_FBCA_4DF5_A72B_0A376DAE308B__INCLUDED_)
    #define AFX_ONLINETIMERDLG_H__2167DE3F_FBCA_4DF5_A72B_0A376DAE308B__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // COnlinetimerDlg Dialogfeld
    
    class COnlinetimerDlg : public CDialog
    {
    // Konstruktion
    public:
    	LRESULT OnShowDlg(WPARAM wParam, LPARAM lParam);
    	Icon();
    

    Ist wohl richtig da



  • Karl der Käfer schrieb:

    Geht leider nicht, bekomme immer Fehlermeldung:

    ...

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //<-- Hier sieht man, dass das die falsche Stelle ist
    	//{{AFX_MSG_MAP(CAboutDlg)
    		// Keine Nachrichten-Handler
    	//}}AFX_MSG_MAP
    ON_MESSAGE(WM_SYSTRAY, OnShowDlg) // Hier liegt der Fehler
    
    END_MESSAGE_MAP()
    

    Was DeSoVoDaMu schon gesagt hat, Du hast die FALSCHE MessageMap bearbeitet!
    Die Zeile

    ON_MESSAGE(WM_SYSTRAY, OnShowDlg)
    

    Muss in die MessageMap von Deinem richtigen Dialog und nicht vom CAboutDlg



  • Ich glaub ich blick nicht durch.
    Meinst Du hier?

    /////////////////////////////////////////////////////////////////////////////
    // COnlinetimerApp
    
    BEGIN_MESSAGE_MAP(COnlinetimerApp, CWinApp)
    //{{AFX_MSG_MAP(COnlinetimerApp)
    // HINWEIS - Hier werden Mapping-Makros vom Klassen-Assistenten eingefügt und entfernt.
    //    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
    //}}AFX_MSG
    ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    
    ON_MESSAGE(WM_SYSTRAY, OnShowDlg)
    
    END_MESSAGE_MAP()
    

    Und die Anweisung

    #define WM_SYSTRAY WM_APP + 1
    

    auch hier rein oder?



  • Ich hab es jetzt mal hier rein gesetzt und bekomme auch keine Fehlermeldung mehr.

    BEGIN_MESSAGE_MAP(COnlinetimerDlg, CDialog)
    	//{{AFX_MSG_MAP(COnlinetimerDlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_WM_TIMER()
    	ON_BN_CLICKED(IDC_SET, OnSet)
    	//}}AFX_MSG_MAP
    	ON_MESSAGE(WM_SYSTRAY, OnShowDlg)     //Jetzt hier
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // COnlinetimerDlg Nachrichten-Handler
    
    BOOL COnlinetimerDlg::OnInitDialog()
    {
    

    allerdings kann ich das Fenster nicht maximieren.



  • Na wenn das Tray Icon schonmal geht ist das doch was. Allerdings versteh ich einwas nicht:

    class COnlinetimerDlg : public CDialog 
    { 
    // Konstruktion 
    public: 
        LRESULT OnShowDlg(WPARAM wParam, LPARAM lParam); 
        Icon()/*<--hier fehlt doch der Funktiontyp*/;
    

    bei mir würde das nicht mal kompliliert werden (ein Konstruktor ist es ja nicht). Aber das nur nebenbei, wegen deinem Maximieren Problem: ist denn das Symbol zum Maximieren deaktiviert oder passiert einfach nur nichts, wenn man darauf klickt? Prinzipiell hab ich ja nichts geschrieben, was in irgendeiner Weise diese Funktionalität beeinträchtigen würde. Da du eine OnSysCommand Funktion nutzt kann auch dort drin der Fehler liegen.
    Gruss,
    DeSoVoDaMu



  • Hey,
    das sind doch nur die Funktionsköpfe in der Header-Datei.

    public:
    	LRESULT ShowDlg(WPARAM wParam, LPARAM lParam);
    	Icon();
    	Onlinedatum();
    	ONLINEZEIT();
    

    das ist schon OK.
    Aber zu Deiner Frage--> Nein es passiert einfach nichts.
    Der Dialog verschwindet, das Try Icon erscheint, aber beim anklicken maximiert der Dialog nicht.
    Wo würdest du denn den Aufruf von Icon() hinmachen (Icon->minimiert das programm),
    kann es sein, das wenn ich den Aufruf in den Timer mache das Fenster direckt wieder minimiert wird?

    Vieleicht ja auch ein andere Fehler???



  • Hm, hab ich das was verpasst? Also bei mir muss stets ein Rückgabewert angegeben werden o_O
    Nun zu 2.: Ich habe dich vorhin wohl falsch verstanden ^^ Du meintest das Programm aus dem Tray maximieren und ich einfach so, wenn es geöffnet und zu sehen ist.
    Ich würde das in OnSysCommand() schreiben (hast du ja schon vorhanden, dachte du nutzt das auch)

    void COnlinetimerDlg::OnSysCommand(UINT nID, LPARAM lParam) 
    {
    	CDialog::OnSysCommand(nID, lParam);
    
    	if (nID == SC_MINIMIZE) Icon();
    }
    

    Aber beim Maximieren kann ich keinen Fehler entdecken. Test doch mal, ob die Funktion überhaupt aufgerufen wird (mit ner Message Box oder sowas).
    Gruss,
    DeSoVoDaMu



  • Nein, die Funktion wird nicht aufgerufen, hab das mal so probiert:

    LRESULT COnlinetimerDlg::ShowDlg(WPARAM wParam, LPARAM lParam)
    {
    	 MessageBox("HALLO");                      // 1.Versuch
    	 if (lParam == WM_LBUTTONDOWN) 
        { 
    		 MessageBox("HALLO");             // 2. Versuch
            ShowWindow(SW_SHOW); 
                NOTIFYICONDATA    tnd;         
                tnd.cbSize = sizeof(NOTIFYICONDATA);     
                tnd.hWnd = this ->m_hWnd;   
                tnd.uID = 1;   
                tnd.uFlags = NIF_MESSAGE|NIF_ICON; 
                tnd.uCallbackMessage= WM_SYSTRAY;   
                tnd.hIcon = 0; 
                tnd.szTip[0] = '\0';     
                Shell_NotifyIcon(NIM_DELETE,&tnd); 
                return 1; 
        } 
    
        return 0; 
    }
    

    Wenn ich die Funktion per Hand aufrufe "ShowDlg(1,2); " wird das Fenster nicht eingeblendet und die MessageBox kommt nur im 1. Versuch, Mauseereigniss wird wohl nicht registriert.



  • Nun, ich kann beim besten Willen keinen Fehler finden, warum die Funktion nicht aufgerufen wird, wie sie es soll. Das der Funktionsaufruf nur die erste MessageBox aufruft und das Fenster nicht maximiert wird ist im Prinzip klar, Du musst ihm ja auch sagen, dass die linke Maustaste gedrückt wurde 😉

    ShowDlg(1, WM_LBUTTONDOWN);
    

    Du kannst mir das Programm ja mal per Mail zuschicken, dann würde ich es mir mal anschauen, vielleicht finde ich ja noch einen Fehler.
    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten