Message Balloons
Posted
by Prateek Kaul
on December 12th, 2001
Click here for larger image
Environment: VC++ 6.0, MFC, Windows 2000/XP/9x/ME/NT
Introduction
There are times when one would like to display messages in an non-obtrusive way. Message Balloons are one of the new ways. Message Balloons are taking precedence over message boxes for small display messages as they even prevent the user from clicking an OK and still get the message across. These kind of Message Balloons are becoming a part of standard user interface with MSN explorer and Windows XP. Still no library has been provided for making these balloons. Hence this attempt.
How to use the class provided ?
Include the following two files in your project:
- BalloonTip.h
- BalloonTip.cpp
- CBalloonTip::Show()
- CBalloonTip::Hide()
CBalloonTip::Show()-: This is a pseudo constructor because we want to force heap creation of the balloon, so that it remains in the memory even after it has been called. It will be automatically destroyed when a it receives a
WM_TIMER message which is set in the CBalloon::MakeVisible(). The constructor for CBalloonTip is protected, hence this helps in forcing heap creation.The following code shows how to create a Message Balloon and show it.
LOGFONT lf;
::ZeroMemory (&lf, sizeof (lf));
lf.lfHeight = 16;
lf.lfWeight = FW_BOLD;
lf.lfUnderline = FALSE;
::strcpy (lf.lfFaceName, _T("Arial"));
CBalloonTip::Show(
CPoint(200, 200), // Point on the screen where
// the tip will be shown
CSize(250, 100), // Size of the total rectangle
// encompassing the balloon
_T("Please enter a password !!"), // Message to be shown
// in the balloon
lf, // LOGFONT structure for
// font properties
5, // Time in seconds to show the balloon
FALSE // TRUE == Balloon is up(Balloon Tip is down)
// FALSE == Balloon is down(Balloon Tip is up)
);
CBalloonTip::Hide()-: This is for destroying the Balloon for any particular condition that may arise before it is automatically destroyed in the CBalloonTip::OnTimer(). Either way if CBalloonTip::Hide() is not called the Balloon is destroyed in CBalloonTip::OnTimer(). So the caller(user of this class) does not need to worry about the memory cleanup.
Class Design Details
CBalloonTip is derived from CFrameWnd. The balloon is created from the combination of two regions, one is a polygon region to show the the Balloon Tip and the other is a Round Rectangle region. This is done in theCBalloonTip::OnCreate().
int CBalloonTip::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//..........Some code
//...................
CRgn rgnComb;
rgnComb.CreateRectRgn( t_Rect.left,
t_Rect.top,
t_Rect.right,
t_Rect.bottom);
int iRetComb = rgnComb.CombineRgn(&m_rgnTip,
&m_rgnRoundRect,
RGN_OR);
}
The m_rgnTip and m_rgnRoundRect are created with different calculations depending upon whether the balloon tip is down or up.
The visible window or balloon region is finally set using SetWindowRgn(rgnComb.operator HRGN(), TRUE) in the CBalloonTip::OnCreate().
The Balloon window is not shown up in the taskbar by making the Balloon a child of an invisible parent in
CBalloonTip::PreCreateWindow()
This parent window is a member variable (CBalloon::m_wndInvisibleParent) of the class itself and is destroyed automatically when the Balloon is destroyed. So the non-appearance of the Balloon window in the task bar is taken care of automatically.
BOOL CBalloonTip::PreCreateWindow(CREATESTRUCT& cs)
{
//...............Some code
//........................
if (!::IsWindow(m_wndInvisibleParent.m_hWnd))
{
// Try creating the invisible parent window
PCSTR pstrOwnerClass = ::AfxRegisterWndClass(0);
BOOL bError = m_wndInvisibleParent.CreateEx(
0,
pstrOwnerClass,
_T(""),
WS_POPUP,
0,
0,
0,
0,
NULL,
0
);
}
}
Window Creation
The balloon is created with respect from the point where it is supposed to be displayed. So the calculation of balloon rectangle has to be recalculated w.r.t the point at which it is to be shown. Different calculations have to be done if the Balloon tip is down or up. This is done inCBalloontip::Show() as shown below,
CBalloonTip* CBalloonTip::Show( CPoint pt,
CSize size,
CString strMessage,
LOGFONT lf,
UINT nSecs,
BOOL bBalloonUp)
{
//.........Some code
//..................
if (bBalloonUp)
{
nRectLeft = pt.x - (size.cx * 0.65);
nRectRight = pt.x + (size.cx * 0.35);
nRectTop = pt.y - size.cy;
nRectBottom = pt.y;
}
else
{
nRectLeft = pt.x - (size.cx * 0.35);
nRectRight = pt.x + (size.cx * 0.65);
nRectTop = pt.y;
nRectBottom = pt.y + (size.cy);
}
}
The actual Windows. window balloon is created in CBalloonTip::Show() using
pBalloonTip->Create( CRect( nRectLeft,
nRectTop,
nRectRight,
nRectBottom));
The CRect passed in the above function will represent the actual position of the balloon in screen co-ordinates. The timer for the Balloon destruction is set in the next line in CBalloonTip::Show()
pBalloonTip->MakeVisisble(nSecs);
CBalloonTip::nBalloonInstancesOverview of the demo project
Compatibility
Tested using VC++ 6 with MFC on Windows 2000. Should work fine on other Windows OSs(95/98/NT/ME/XP) also, as it uses no OS specific code.Conclusion
I hope that this contribution will make some improvement in the user interface code of your forthcoming programs!!! Any suggestions, improvements or bugs detected are welcome. Enjoy.....Downloads
Download demo project - 15 KbDownload source - 6 Kb

