Здравствуйте, Аноним, Вы писали:
А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?
// Pavel Amialiushka
// TrayWindow.h
#pragma once
template<typename T> class TrayWindow
{
int NIM_NOTIFYICON;
int NIM_TASKBAR_CREATED;
protected:
bool installed_;
enum { NOTIFY_ICON = -1 };
static HICON GetNotifyIcon()
{
return ::LoadIcon(
_Module.GetResourceInstance(),
MAKEINTRESOURCE( T::NOTIFY_ICON ));
}
std::string GetNotifyString()
{
return "My cool Appication";
}
bool DoHideOnMinimize()
{
return true;
}
public:
TrayWindow()
{
installed_ = false;
NIM_NOTIFYICON = ::RegisterWindowMessage("NotifyIcon Message");
NIM_TASKBAR_CREATED = ::RegisterWindowMessage("TaskbarCreated");
}
void InstallNotifyIcon()
{
installed_ = true;
NOTIFYICONDATA data={sizeof(NOTIFYICONDATA), static_cast<T*>(this)->m_hWnd, 0};
data.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
data.uCallbackMessage=NIM_NOTIFYICON;
lstrcpy(data.szTip, static_cast<T*>(this)->GetNotifyString().c_str());
data.hIcon=static_cast<T*>(this)->GetNotifyIcon();
Shell_NotifyIcon(NIM_ADD, &data);
}
void UninstallNotifyIcon()
{
installed_ = false;
T* lp = static_cast<T*>(this);
NOTIFYICONDATA data={sizeof(NOTIFYICONDATA), lp->m_hWnd, 0};
Shell_NotifyIcon(NIM_DELETE, &data);
}
bool IsWindowHidden()
{
return !static_cast<T*>(this)->IsWindowVisible();
}
void HideMainWindow()
{
T* pT = static_cast<T*>(this);
if (!IsIconic(*pT))
{
pT->ShowWindow(SW_MINIMIZE);
}
pT->ShowWindow(SW_HIDE);
//pT->SetWindowLong(GWL_HWNDPARENT, (LONG)::GetDesktopWindow());
}
void ShowMainWindow()
{
T* wnd = static_cast<T*>(this);
if (IsWindowHidden())
{
//wnd->SetWindowLong(GWL_HWNDPARENT, (LONG)NULL);
wnd->ShowWindow(SW_SHOW);
wnd->ShowWindow(SW_RESTORE);
}
::SetForegroundWindow(static_cast<T*>(this)->m_hWnd);
}
public:
BEGIN_MSG_MAP(TrayWindow<T>)
MESSAGE_HANDLER(NIM_NOTIFYICON, OnIconMessage);
MESSAGE_HANDLER(NIM_TASKBAR_CREATED, OnTasbarCreated);
MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand);
END_MSG_MAP();
protected:
void OnIconRButtonClick()
{
}
void OnIconLButtonClick()
{
if (IsWindowHidden()) ShowMainWindow();
else HideMainWindow();
}
LRESULT OnIconMessage(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
switch(lParam)
{
case WM_RBUTTONDOWN:
case WM_CONTEXTMENU:
static_cast<T*>(this)->OnIconRButtonClick();
break;
case WM_LBUTTONDOWN:
static_cast<T*>(this)->OnIconLButtonClick();
break;
}
return 0;
}
LRESULT OnTasbarCreated(UINT, WPARAM, LPARAM, BOOL& bHandled)
{ bHandled = false;
if (installed_) InstallNotifyIcon();
return 0;
}
LRESULT OnSysCommand(UINT, WPARAM code, LPARAM, BOOL& bHandled)
{ bHandled = false;
if (DoHideOnMinimize() && code==SC_MINIMIZE)
{
HideMainWindow();
bHandled = true;
}
return 0;
}
};
Здравствуйте, <Аноним>, Вы писали:
А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?
Я пользуюсь
этим .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, <Аноним>, Вы писали:
А>Не подскажите, есть ли классовые обёртки в ATL/WTL для работы с треем ?
WTL Tray Icon Template... << RSDN@Home 1.1.4 stable SR1 rev. 568>>