added MSW-specific wxTaskBarIcon::ShowBalloon() method; use it in the taskbar sample (and also clean it up significantly)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50402 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -33,6 +33,24 @@ public:
|
|||||||
bool RemoveIcon(void);
|
bool RemoveIcon(void);
|
||||||
bool PopupMenu(wxMenu *menu);
|
bool PopupMenu(wxMenu *menu);
|
||||||
|
|
||||||
|
// MSW-specific class methods
|
||||||
|
|
||||||
|
// show a balloon notification (the icon must have been already initialized
|
||||||
|
// using SetIcon)
|
||||||
|
//
|
||||||
|
// title and text are limited to 63 and 255 characters respectively, msec
|
||||||
|
// is the timeout, in milliseconds, before the balloon disappears (will be
|
||||||
|
// clamped down to the allowed 10-30s range by Windows if it's outside it)
|
||||||
|
// and flags can include wxICON_ERROR/INFO/WARNING to show a corresponding
|
||||||
|
// icon
|
||||||
|
//
|
||||||
|
// return true if balloon was shown, false on error (incorrect parameters
|
||||||
|
// or function unsupported by OS)
|
||||||
|
bool ShowBalloon(const wxString& title,
|
||||||
|
const wxString& text,
|
||||||
|
unsigned msec = 0,
|
||||||
|
int flags = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class wxTaskBarIconWindow;
|
friend class wxTaskBarIconWindow;
|
||||||
|
|
||||||
|
@@ -9,6 +9,14 @@
|
|||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// For compilers that support precompilation, includes "wx.h".
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
#include "wx/wxprec.h"
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
@@ -28,39 +36,99 @@
|
|||||||
#include "smile.xpm"
|
#include "smile.xpm"
|
||||||
|
|
||||||
#include "wx/taskbar.h"
|
#include "wx/taskbar.h"
|
||||||
|
|
||||||
#include "tbtest.h"
|
#include "tbtest.h"
|
||||||
|
|
||||||
// Declare two frames
|
// ----------------------------------------------------------------------------
|
||||||
MyDialog *dialog = NULL;
|
// global variables
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static MyDialog *gs_dialog = NULL;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// MyApp
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_APP(MyApp)
|
IMPLEMENT_APP(MyApp)
|
||||||
|
|
||||||
bool MyApp::OnInit(void)
|
bool MyApp::OnInit()
|
||||||
{
|
{
|
||||||
if ( !wxApp::OnInit() )
|
if ( !wxApp::OnInit() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the main frame window
|
// Create the main window
|
||||||
dialog = new MyDialog(NULL, wxID_ANY, wxT("wxTaskBarIcon Test Dialog"), wxDefaultPosition, wxSize(365, 290));
|
gs_dialog = new MyDialog(wxT("wxTaskBarIcon Test Dialog"));
|
||||||
|
|
||||||
dialog->Show(true);
|
gs_dialog->Show(true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// MyDialog implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(MyDialog, wxDialog)
|
BEGIN_EVENT_TABLE(MyDialog, wxDialog)
|
||||||
|
EVT_BUTTON(wxID_ABOUT, MyDialog::OnAbout)
|
||||||
EVT_BUTTON(wxID_OK, MyDialog::OnOK)
|
EVT_BUTTON(wxID_OK, MyDialog::OnOK)
|
||||||
EVT_BUTTON(wxID_EXIT, MyDialog::OnExit)
|
EVT_BUTTON(wxID_EXIT, MyDialog::OnExit)
|
||||||
EVT_CLOSE(MyDialog::OnCloseWindow)
|
EVT_CLOSE(MyDialog::OnCloseWindow)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
MyDialog::MyDialog(wxWindow* parent, const wxWindowID id, const wxString& title,
|
MyDialog::MyDialog(const wxString& title)
|
||||||
const wxPoint& pos, const wxSize& size, const long windowStyle):
|
: wxDialog(NULL, wxID_ANY, title)
|
||||||
wxDialog(parent, id, title, pos, size, windowStyle)
|
|
||||||
{
|
{
|
||||||
Init();
|
wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
wxSizerFlags flags;
|
||||||
|
flags.Border(wxALL, 10);
|
||||||
|
|
||||||
|
sizerTop->Add(new wxStaticText
|
||||||
|
(
|
||||||
|
this,
|
||||||
|
wxID_ANY,
|
||||||
|
_T("Press 'Hide me' to hide this window, Exit to quit.")
|
||||||
|
), flags);
|
||||||
|
|
||||||
|
sizerTop->Add(new wxStaticText
|
||||||
|
(
|
||||||
|
this,
|
||||||
|
wxID_ANY,
|
||||||
|
_T("Double-click on the taskbar icon to show me again.")
|
||||||
|
), flags);
|
||||||
|
|
||||||
|
sizerTop->AddStretchSpacer()->SetMinSize(200, 50);
|
||||||
|
|
||||||
|
wxSizer * const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
sizerBtns->Add(new wxButton(this, wxID_ABOUT, _T("&About")), flags);
|
||||||
|
sizerBtns->Add(new wxButton(this, wxID_OK, _T("&Hide")), flags);
|
||||||
|
sizerBtns->Add(new wxButton(this, wxID_EXIT, _T("E&xit")), flags);
|
||||||
|
|
||||||
|
sizerTop->Add(sizerBtns, flags.Align(wxALIGN_CENTER_HORIZONTAL));
|
||||||
|
SetSizerAndFit(sizerTop);
|
||||||
|
Centre();
|
||||||
|
|
||||||
|
m_taskBarIcon = new MyTaskBarIcon();
|
||||||
|
#if defined(__WXCOCOA__)
|
||||||
|
m_dockIcon = new MyTaskBarIcon(wxTaskBarIcon::DOCK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// we should be able to show up to 128 characters on recent Windows versions
|
||||||
|
// (and 64 on Win9x)
|
||||||
|
if ( !m_taskBarIcon->SetIcon(wxICON(sample),
|
||||||
|
"wxTaskBarIcon Sample\n"
|
||||||
|
"With a very, very, very, very\n"
|
||||||
|
"long tooltip whose length is\n"
|
||||||
|
"greater than 64 characters.") )
|
||||||
|
{
|
||||||
|
wxLogError(wxT("Could not set icon."));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyDialog::~MyDialog()
|
MyDialog::~MyDialog()
|
||||||
@@ -71,6 +139,22 @@ MyDialog::~MyDialog()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyDialog::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
static const char * const title = "About wxWidgets Taskbar Sample";
|
||||||
|
static const char * const message
|
||||||
|
= "wxWidgets sample showing wxTaskBarIcon class\n"
|
||||||
|
"\n"
|
||||||
|
"(C) 1997 Julian Smart\n"
|
||||||
|
"(C) 2007 Vadim Zeitlin";
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
m_taskBarIcon->ShowBalloon(title, message, 15000, wxICON_INFORMATION);
|
||||||
|
#else // !__WXMSW__
|
||||||
|
wxMessageBox(message, title, wxICON_INFORMATION, this);
|
||||||
|
#endif // __WXMSW__/!__WXMSW__
|
||||||
|
}
|
||||||
|
|
||||||
void MyDialog::OnOK(wxCommandEvent& WXUNUSED(event))
|
void MyDialog::OnOK(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
Show(false);
|
Show(false);
|
||||||
@@ -86,34 +170,10 @@ void MyDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
|
|||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyDialog::Init(void)
|
|
||||||
{
|
|
||||||
(void)new wxStaticText(this, wxID_ANY, _T("Press 'Hide me' to hide me, Exit to quit."),
|
|
||||||
wxPoint(10, 20));
|
|
||||||
|
|
||||||
(void)new wxStaticText(this, wxID_ANY, _T("Double-click on the taskbar icon to show me again."),
|
|
||||||
wxPoint(10, 40));
|
|
||||||
|
|
||||||
(void)new wxButton(this, wxID_EXIT, _T("Exit"), wxPoint(185, 230), wxSize(80, 25));
|
|
||||||
(new wxButton(this, wxID_OK, _T("Hide me"), wxPoint(100, 230), wxSize(80, 25)))->SetDefault();
|
|
||||||
Centre(wxBOTH);
|
|
||||||
|
|
||||||
m_taskBarIcon = new MyTaskBarIcon();
|
|
||||||
#if defined(__WXCOCOA__)
|
|
||||||
m_dockIcon = new MyTaskBarIcon(wxTaskBarIcon::DOCK);
|
|
||||||
#endif
|
|
||||||
// we should be able to show up to 128 characters on recent Windows versions
|
|
||||||
// (and 64 on Win9x)
|
|
||||||
if (!m_taskBarIcon->SetIcon(wxICON(sample),
|
|
||||||
"wxTaskBarIcon Sample\n"
|
|
||||||
"With a very, very, very, very\n"
|
|
||||||
"long tooltip whose length is\n"
|
|
||||||
"greater than 64 characters."))
|
|
||||||
{
|
|
||||||
wxMessageBox(wxT("Could not set icon."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// MyTaskBarIcon implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@@ -140,12 +200,12 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
void MyTaskBarIcon::OnMenuRestore(wxCommandEvent& )
|
void MyTaskBarIcon::OnMenuRestore(wxCommandEvent& )
|
||||||
{
|
{
|
||||||
dialog->Show(true);
|
gs_dialog->Show(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyTaskBarIcon::OnMenuExit(wxCommandEvent& )
|
void MyTaskBarIcon::OnMenuExit(wxCommandEvent& )
|
||||||
{
|
{
|
||||||
dialog->Close(true);
|
gs_dialog->Close(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool check = true;
|
static bool check = true;
|
||||||
@@ -197,5 +257,5 @@ wxMenu *MyTaskBarIcon::CreatePopupMenu()
|
|||||||
|
|
||||||
void MyTaskBarIcon::OnLeftButtonDClick(wxTaskBarIconEvent&)
|
void MyTaskBarIcon::OnLeftButtonDClick(wxTaskBarIconEvent&)
|
||||||
{
|
{
|
||||||
dialog->Show(true);
|
gs_dialog->Show(true);
|
||||||
}
|
}
|
||||||
|
@@ -43,13 +43,11 @@ public:
|
|||||||
class MyDialog: public wxDialog
|
class MyDialog: public wxDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MyDialog(wxWindow* parent, const wxWindowID id, const wxString& title,
|
MyDialog(const wxString& title);
|
||||||
const wxPoint& pos, const wxSize& size, const long windowStyle = wxDEFAULT_DIALOG_STYLE);
|
|
||||||
virtual ~MyDialog();
|
virtual ~MyDialog();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Init();
|
void OnAbout(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnOK(wxCommandEvent& event);
|
void OnOK(wxCommandEvent& event);
|
||||||
void OnExit(wxCommandEvent& event);
|
void OnExit(wxCommandEvent& event);
|
||||||
void OnCloseWindow(wxCloseEvent& event);
|
void OnCloseWindow(wxCloseEvent& event);
|
||||||
|
@@ -177,7 +177,7 @@ bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
|
|||||||
notifyData.uFlags |= NIF_TIP;
|
notifyData.uFlags |= NIF_TIP;
|
||||||
if ( !tooltip.empty() )
|
if ( !tooltip.empty() )
|
||||||
{
|
{
|
||||||
wxStrncpy(notifyData.szTip, tooltip.c_str(), WXSIZEOF(notifyData.szTip));
|
wxStrncpy(notifyData.szTip, tooltip.wx_str(), WXSIZEOF(notifyData.szTip));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = wxShellNotifyIcon(m_iconAdded ? NIM_MODIFY
|
bool ok = wxShellNotifyIcon(m_iconAdded ? NIM_MODIFY
|
||||||
@@ -189,6 +189,32 @@ bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wxTaskBarIcon::ShowBalloon(const wxString& title,
|
||||||
|
const wxString& text,
|
||||||
|
unsigned msec,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( m_iconAdded, false,
|
||||||
|
_T("can't be used before the icon is created") );
|
||||||
|
|
||||||
|
NotifyIconData notifyData(GetHwndOf(m_win));
|
||||||
|
notifyData.uFlags |= NIF_INFO;
|
||||||
|
notifyData.uTimeout = msec;
|
||||||
|
wxStrncpy(notifyData.szInfo, text.wx_str(), WXSIZEOF(notifyData.szInfo));
|
||||||
|
wxStrncpy(notifyData.szInfoTitle, title.wx_str(),
|
||||||
|
WXSIZEOF(notifyData.szInfoTitle));
|
||||||
|
|
||||||
|
if ( flags & wxICON_INFORMATION )
|
||||||
|
notifyData.dwInfoFlags |= NIIF_INFO;
|
||||||
|
else if ( flags & wxICON_WARNING )
|
||||||
|
notifyData.dwInfoFlags |= NIIF_WARNING;
|
||||||
|
else if ( flags & wxICON_ERROR )
|
||||||
|
notifyData.dwInfoFlags |= NIIF_ERROR;
|
||||||
|
|
||||||
|
return wxShellNotifyIcon(NIM_MODIFY, ¬ifyData) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool wxTaskBarIcon::RemoveIcon()
|
bool wxTaskBarIcon::RemoveIcon()
|
||||||
{
|
{
|
||||||
if (!m_iconAdded)
|
if (!m_iconAdded)
|
||||||
|
Reference in New Issue
Block a user