Comments
New one
Posted by snareenactina on 12/01/2012 11:31pmlaguardia Globalization has continually increased international competition in sports. Yahoo! Small Business Itââ¬â¢s true that many workers are likely to initially save at least part of the extra money in their paycheck that will appear as a result of a payroll tax cut. That will ultimately help solve the problem that has been the greatest drag on national growth: The enormous debt that burdens middle class households. chystala So if I were the MPAA, how would I handle this? jianshefei Our testers put 100s of products through their paces at our National Testing and Research Center. Learn more about how we test for: warwickshire Processing tomatoes But the enormous recent finds have led to demands for greater equality. The so-called nonproducing states have been making the argument in Congress that mineral rights belong to Brazilians as a whole and the proceeds should be divided accordingly. teske Companies all over the UK face similar challenges in the pursuit of growth, writes Brian Groom shortcomings I dont think this is so and what Alex's argument lacks is any analysis of power in society. Our decisions about how and what to change about our lives is not wholly our own. To present it as such is wildly naive and ahistorical. stewing Orders are not shipped or delivered on weekends or holidays.
ReplyGoal
Posted by snareenactina on 11/12/2012 06:12amgvbpublic Country reports for all countries of the world can be found via the following link: Venezuelaââ¬â¢s President Hugo Chavez oversaw the inauguration of a new petrochemical complex and a thermoelectric power plant yesterday, while responding to opposition criticisms that the broadcast of such events constitutes ââ¬Åcampaigning.ââ¬Å¥ Hi Matt! yellowthroat As the major epicenter of world trade, the United States enjoys leverage that many other nations do not. For one, since it is the world's leading consumer, it is the number one customer of companies all around the world. Many businesses compete for a share of the United States market. In addition, the United States occasionally uses its economic leverage to impose economic sanctions in different regions of the world. USA is the top export market for almost 60 trading nations worldwide. broods Background - Shortcut: b phonology Sure, but don't leave the bankers out of the equation. Ultimately the government does what the bankers want. projectcbm Vietnam ranks 109 out of 177 countries on the Human Development Index. chirurgus Follow us: birdbus BRAZIL has a lot to be proud of. A decade of faster growth and progressive social policies has brought a prosperity that is ever more widely shared. The unemployment rate for April, at 6.4%, is the lowest on record. Credit is booming, particularly to the swelling numbers who have moved out of poverty and into the middle class. Income inequality, though still high, has fallen sharply. For most Brazilians life has never been so good. rnib After viewing product detail pages or search results, look here to find an easy way to navigate back to pages you are interested in.
ReplyUse CToolTipCtrl, this doesn't work.
Posted by Legacy on 04/12/2002 12:00amOriginally posted by: Paul Richards
Don't even bother with this, CToolTipCtrl supports multiline, and delay times.
Search this site for CToolTipCtrl for more info.
Replynice idea, Doesnt Work Feb02
Posted by Legacy on 02/20/2002 12:00amOriginally posted by: cts
No Balloons in Wind98 VC6
ReplyThe Reason of balloon can't see!
Posted by Legacy on 12/14/2001 12:00amOriginally posted by: DaFu Chen
It has a bug in the CBalloonDialogDlg::OnOK()
pEditName->GetLine(0, szName);
pEditPassWd->GetLine(0, szPassWd);
The GetLine() fuction has two versions :
int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int MaxLength ) const;
For two parameters version, the first word of the buffer must specify the maximum number of bytes that can be copied to the buffer.
So, change them to three parameters version like this:
pEditName->GetLine(0, szName,40);
pEditPassWd->GetLine(0, szPassWd,40);
Now if you have not input the user name or password and press the "OK" button, you can see the balloons
Good luck
ReplyNo Baloon seen on Win98
Posted by Legacy on 12/13/2001 12:00amOriginally posted by: Hari Ramakrishnan P
I tried it for Win98, i cann't see any baloon.
ReplyGood one....
Posted by Legacy on 12/12/2001 12:00amOriginally posted by: Srinidhi Rao
ReplyCool.. but..
Posted by Legacy on 12/11/2001 12:00amOriginally posted by: soichi
As far as I see on the article, it looks really nice. But the zip files for the project you attached to the article contains CRC error on the resouce.rc! :) It will be nice if you could fix this problem.
Thanks!
Reply