怎样把基于对话框的程序做成托盘的格式?? 怎样把基于对话框的程序做成托盘的格式?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有不少例子可以看你看看本站的文章还有,可以看看www.vckbase的文章库 you email.给你一个例子 [email protected]谢谢 wistaria(听风听雨) HWND m_WndHandle; NOTIFYICONDATA m_tray_nid; HICON m_hIcon; m_hIcon = AfxGetApp()->LoadIcon(IDR_MINTOPTYPE); m_WndHandle = this->m_hWnd; //窗口的句柄 m_tray_nid.cbSize = sizeof(NOTIFYICONDATA); m_tray_nid.hWnd = m_WndHandle; m_tray_nid.uID = 9935; m_tray_nid.hIcon = m_hIcon; m_tray_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_tray_nid.uCallbackMessage = WM_LBUTTONDOWN; sprintf(m_tray_nid.szTip, "title"); ShowWindow(SW_HIDE); Shell_NotifyIcon(NIM_ADD, &m_tray_nid); 访问系统托盘的方法是通过Shell_NotifyIcon函数和NOTIFYICONDATA结构实现的。 typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; TCHAR szTip[64]; DWORD dwState; //Version 5.0 DWORD dwStateMask; //Version 5.0 TCHAR szInfo[256]; //Version 5.0 UINT uTimeout; //Version 5.0 TCHAR szInfoTitle[64]; //Version 5.0 DWORD dwInfoFlags; //Version 5.0} NOTIFYICONDATA, *PNOTIFYICONDATA; 为了要在系统托盘中显示图标,用NIM_ADD标志调用Shell_NotifyIcon函数。 #define ID_TASKBARICON 100#define WM_ICONNOTIFY (WM_USER + 101)NOTIFYICONDATA nid;// 初始化系统托盘图标nid.cbSize = sizeof(NOTIFYICONDATA);nid.hWnd = hWnd;nid.uID = ID_TASKBARICON;nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;nid.uCallbackMessage = WM_ICONNOTIFY;nid.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_TRAY1), IMAGE_ICON, 16, 16, 0);strcpy(nid.szTip, "My Tooltip Text");Shell_NotifyIcon(NIM_ADD, &nid);cbSize成员是结构的大小(使用它主要是为了支持将来这个结构大小增加)。 hWnd是窗口句柄。当图标发生某事件时(如单击、双击等),Windows将向窗口发送uCallbackMessage成员指定的消息。uID成员指定与图标关联的ID。它不是很重要,除非你需要显示并跟踪几个图标。 uFlag成员告诉Windows应该读取哪个成员。当添加一个图标时,应该包含这个结构的大多数成员。当更新图标时,如只是需要改变图标时,你只要设置相应的标志就可以了。 hIcon成员是你想显示的图标。 最后,szTip成员是提示文本。设置好这些结构成员后,调用Shell_NotifyIcon函数。 当与图标关联的事件发生时,Windows将发送uCallbackMessage成员指定的消息。IParam包含发送的消息。当获得WM_LBUTTONDBLCLK消息时显示主窗口或者启动主程序。当获得WM_RBUTTONUP消息时显示菜单。 to:Jasanye我也是利用托盘类,但在托盘图标上添架右键响应菜单时有问题如下:在任务栏托盘区,添加程序的右键弹出菜单 HMENU hMenu=LoadMenu(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_POP)); HMENU hSub=GetSubMenu(hMenu,0); SetForegroundWindow(); POINT pt; GetCursorPos(&pt); DWORD dwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);可是弹出的并不是我在IDR_POP中设计的菜单,而是其最大化时的第一列菜单也就是IDR_MAINFRAME的菜单项。不知何故? 这是头文件,下一贴是cpp文件,你只需要调用Init(),并传递你的对话框句柄,你可以设置Tips,右键菜单等,程序退出时,请调用ShutDown()方法。#if !defined(AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_)#define AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi );BOOL TrayMessage( DWORD dwMessage );BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );class CSystemTray {public: void SetDblClkActive( BOOL bValue ); void ShutDown(); BOOL Init( HWND hMainWnd ); BOOL SetTips( LPCTSTR strTips ); void ShowApp( BOOL bShow ); void SetIcon( UINT IconID ); void SetPopmenuID( UINT PopmenuID ); CSystemTray(); virtual ~CSystemTray();};#endif // !defined(AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_) // SystemTray.cpp: implementation of the CSystemTray class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "SystemTray.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)#define MYWM_NOTIFYICON (WM_APP+100)#define ICONID 35 //任意值WNDPROC gOldDlgProc = NULL;BOOL m_bInited = FALSE;UINT m_PopmenuID = 0; //关联菜单IDBOOL m_gbDblClkActive = TRUE;UINT m_IconID = 0; //图标CString m_strTips;HWND m_hMainWnd = NULL;CSystemTray::CSystemTray(){ m_strTips = AfxGetApp()->m_pszAppName; }CSystemTray::~CSystemTray(){}void CSystemTray::SetDblClkActive( BOOL bValue ){ m_gbDblClkActive = bValue;}BOOL CSystemTray::SetTips( LPCTSTR strTips ){ if( lstrlen( strTips ) > 63 ) return FALSE; m_strTips = strTips; m_strTips.FreeExtra(); if( m_bInited ) TrayMessage( NIM_MODIFY ); return TRUE;}void CSystemTray::ShowApp( BOOL bShow ){ ASSERT( m_hMainWnd ); if( bShow ) { ShowWindow( m_hMainWnd, SW_SHOWNORMAL ); SetForegroundWindow( m_hMainWnd ); // make us come to the front } else ShowWindow( m_hMainWnd, SW_HIDE );}void CSystemTray::SetIcon( UINT IconID ){ m_IconID = IconID; if( m_bInited ) TrayMessage( NIM_MODIFY );}void CSystemTray::SetPopmenuID( UINT PopmenuID ){ ASSERT( PopmenuID>0 ); m_PopmenuID = PopmenuID;}BOOL TrayMessage( DWORD dwMessage ){ BOOL res; NOTIFYICONDATA tnd; HICON hIcon = NULL; if( m_IconID ) { hIcon = AfxGetApp()->LoadIcon( m_IconID ); if( !hIcon ) return FALSE; } tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = m_hMainWnd; tnd.uID = ICONID; tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; tnd.uCallbackMessage = MYWM_NOTIFYICON; tnd.hIcon = hIcon; if( m_strTips.IsEmpty() ) tnd.szTip[0] = '\0'; else lstrcpy( tnd.szTip, m_strTips ); res = Shell_NotifyIcon( dwMessage, &tnd ); if( hIcon ) DestroyIcon( hIcon ); return res;}BOOL CSystemTray::Init( HWND hMainWnd ) //本函数需要在窗口的WM_CREATE或者WM_INITDIALOG被调用{ if( m_bInited ) ShutDown(); m_hMainWnd = hMainWnd;#ifdef _DEBUG if( !IsWindow( m_hMainWnd ) ) AfxMessageBox( "CSystemTray::Init()函数应该在窗口的创\n建或者初始化时调用!" ); ASSERT( IsWindow( m_hMainWnd ) );#endif if( m_hMainWnd == NULL ) return FALSE; if( gOldDlgProc == NULL ) { gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)SystemTrayProc ); if( gOldDlgProc == NULL ) gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)SystemTrayProc ); } m_bInited = TrayMessage( NIM_ADD ); return m_bInited;}void CSystemTray::ShutDown(){ ASSERT( m_hMainWnd ); if( m_bInited ) { TrayMessage( NIM_DELETE ); m_bInited = FALSE; } if( gOldDlgProc ) { LONG dlgProc = SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)gOldDlgProc ); if( dlgProc == 0 ) SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)gOldDlgProc ); }}LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi ){ HICON hIcon = AfxGetApp()->LoadIcon( lpdi->CtlID ); if( !hIcon ) return FALSE; DrawIconEx( lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon, 16, 16, 0, NULL, DI_NORMAL ); //此处是否需要删除hIcon return TRUE;}BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch( uMsg ) { case WM_DRAWITEM: IconDrawItem( (LPDRAWITEMSTRUCT)lParam ); break; case WM_DESTROY: if( m_bInited ) TrayMessage( NIM_DELETE ); break; case WM_SIZE: if( wParam == SIZE_MINIMIZED ) ShowWindow( hWnd, SW_HIDE ); break; case MYWM_NOTIFYICON: switch( lParam ) { case WM_LBUTTONDBLCLK: if( m_gbDblClkActive ) { ShowWindow( hWnd, SW_SHOWNORMAL ); SetForegroundWindow( hWnd );#ifdef _DEBUG PostMessage( hWnd, WM_USER+26, 0, 0 );#endif } break; case WM_RBUTTONDOWN: if( m_PopmenuID ) { CMenu menu; CMenu* pPopup; VERIFY(menu.LoadMenu(m_PopmenuID)); pPopup = menu.GetSubMenu(0); ASSERT( pPopup != NULL ); //::SetMenuDefaultItem( pPopup->m_hMenu, 0, TRUE ); CPoint pos; GetCursorPos(&pos); ::SetForegroundWindow( hWnd ); TrackPopupMenu( pPopup->m_hMenu, 0, pos.x, pos.y, 0, hWnd, NULL ); } default: break; } default: break; } return CallWindowProc( gOldDlgProc, hWnd, uMsg, wParam, lParam );} opengl中画面 PostMessage和DispatchMessage的区别 请问对话框中怎样输入汉字 ? 一个简单的问题,望大家多多帮助 请问如何在对话中插入一个gif动画图片作为背景 请问 400分 哪位同志帮我编个小程序? 积分啊 给我一些说服我的合作者的理由 如何播放缓冲区的数据? 求救:编译时出错 ,error C2059 和error C2238 报表
给你一个例子
谢谢 wistaria(听风听雨)
NOTIFYICONDATA m_tray_nid;
HICON m_hIcon;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MINTOPTYPE);
m_WndHandle = this->m_hWnd; //窗口的句柄
m_tray_nid.cbSize = sizeof(NOTIFYICONDATA);
m_tray_nid.hWnd = m_WndHandle;
m_tray_nid.uID = 9935;
m_tray_nid.hIcon = m_hIcon;
m_tray_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_tray_nid.uCallbackMessage = WM_LBUTTONDOWN;
sprintf(m_tray_nid.szTip, "title");
ShowWindow(SW_HIDE);
Shell_NotifyIcon(NIM_ADD, &m_tray_nid);
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState; //Version 5.0
DWORD dwStateMask; //Version 5.0
TCHAR szInfo[256]; //Version 5.0
UINT uTimeout; //Version 5.0
TCHAR szInfoTitle[64]; //Version 5.0
DWORD dwInfoFlags; //Version 5.0
} NOTIFYICONDATA, *PNOTIFYICONDATA;
为了要在系统托盘中显示图标,用NIM_ADD标志调用Shell_NotifyIcon函数。
#define ID_TASKBARICON 100
#define WM_ICONNOTIFY (WM_USER + 101)NOTIFYICONDATA nid;// 初始化系统托盘图标
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = ID_TASKBARICON;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_ICONNOTIFY;
nid.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_TRAY1), IMAGE_ICON, 16, 16, 0);
strcpy(nid.szTip, "My Tooltip Text");
Shell_NotifyIcon(NIM_ADD, &nid);
cbSize成员是结构的大小(使用它主要是为了支持将来这个结构大小增加)。
hWnd是窗口句柄。当图标发生某事件时(如单击、双击等),Windows将向窗口发送uCallbackMessage成员指定的消息。uID成员指定与图标关联的ID。它不是很重要,除非你需要显示并跟踪几个图标。
uFlag成员告诉Windows应该读取哪个成员。当添加一个图标时,应该包含这个结构的大多数成员。当更新图标时,如只是需要改变图标时,你只要设置相应
的标志就可以了。 hIcon成员是你想显示的图标。
最后,szTip成员是提示文本。设置好这些结构成员后,调用Shell_NotifyIcon函数。 当与图标关联的事件发生时,Windows将发送uCallbackMessage成员指定的消息。IParam包含发送的消息。当获得WM_LBUTTONDBLCLK消息时显示主窗口
或者启动主程序。当获得WM_RBUTTONUP消息时显示菜单。
我也是利用托盘类,但在托盘图标上添架右键响应菜单时有问题如下:
在任务栏托盘区,添加程序的右键弹出菜单
HMENU hMenu=LoadMenu(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_POP));
HMENU hSub=GetSubMenu(hMenu,0);
SetForegroundWindow();
POINT pt;
GetCursorPos(&pt);
DWORD dwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);
可是弹出的并不是我在IDR_POP中设计的菜单,而是其最大化时的第一列菜单也就是IDR_MAINFRAME的菜单项。
不知何故?
#define AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi );
BOOL TrayMessage( DWORD dwMessage );
BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );class CSystemTray
{
public:
void SetDblClkActive( BOOL bValue );
void ShutDown();
BOOL Init( HWND hMainWnd );
BOOL SetTips( LPCTSTR strTips );
void ShowApp( BOOL bShow );
void SetIcon( UINT IconID );
void SetPopmenuID( UINT PopmenuID ); CSystemTray();
virtual ~CSystemTray();
};#endif // !defined(AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_)
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "SystemTray.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
#define MYWM_NOTIFYICON (WM_APP+100)
#define ICONID 35 //任意值WNDPROC gOldDlgProc = NULL;
BOOL m_bInited = FALSE;
UINT m_PopmenuID = 0; //关联菜单ID
BOOL m_gbDblClkActive = TRUE;UINT m_IconID = 0; //图标
CString m_strTips;
HWND m_hMainWnd = NULL;
CSystemTray::CSystemTray()
{
m_strTips = AfxGetApp()->m_pszAppName;
}CSystemTray::~CSystemTray()
{
}void CSystemTray::SetDblClkActive( BOOL bValue )
{
m_gbDblClkActive = bValue;
}BOOL CSystemTray::SetTips( LPCTSTR strTips )
{
if( lstrlen( strTips ) > 63 ) return FALSE;
m_strTips = strTips;
m_strTips.FreeExtra();
if( m_bInited )
TrayMessage( NIM_MODIFY );
return TRUE;
}void CSystemTray::ShowApp( BOOL bShow )
{
ASSERT( m_hMainWnd );
if( bShow )
{
ShowWindow( m_hMainWnd, SW_SHOWNORMAL );
SetForegroundWindow( m_hMainWnd ); // make us come to the front
}
else
ShowWindow( m_hMainWnd, SW_HIDE );
}void CSystemTray::SetIcon( UINT IconID )
{
m_IconID = IconID;
if( m_bInited )
TrayMessage( NIM_MODIFY );
}void CSystemTray::SetPopmenuID( UINT PopmenuID )
{
ASSERT( PopmenuID>0 );
m_PopmenuID = PopmenuID;
}BOOL TrayMessage( DWORD dwMessage )
{
BOOL res;
NOTIFYICONDATA tnd;
HICON hIcon = NULL;
if( m_IconID )
{
hIcon = AfxGetApp()->LoadIcon( m_IconID );
if( !hIcon ) return FALSE;
}
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = m_hMainWnd;
tnd.uID = ICONID;
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage = MYWM_NOTIFYICON;
tnd.hIcon = hIcon;
if( m_strTips.IsEmpty() )
tnd.szTip[0] = '\0';
else
lstrcpy( tnd.szTip, m_strTips ); res = Shell_NotifyIcon( dwMessage, &tnd );
if( hIcon )
DestroyIcon( hIcon );
return res;
}BOOL CSystemTray::Init( HWND hMainWnd ) //本函数需要在窗口的WM_CREATE或者WM_INITDIALOG被调用
{
if( m_bInited ) ShutDown();
m_hMainWnd = hMainWnd;#ifdef _DEBUG
if( !IsWindow( m_hMainWnd ) )
AfxMessageBox( "CSystemTray::Init()函数应该在窗口的创\n建或者初始化时调用!" );
ASSERT( IsWindow( m_hMainWnd ) );
#endif if( m_hMainWnd == NULL ) return FALSE;
if( gOldDlgProc == NULL )
{
gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)SystemTrayProc );
if( gOldDlgProc == NULL )
gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)SystemTrayProc );
}
m_bInited = TrayMessage( NIM_ADD );
return m_bInited;
}void CSystemTray::ShutDown()
{
ASSERT( m_hMainWnd );
if( m_bInited )
{
TrayMessage( NIM_DELETE );
m_bInited = FALSE;
}
if( gOldDlgProc )
{
LONG dlgProc = SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)gOldDlgProc );
if( dlgProc == 0 )
SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)gOldDlgProc );
}
}LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi )
{
HICON hIcon = AfxGetApp()->LoadIcon( lpdi->CtlID );
if( !hIcon ) return FALSE;
DrawIconEx( lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon,
16, 16, 0, NULL, DI_NORMAL ); //此处是否需要删除hIcon
return TRUE;
}
BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_DRAWITEM:
IconDrawItem( (LPDRAWITEMSTRUCT)lParam );
break;
case WM_DESTROY:
if( m_bInited )
TrayMessage( NIM_DELETE );
break;
case WM_SIZE:
if( wParam == SIZE_MINIMIZED )
ShowWindow( hWnd, SW_HIDE );
break;
case MYWM_NOTIFYICON:
switch( lParam )
{
case WM_LBUTTONDBLCLK:
if( m_gbDblClkActive )
{
ShowWindow( hWnd, SW_SHOWNORMAL );
SetForegroundWindow( hWnd );
#ifdef _DEBUG
PostMessage( hWnd, WM_USER+26, 0, 0 );
#endif
}
break;
case WM_RBUTTONDOWN:
if( m_PopmenuID )
{
CMenu menu;
CMenu* pPopup;
VERIFY(menu.LoadMenu(m_PopmenuID));
pPopup = menu.GetSubMenu(0);
ASSERT( pPopup != NULL ); //::SetMenuDefaultItem( pPopup->m_hMenu, 0, TRUE );
CPoint pos;
GetCursorPos(&pos);
::SetForegroundWindow( hWnd );
TrackPopupMenu( pPopup->m_hMenu, 0,
pos.x, pos.y, 0, hWnd, NULL );
}
default:
break;
}
default:
break;
}
return CallWindowProc( gOldDlgProc, hWnd, uMsg, wParam, lParam );
}