如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++

如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++,第1张

完整代码如下,自己参考!!

#include <wtypesh>

#include "resourceh"

//任务栏右侧提供托盘,允许程序加入图标,并响应用户输入的消息,对在后台运行的程序是有用的

//加入图标,调用Shell_NotifyIcon即可,允许删除和修改图标,传递给该函数NOTIFYICONDATA结构

const char szClassName[]={ TEXT("ShellTrayWindowClass")}; //窗口类名

const char szTip[]={ TEXT("Shell tray icon demo")}; //托盘图标提示字符

const int WM_SHELLICONNOTIFY=WM_USER+0x99; //通知消息

const int SMILLID=0x99; //托盘图标编号

HICON hIconSmill; //托盘图标句柄

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口过程

void AddTrayIcon(HWND); //辅助函数

void DeleteTrayIcon(HWND);

void ShowMenu(HWND);

int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)

{

WNDCLASSEX wcex;

MSG msg;

HWND hwnd;

hIconSmill=::LoadIcon(hInstance,MAKEINTRESOURCE(IDI_SMELL)); //加载托盘图标资源

wcexcbSize=sizeof(WNDCLASSEX); //窗口类

wcexcbClsExtra=0;

wcexcbWndExtra=0;

wcexhInstance=hInstance;

wcexlpszClassName=szClassName;

wcexlpfnWndProc=WndProc;

wcexlpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);

wcexstyle=0;

wcexhbrBackground=(HBRUSH)::GetStockObject(NULL_BRUSH);

wcexhCursor=::LoadCursor(NULL,IDC_ARROW);

wcexhIcon=hIconSmill;

wcexhIconSm=hIconSmill;

do {

if(!::RegisterClassEx(&wcex))

break;

//创建不可见的窗口

hwnd=::CreateWindow(szClassName,NULL,WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

if(!hwnd)

break;

while(::GetMessage(&msg,0,0,0)) //消息循环

{

::TranslateMessage(&msg);

::DispatchMessage(&msg);

}

} while(FALSE);

return msgwParam;

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) //主窗口过程

{

switch(msg)

{

case WM_CREATE: //创建窗口时向托盘加入图标

AddTrayIcon(hWnd);

break;

case WM_COMMAND: //处理来自托盘的菜单命令

switch(LOWORD(wParam))

{

case IDM_HELLO:

::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);

return 0;

case IDM_EXIT:

::DestroyWindow(hWnd);

return 0;

default:

break;

}

break;

case WM_SHELLICONNOTIFY: //处理托盘图标的鼠标事件

{

if(SMILLID==(UINT)wParam)

{

switch((UINT)lParam)

{

case WM_RBUTTONUP:

ShowMenu(hWnd);

return 0;

case WM_LBUTTONDBLCLK:

::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);

return 0;

default:

break;

}

}

}

break;

case WM_DESTROY: //窗口销毁时删除托盘图标,并退出程序

DeleteTrayIcon(hWnd);

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hWnd,msg,wParam,lParam);

}

void AddTrayIcon(HWND hwnd) //添加托盘图标

{

NOTIFYICONDATA nid;

nidcbSize=sizeof(NOTIFYICONDATA); //指定结构大小

niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //指定结构的哪些成员是有效的

nidhIcon=hIconSmill; //指定托盘图标句柄

nidhWnd=hwnd; //指定接收托盘消息的窗口句柄

niduID=SMILLID; //自定义的托盘图标句柄,一个程序可添加多个托盘图标,以uID区分

niduCallbackMessage=WM_SHELLICONNOTIFY; //当用户鼠标在托盘产生事件时用户通知窗口程序的消息号

strcpy(nidszTip,szTip); //鼠标在托盘图标上停靠的提示字符串

Shell_NotifyIcon(NIM_ADD,&nid);

}

void DeleteTrayIcon(HWND hwnd)

{

NOTIFYICONDATA nid;

::ZeroMemory(&nid,sizeof(nid));

nidcbSize=sizeof(NOTIFYICONDATA);

niduID=SMILLID;

nidhWnd=hwnd;

nidhIcon=hIconSmill;

Shell_NotifyIcon(NIM_DELETE,&nid);

}

