vc++6.0 对话框最小化到托盘,鼠标移到托盘的图标上,图标就消失了

作者&投稿:年果 (若有异议请与网页底部的电邮联系)
VC++ 请问程序最小化后图标在托盘区域,如何恢复程序显示状态~

if (wParam != IDR_MAINFRAME) { return 1; } switch (lParam) { // 双击左键的处理 case WM_LBUTTONDBLCLK: { // 简单的显示主窗口 this->ShowWindow(SW_SHOW); this->ShowWindow(SW_RESTORE); // 删除托盘图标 DeleteTray(); } break; default: break; }

自己的笔记(程序运行、最小化后图标在右下角,类似QQ)


在头文件MainFrm.h中声明NOTIFYICONDATA nid;

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

//***** 初始化系统托盘图标 *****//

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);

nid.hWnd=this->m_hWnd;

nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

nid.uCallbackMessage=WM_USER+1;//自定义的消息名称

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid.szTip,"双击打开多功能电子钟");//信息提示条

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

//***** 初始化系统托盘图标 *****//

//CenterWindow();

}

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

switch(message){

case WM_USER+1: //如果是用户定义的消息



if(lParam==WM_LBUTTONDOWN) //WM_LBUTTONDBLCLK不怎么灵

{

//鼠标单击时主窗口出现

::SetForegroundWindow(this->m_hWnd); //::SetWindowPos(this->m_hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);

WindowIsHide=false;

return 0;

}

else if(lParam==WM_RBUTTONDOWN) // && WindowIsHide

{

::SetForegroundWindow(this->m_hWnd); //将主框架窗口置前,左击其他地方,菜单消失



//鼠标右键单击弹出菜单

CMenu menu;

menu.LoadMenu(IDR_MAINFRAME);

CMenu* pMenu=menu.GetSubMenu(0);

CPoint point;

GetCursorPos(&point);

pMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,AfxGetMainWnd());



::PostMessage(this->m_hWnd, WM_NULL, 0,0); //左击其他地方,菜单消失



menu.DestroyMenu();

return 0;

}

break;

case WM_SYSCOMMAND: //如果是系统消息

if(wParam==SC_MINIMIZE||wParam==SC_CLOSE||wParam==SC_MAXIMIZE||wParam==SC_SIZE)

{

//主窗口隐藏

AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);

WindowIsHide=true;

return 0;

}

break;

}

return CFrameWnd::WindowProc(message, wParam, lParam);

}

void CMainFrame::OnDestroy()

{

CFrameWnd::OnDestroy();

::Shell_NotifyIcon(NIM_DELETE,&nid);

}

那你把 NOTIFYICONDATA pnid 放在app 头文件 下呢,全局的呢 调用的时候可以extern CAdoApp theApp; theApp.pnid 。是这样的,你个窗口关闭了,当然右下角就没了

最后 OnDestroy()里 删除系统托盘 ::Shell_NotifyIcon(NIM_DELETE,&m_tnid);

//////////////////定义系统托盘///////////////////////////
m_tnid.cbSize=sizeof(NOTIFYICONDATA);//设置结构大小//
m_tnid.hWnd=this->m_hWnd;//设置图标对应的窗口
m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//图标属性
m_tnid.uCallbackMessage=MYWM_NOTIFYICON;//应用程序定义的回调消息ID
////////////设置NOTIFYICONDATA结构///////////
CString szToolTip;
szToolTip=_T("CCTimer 2.5");
_tcscpy(m_tnid.szTip, szToolTip);//帮助信息
m_tnid.uID=IDR_MAINFRAME;//应用程序图标
HICON hIconx;
hIconx=AfxGetApp()->LoadIcon(IDI_ICON2);
m_tnid.hIcon=hIconx;//图标句柄
PNOTIFYICONDATA m_ptnid=&m_tnid;
::Shell_NotifyIcon(NIM_ADD,m_ptnid);//增加图标到系统盘
if(hIconx)::DestroyIcon(hIconx);

//////////////////////////////

/////////////////////////////
///////////////////////////

LRESULT CShutdownDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case MYWM_NOTIFYICON:
//如果是用户定义的消息
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠标双击时主窗口出现
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
AfxGetApp()->m_pMainWnd->ShowWindow(SW_RESTORE);
::SetForegroundWindow(this->m_hWnd);
}
else if(lParam==WM_RBUTTONUP) //鼠标右键单击弹出选单
{
readregAutoRun();
::SetForegroundWindow(this->m_hWnd);
//BCMenu menu;
//CMenu menu;
//m_menu.SetMenuDrawMode(true);
//m_menu.LoadMenu(IDR_MENU1); //载入事先定义的选单
// m_menu.SetBitmapBackground(RGB(188,188,188));
//m_menu.LoadToolbar(IDR_TOOLBAR1);
//menu.EnableMenuItem(ID_MENUautoplay, MF_ENABLED);
// menu.SetBitmapBackground(RGB(12,58,255));
//m_menu.SetIconSize(16,16);
//m_menu.SetXPBitmap3D(true);
// CMenu *pMenu=(BCMenu *)menu.GetSubMenu(0);
BCMenu *psub = (BCMenu *)m_menu.GetSubMenu(0);
//CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
psub->SetMenuDrawMode(BCMENU_DRAWMODE_XP);
psub->SetXPBitmap3D(true);
psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,this);
// m_menu.DestroyMenu();

}
break;
}

