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:
Vadim Zeitlin
2007-12-01 16:25:30 +00:00
parent 3ecee463f5
commit cdcfde5d20
4 changed files with 150 additions and 48 deletions

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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, &notifyData) != 0;
}
bool wxTaskBarIcon::RemoveIcon() bool wxTaskBarIcon::RemoveIcon()
{ {
if (!m_iconAdded) if (!m_iconAdded)