如何用VC++ MFC 使程序最小化到托盘

如何用VC++ MFC 使程序最小化到托盘,第1张

1、创建mfc工程(对话框)

2、在myApp.cpp中InitInstance()中修改如下:

CDialog* pd = new CDialog

HICON hIcon = LoadIcon(IDR_MAINFRAME)

pd->Create(IDD_TEMP_DIALOG)//IDD_TEMP_DIALOG是一个不显示的对话框资源ID

pd->SetWindowText("QQ_Loginer")

pd->SetIcon(hIcon, TRUE)

CQQ_LoginerDlg dlg(pd)

m_pMainWnd = &dlg

int nResponse = dlg.DoModal()

3、在myAppDlg.h中加入初始化变量和函数

public:

void InitialNotifyIcon()

BOOL wndst

NOTIFYICONDATA NotifyIcon

protected:

afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam)

4、在myAppDlg.cpp中的OnInitDialog()加入如下代码:

wndst = FALSE

InitialNotifyIcon()

加入函数:

void CmyAppDlg::OnNotifyIcon(WPARAM wParam, LPARAM IParam)

{

if (IParam == WM_LBUTTONUP)

{

if (wndst)

{

ShowWindow(SW_SHOW)

}

else

{

ShowWindow(SW_HIDE)

}

wndst = !wndst

}

}

void CmyAppDlg::InitialNotifyIcon()

{

ShowWindow(SW_HIDE)

NotifyIcon.cbSize = sizeof(NOTIFYICONDATA)

NotifyIcon.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME)

NotifyIcon.hWnd = m_hWnd

lstrcpy(NotifyIcon.szTip, "QQ_Loginer")

NotifyIcon.uCallbackMessage = WM_NC

NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP

Shell_NotifyIcon(NIM_ADD, &NotifyIcon)

}

别忘记加入消息函数:

void CmyAppDlg::OnClose()

{

Shell_NotifyIcon(NIM_DELETE, &NotifyIcon)

exit(0)

CDialog::OnClose()

}

附:改变停留消息提示(淡黄色便签提示)的方法:

CString title

title = "[Refresh rate: " + m_interval + "s]"

AfxGetMainWnd()->SetWindowText(title)

lstrcpy(NotifyIcon.szTip, title)

Shell_NotifyIcon(NIM_MODIFY, &NotifyIcon)

要源码的hi我,这里贴怕吞。

在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类

下面我们就来讲解一下如何简单实现一个系统托盘 我们以对话框程序为列

第一步:在Dlg类中//定义一个NOTIFYICONDATA类的成员变量,用来设置托盘

NOTIFYICONDATA NotifyIcon

第二步:声明一个消息响应函数 afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam)

上面那条代码也放在Dlg的头文件中

第三步:定义一个自定义消息 #define WM_NC WM_USER+1

上面那条代码也在Dlg的头文件中声明

注册消息 ON_MESSAGE(WM_NC,OnNotifyIcon)

上面那条代码在Dlg类中

第四步:在Dlg头文件中添加一个函数 用来响应点击最小化按钮

void changeMini()

并在Dlg类中实现这个函数

//响应最小化消息

void CChangeScreenDlg::changeMini()

{

ShowWindow(SW_HIDE)

NotifyIcon.cbSize=sizeof(NOTIFYICONDATA)

NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME)

NotifyIcon.hWnd=m_hWnd

lstrcpy(NotifyIcon.szTip,"MediaCraft EMMG")

NotifyIcon.uCallbackMessage=WM_NC

NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP

Shell_NotifyIcon(NIM_ADD,&NotifyIcon)

}

第五步:截获最小化事件

在Dlg类中找到OnSysCommand函数

修改代码如下

if ((nID &0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout

dlgAbout.DoModal()

}

//拦截最小化事件

if(nID==SC_MINIMIZE)

{

//ToTray()

//用我们自己的消息响应最小化事件

changeMini()

}

else

{

CDialog::OnSysCommand(nID, lParam)

}

第六步:响应托盘的鼠标事件 也是实现我们第二部声明的消息响应函数

void CChangeScreenDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)

{

if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))

{

ModifyStyleEx(0,WS_EX_TOPMOST)

ShowWindow(SW_SHOW)

}

}

最后一步:在类的析构函数中 记得销毁托盘图标对象

Shell_NotifyIcon(NIM_DELETE, &NotifyIcon)

希望对你能有所帮助。

自定义消息:#define wm_user_msg + 100

在消息响应中添加:

ON_MESSAGE(wm_user_msg, 自定的消息响应函数)

建立消息映射函数:

afx_msg 返回值 函数名(WPARAM wParam, LPARAM lParam)

再在CPP中写消息映射函数(消息处理部分)

即可实现消息的响应


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

原文地址: http://outofmemory.cn/yw/12039427.html

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

发表评论

登录后才能评论

评论列表(0条)

保存