void ShowMenu(HWND hwnd)

{

HMENU hMenu=::GetSubMenu(::GetMenu(hwnd),0);

POINT pt;

::GetCursorPos(&pt);

if(hMenu==NULL)

return;

if(::TrackPopupMenuEx(hMenu,TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_LEFTBUTTON,ptx,pty,hwnd,NULL))

PostMessage(hwnd,WM_USER,0,0);

}

VC++中把一个对话框最小化到托盘

一、托盘简介

所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。

二、托盘编程相关函数

把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。

绘制图标以及确定图标所传送消息的函数只有一个:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(

DWORD dwMessage,

PNOTIFYICONDATA pnid

);

这个函数,负责向系统传递消息,以添加、修改或删除托盘区的图标。

参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下:

typedef struct _NOTIFYICONDATA {

DWORD cbSize;

HWND hWnd;

UINT uID;

UINT uFlags;

UINT uCallbackMessage;

HICON hIcon;

char szTip[64];

} NOTIFYICONDATA, PNOTIFYICONDATA;

下面就对该结构各个参数进行刨析:

cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。

HWnd : 一个句柄,如果对托盘中的图标进行 *** 作,相应的消息就传给这个句柄所代表的窗口。大多数情况下是this->m_hWnd。

uID : 在工程中定义的图标ID

uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述

hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。

uCallbackMessage : 这在对托盘区的 *** 作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行 *** 作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。

szTip : 鼠标移动到托盘图标上时的提示文字。

三、托盘编程例子

1、将程序最小化到系统托盘区的函数toTray()。

void CTimeWakeDlg::toTray()

{

NOTIFYICONDATA nid;

nidcbSize=(DWORD)sizeof(NOTIFYICONDATA);

nidhWnd=this->m_hWnd;

niduID=IDR_MAINFRAME;

niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

niduCallbackMessage=WM_SHOWTASK;//自定义的消息名称

nidhIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nidszTip,"计划任务提醒"); //信息提示条为“计划任务提醒”

Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标

ShowWindow(SW_HIDE); //隐藏主窗口

}

这是个很简单的函数,里面首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon, 头一个参数是NIM_ADD,表示添加。然后用函数ShowWindow 隐藏主窗口,这样,就实现了将程序最小化到系统托盘区的任务了。

2、程序已经最小化到托盘区了,但是对托盘图标的 *** 作如何进行呢?这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无论是左键还是右键),会向hWnd所代表的窗口传送消息

如上例,我们自定义了消息WM_SHOWTASK。根据VC的消息机制,对自定义消息增加消息响应函数

在Dlgcpp文件上面定义一个用户消息:

#define WM_SHOWTASK (WM_USER + 1986)

在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应函数:

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);

然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间加入: ON_MESSAGE(WM_SHOWTASK,onShowTask)将消息和消息响应函数映射起来。

然后就是在CPP文件中加入函数onShowTask的实现了:

LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)

//wParam接收的是图标的ID,而lParam接收的是鼠标的行为

{

if(wParam!=IDR_MAINFRAME)

return 1;

switch(lParam)

{

case WM_RBUTTONUP://右键起来时d出快捷菜单,这里只有一个“关闭”

{

LPPOINT lpoint=new tagPOINT;

::GetCursorPos(lpoint);//得到鼠标位置

CMenu menu;

menuCreatePopupMenu();//声明一个d出式菜单

//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已

//隐藏),将程序结束。

menuAppendMenu(MF_STRING,WM_DESTROY,"关闭");

//确定d出式菜单的位置

menuTrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);

/ /资源回收

HMENU hmenu=menuDetach();

menuDestroyMenu();

delete lpoint;

}

break;

case WM_LBUTTONDBLCLK://双击左键的处理

{

this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿

}

break;

}

return 0;

}

以上就是关于如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++全部的内容,包括:如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++、求教:vc++单文档程序最小化到托盘、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/9806607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存