return CDialog::WindowProc(message, wParam, lParam);
}

直接把NOTIFYICONDATA pnid; 设置成CMyQQDlg的成员函数

NOTIFYICONDATA pnid; 这个变量应该做成全局的


富平县15566322959: 如何用VC++ MFC 使程序最小化到托盘 -
褒邰贝尔: 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->...

富平县15566322959: 在VC6.0中怎么样才能,基于对话框的程序运行时就最小化到托盘,而不显示主窗口,网上看了很多都没什么差别
褒邰贝尔: 如果你已经做到了“点击鼠标或菜单之后,才能最小化到托盘”,那么就简单了.可以在I初始化的时候对对话框发送最小化消息(这样会闪烁一下);或者在程序入口,调整dlg.DoModal为ShowWindow(SW_HIDE);//参考非模态对话框建立

富平县15566322959: VC++6.0中最小化到任务栏的相关问题 -
褒邰贝尔: 用Shell_NotifyIcon(),如果你不懂,我可以教你,最近我都在线(115959903)

富平县15566322959: VC++6.0如何在调试和跟踪基于对话框的程序? -
褒邰贝尔: F9设置断点,F5调试,你就输入参数啊,F10一步一步执行,F11是遇到函数进入函数内

富平县15566322959: vc++6.0中调用system函数,怎么让dos窗口不显示,或最小化啊?? -
褒邰贝尔: c#winform的多线程调用,需要注意一点,窗体的属性,必须由创建它的线程来执行.记住这一点,就基本上不会有什么问题了.你可以使用控件的invoke()方法来实现.

富平县15566322959: 请问在VC++6.0里新插入的对话框如何初始化 -
褒邰贝尔: Ctrl+W调出类向导,为你新建的对话框建一个类,在类向导class name中选中该类,在Message栏中找WM_INITDIALLG,双击,再在下面的Member function中双击选中的那个,新对话框类的OnInitDialog函数就被类向导建立起来了,

富平县15566322959: VC++6.0中对话框中字体大小如何改变 -
褒邰贝尔: 1、可以通过手动设置,右键对话框,选择属性,如下图:然后点击字体可以进行设置.2、可以通过添加代码进行改变,示例代码如下:BOOL __stdcall SetChildFont(HWND hwnd, LPARAM lparam) { CFont *pFont = (CFont*)lparam; CWnd *...

富平县15566322959: 如何设置VC++6.0平台下win32应用程序中对话框资源的位置 -
褒邰贝尔: 对话框资源属性设置中有这方面的设置.

富平县15566322959: 谁能手把手教我用VC++6.0实现点击菜单就能弹出对话框? -
褒邰贝尔: 首先新建一个对话框资源,随便你搞点什么百东东.双击对话框,选择新建一个类,随便你怎么命名了,不要起的很黄很暴力就行了.在资源选项中,选中菜单一栏,新建一个菜单项,ID,名字当然同上了度.右键选择新建的那个菜单项,选择class wizard,增加事件响应,提示你选择哪个类下的,这个由你了.最后点击OK,编辑版代码,就直接跳到编辑区了.然后再你这个类中包含你刚才新建的那个类的头文件,在这个代码编辑区中,写如下代码,假定你新建的类名叫:CDemoDlg,代码如下:CDemoDlg dlg;dlg.DoModel();完事!!!这是模权态对话框,非模态对话框你可以查下MSDN,也比较简单.

富平县15566322959: 如何在vc++6.0的主页面上添加输入提示栏 -
褒邰贝尔: 方法如下: 1、打开控制面板; 2、在打开的控制面板中选择“区域和语言”,如下图红色方框所示. 3、点击“区域和语言”后,就打开如下图所示的“区域和语言”设置对话框,默认位于格式选项中. 4、点击上面选项卡中的“键盘和语言”,然后在打开的设置页面中点击“更改键盘”,如下图红色方框所示. 5、点击更改键盘后,就打开如下图所示的文本服务和输入语言设置对话框. 7、将语言栏的状态改为“悬浮于桌面上”或者“停靠于任务栏”,然后点击右下方的“应用”和“确定”按钮,这样就可以看到输入法的图标了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网