|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍。菜单|右键 WTL嵌进类的架构可使全部程序很明晰,体系托盘气泡提醒、高低文菜单处置能够分离自力出来,以下是完成代码,很明晰就不正文了。基础上这两个类很少必要修正,因而我把它们放到了体系包括文件搜刮路径中。
//ContextMenu.h
#pragmaonce
template<classT>
classCContextMenu
{
public:
BOOLCreateContextMenu(UINTID_Menu)
{
T*pT=static_cast<T*>(this);
CMenumenu;
menu.LoadMenu(ID_Menu);
CMenuSubMenu(menu.GetSubMenu(0));
POINTpos;
GetCursorPos(&pos);
SubMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,pT->m_hWnd);
returnTRUE;
}
};
//ShellIcon.h
#pragmaonce
#defineWM_ICONWM_USER+180
template<classT,classMenuT,intMenuID>
classCShellIcon:publicMenuT
{
private:
NOTIFYICONDATAm_data;
UINTm_msgTaskbarRestart;
CStringm_appName;
public:
CShellIcon()
{
m_appName.LoadString(IDS_APPNAME);
m_msgTaskbarRestart=RegisterWindowMessage(TEXT("TaskbarCreated"));
}
~CShellIcon()
{
Shell_NotifyIcon(NIM_DELETE,&m_data);
}
BOOLCreateShellIcon()
{
T*pT=static_cast<T*>(this);
SecureZeroMemory(&m_data,sizeof(m_data));
m_data.cbSize=sizeof(m_data);
m_data.hIcon=LoadIcon(_Module.get_m_hInst(),MAKEINTRESOURCE(IDR_MAINFRAME));
m_data.hWnd=pT->m_hWnd;
m_data.uID=IDR_MAINFRAME;
m_data.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;
m_data.uCallbackMessage=WM_ICON;
m_data.dwInfoFlags=NIIF_USER;
strcpy_s(m_data.szInfoTitle,m_appName);
strcpy_s(m_data.szTip,m_appName);
returnShell_NotifyIcon(NIM_ADD,&m_data);
}
voidModifyToolTips(LPCTSTRinfo)
{
strcpy_s(m_data.szInfo,info);
}
BOOLDispalyToolTips()
{
returnShell_NotifyIcon(NIM_MODIFY,&m_data);
}
BOOLBalloonToolTips(LPCTSTRinfo)
{
ModifyToolTips(LPCTSTRinfo);
returnDispalyToolTips();
}
BEGIN_MSG_MAP(CShellIcon)
MESSAGE_HANDLER(WM_ICON,OnIcon)
MESSAGE_HANDLER(m_msgTaskbarRestart,OnRestart)
MESSAGE_HANDLER(WM_SIZE,OnSize)
CHAIN_MSG_MAP(MenuT)
END_MSG_MAP()
LRESULTOnIcon(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled)
{
T*pT=static_cast<T*>(this);chart;
if(wParam!=IDR_MAINFRAME)return1;
switch(lParam)
{
caseWM_RBUTTONUP:
t=*m_data.szInfo;
*m_data.szInfo= ;
Shell_NotifyIcon(NIM_MODIFY,&m_data);
pT->CreateContextMenu(MenuID);
*m_data.szInfo=t;
break;
caseWM_LBUTTONUP:
pT->ShowWindow(SW_SHOW);
OpenIcon(pT->m_hWnd);
break;
//往失落上面的正文可使鼠标悬停在图标上时呈现气泡提醒,团体不太喜好
caseWM_MOUSEMOVE:
//DispalyToolTips();break;
default:
;
}
return0;
}
//处置Explorer外壳溃散前任务栏重修,你会发明良多程序都没处置,了局就是Explorer一溃散
//图标就找不到了,假如最小化就任务栏更惨,还得用义务办理器封闭,这个函数我没时机测试,但愿有感化
LRESULTOnRestart(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled)
{
T*pT=static_cast<T*>(this);
SecureZeroMemory(&m_data,sizeof(m_data));
m_data.cbSize=sizeof(m_data);
m_data.hWnd=pT->m_hWnd;
m_data.uID=IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE,&m_data);
CreateShellIcon();
return0;
}
//最小化到体系托盘
LRESULTOnSize(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
T*pT=static_cast<T*>(this);
if(pT->IsIconic())pT->ShowWindow(SW_HIDE);
return0;
}
};
//MyIconMenu.h
#pragmaonce
#include"stdafx.h"
#include<ContextMenu.h>
template<classT>
classCMyIconMenu:publicCContextMenu<T>
{
public:
BEGIN_MSG_MAP(CContextMenu)
COMMAND_ID_HANDLER(ID_RESUME,OnResume)
COMMAND_ID_HANDLER(ID_QUIT,OnQuit)
END_MSG_MAP()
LRESULTOnResume(WORD/*wNotifyCode*/,WORDwID,HWND/*hWndCtl*/,BOOL&/*bHandled*/)
{
T*pT=static_cast<T*>(this);
pT->ShowWindow(SW_SHOW);
OpenIcon(pT->m_hWnd);
return0;
}
LRESULTOnQuit(WORD/*wNotifyCode*/,WORDwID,HWND/*hWndCtl*/,BOOL&/*bHandled*/)
{
PostQuitMessage(0);
return0;
}
};
CContextMenu的利用
假如你的窗口必要高低文菜单,只必要从CContextMenu派生一个类,比方:template<classT>classCMyContextMenu:publicCContextMenu<T>
然后完成动静映照,比方CMyIconMenu所做的。在你的窗口类(假定为CMyWindowClass)的承继列内外面增加publicCMyContextMenu<CMyWindowClass>,在动静映照表中增加CHAIN_MSG_MAP(CMyContextMenu<CMyWindowClass>)
接上去只需在必要显现高低文菜单的中央,挪用CreatContextMenu(UINTID_Menu)就能够了。
CShellIcon的利用
起首要把stdafx.h中IE的版本改成5大概6,比方:
#define_WIN32_IE0x0600
然后到场CString撑持,大概每一个项目都几近用到CString,人人无妨间接修正模板文件,让导游间接把CString加出来算了。
从CContextMenu派生一个类来完成菜单映照,比方CMyIconMenu所作的。
以下用形式对话框来演示怎样给其到场托盘功效,蓝色的部分为增加的部分。
#pragmaonce
#include"MyIconMenu.h"
#include<ShellIcon.h>
classCMainDlg:publicCDialogImpl<CMainDlg>,publicCShellIcon<CMainDlg,CMyIconMenu<CMainDlg>,IDR_ICONMENU>
{
public:
enum{IDD=IDD_MAINDLG};
typedefCShellIcon<CMainDlg,CMyIconMenu<CMainDlg>,IDR_ICONMENU>CMyShellIcon;
BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT,OnAppAbout)
COMMAND_ID_HANDLER(IDOK,OnOK)
COMMAND_ID_HANDLER(IDCANCEL,OnCancel)
CHAIN_MSG_MAP(CMyShellIcon)
END_MSG_MAP()
LRESULTOnInitDialog(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
//centerthedialogonthescreen
CenterWindow();
//seticons
HICONhIcon=(HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON,::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);
SetIcon(hIcon,TRUE);
HICONhIconSmall=(HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR);
SetIcon(hIconSmall,FALSE);
CreateShellIcon();
returnTRUE;
}
……………………
};
在想弹出气泡的时分挪用BOOLBalloonToolTips(LPCTSTRinfo)
我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了? |
|