002
10.08.2002, 12:14 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo, mal noch ein kleines Bsp. dazu: Projekt: Konsole mit MFC Unterstützung, subsystem:windows bei den Linkereinstellungen. In der erstellten TrayIcon.cpp die Main Funktion löschen und durch den Quellcode ersetzen. IDI_MAINFRAME selbst erzeugen:
C++: |
// TrayIcon.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. //
#include "stdafx.h" #include "TrayIcon.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BOOL ismod, option=true; myapp a;
BOOL myapp::InitInstance() { myframe *p ; p = new myframe ; m_pMainWnd = p ; return TRUE; }
/* Message_Map myframe */ BEGIN_MESSAGE_MAP ( myframe, CFrameWnd ) ON_WM_CREATE() ON_COMMAND (101,option_1) ON_COMMAND (102,option_2) ON_COMMAND (104,beenden) ON_COMMAND (105,about) ON_UPDATE_COMMAND_UI(101, OnUpdateoption_1) ON_UPDATE_COMMAND_UI(102, OnUpdateoption_2) END_MESSAGE_MAP()
void myframe::about() { MessageBox("Copyright (c)2002 by Ich", "Info",MB_ICONASTERISK); }
myframe::myframe() { Create ( 0, "TrayDemo" ) ; }
int myframe::OnCreate ( LPCREATESTRUCT l ) { CFrameWnd::OnCreate ( l ) ;
m_tray.create ( NULL, WM_USER + 15, "", LoadIcon ( AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_MAINFRAME))); m_hicon = AfxGetApp( ) -> LoadIcon ( IDI_ASTERISK ) ;
return 0 ; }
void myframe::option_1() { MessageBox("Option 1 gewählt!"); option=false; }
void myframe::option_2() { MessageBox("Option 2 gewählt!"); option=true; }
void myframe::beenden() { if(MessageBox("Diese Option entfernt nun das Programm\naus der Taskleiste und aus dem Arbeitsspeicher." ,"Info",MB_OKCANCEL|MB_DEFBUTTON2|MB_ICONASTERISK)==IDOK){ m_tray.remove(); DestroyWindow(); } else return; }
void myframe::OnUpdateoption_1(CCmdUI* pCmdUI) { if (ismod) pCmdUI->Enable(false); }
void myframe::OnUpdateoption_2(CCmdUI*pCmdUI) { if (!ismod) pCmdUI->Enable(false); }
/* TrayIcon Message_Map */ BEGIN_MESSAGE_MAP ( TrayIcon, CWnd ) ON_MESSAGE ( WM_USER + 15, onusermessage ) END_MESSAGE_MAP( )
BOOL TrayIcon::create( CWnd *p, UINT message, LPCTSTR tip, HICON i ) { CWnd::CreateEx ( 0, AfxRegisterWndClass ( 0 ), "", WS_POPUP, 0, 0, 10, 10, NULL, 0 ) ;
m_mymenu.CreatePopupMenu( ) ;
m_mymenu.AppendMenu (MF_STRING, 101, "Option 1" ) ; m_mymenu.AppendMenu (MF_STRING, 102, "Option 2" ) ; m_mymenu.AppendMenu (MF_SEPARATOR); m_mymenu.AppendMenu (MF_STRING, 104, "Beenden" ); m_mymenu.AppendMenu (MF_SEPARATOR); m_mymenu.AppendMenu (MF_STRING, 105, "About" );
m_nid.cbSize = sizeof ( NOTIFYICONDATA ) ; m_nid.hWnd = m_hWnd ; m_nid.uID = 1 ; m_nid.hIcon = i ; m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP ; m_nid.uCallbackMessage = message ; strcpy ( m_nid.szTip, tip ) ;
Shell_NotifyIcon ( NIM_ADD, &m_nid ) ;
return 0 ; }
LRESULT TrayIcon::WindowProc ( UINT message, WPARAM w, LPARAM l ) { return CWnd::WindowProc ( message, w, l ) ; }
LRESULT TrayIcon::onusermessage ( WPARAM w, LPARAM l ) { CWnd *p = AfxGetMainWnd( ) ;
if ( LOWORD ( l ) == WM_RBUTTONUP ) { CPoint pos ; GetCursorPos ( &pos ) ; p -> SetForegroundWindow( ) ; setdefault(); m_mymenu.TrackPopupMenu ( TPM_RIGHTBUTTON, pos.x, pos.y, p ) ; p -> PostMessage ( WM_NULL, 0, 0 ) ; } else if ( LOWORD ( l ) == WM_LBUTTONDBLCLK ) { p -> SetForegroundWindow( ) ; int id = GetMenuDefaultItem ( m_mymenu.m_hMenu, FALSE, 0 ) ; p -> SendMessage ( WM_COMMAND, 101, 0 ) ; }
return 0L ; }
void TrayIcon::setdefault( ) { if (isSet()){ ismod=false; ::SetMenuDefaultItem ( m_mymenu.m_hMenu, 101, NULL ); } else { ismod=true; ::SetMenuDefaultItem ( m_mymenu.m_hMenu, 102,NULL); } }
void TrayIcon::remove() { Shell_NotifyIcon ( NIM_DELETE, &m_nid ); }
BOOL TrayIcon::isSet() { if(!option) return false; return true; }
|
Jetzt der Header
C++: |
#if !defined(AFX_TRAYICON_H__B391E3C1_5741_4025_90FC_674FEE956D6D__INCLUDED_) #define AFX_TRAYICON_H__B391E3C1_5741_4025_90FC_674FEE956D6D__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include "resource.h" class myapp : public CWinApp { public: BOOL InitInstance(); };
class TrayIcon : public CWnd { private :
NOTIFYICONDATA m_nid ; CMenu m_mymenu ; public :
int create ( CWnd* p, UINT message, LPCTSTR tip, HICON i ) ; virtual LRESULT WindowProc ( UINT message, WPARAM w, LPARAM l ); void setdefault(); void remove(); BOOL isSet(); LRESULT onusermessage ( WPARAM w, LPARAM l );
DECLARE_MESSAGE_MAP( ) };
class myframe : public CFrameWnd {
private : TrayIcon m_tray ; HICON m_hicon; int m_flag; public : myframe( ) ; int OnCreate ( LPCREATESTRUCT l ) ; void about(); void option_1(); void option_2(); void beenden(); protected: afx_msg void OnUpdateoption_1(CCmdUI* pCmdUI); afx_msg void OnUpdateoption_2(CCmdUI* pCmdUI); DECLARE_MESSAGE_MAP() }; #endif // !defined(AFX_TRAYICON_H__B391E3C1_5741_4025_90FC_674FEE956D6D__INCLUDED_)
|
Viel Spass... -- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe Dieser Post wurde am 10.08.2002 um 12:19 Uhr von Uwe editiert. |