Click here to Skip to main content
6,595,854 members and growing! (18,687 online)
Email Password   helpLost your password?
Desktop Development » Dialogs and Windows » Dialogs     Intermediate

Message Balloons

By Prateek Kaul, RK_2000

Message Balloons as opposed to Message Boxes
VC6Win2K, WinXP, MFC, Dev
Posted:9 Dec 2001
Updated:28 Nov 2002
Views:138,772
Bookmarked:60 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
15 votes for this article.
Popularity: 4.81 Rating: 4.09 out of 5

1
1 vote, 16.7%
2

3
1 vote, 16.7%
4
4 votes, 66.7%
5

See recent updates to the source, or download older versions of this source below:

Sample Image - MessageBalloons.jpg

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

There are two interfaces to create and show the message balloons.

  • 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 other method to destroy the Balloon before the timer ticks is to call the static function CBalloon::Hide(). 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)

);

See the updates section to see more about this function.

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.

See the updates section to see more about this function.

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 the CBalloonTip::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 in CBalloontip::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);
  • Only one instance of the Balloon is allowed to created at a time using the static variable CBalloonTip::nBalloonInstances

Overview of the demo project

Demo

Just try clicking the "OK" button without entering anything in the the edit boxes.

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.

Updates

The following changes to the code in the updated version have been made by R. Khalili:

  1. The OnPaint and Show methods have been updated to do a better job.
  2. The message balloon doesn't stay on top of applications as you switch between apps.
  3. There is more rigorous checking to prevent crashes as a result of null pointers, etc...

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...

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Authors

Prateek Kaul


Member

Occupation: Web Developer
Location: India India

RK_2000


Member
I have been programming for the past 5 years or so. I started out with C for about 1 year, then took a break and ended up doing Access and VB for a short while. It was then followed by more C, a bit of Java and database development in Oracle and SQL Server and web development in ASP, until I arrived in the C++ and MS windows world. I have been working with MFC for the past 2-3 years and have some COM and Win32 API experience as well. I have recently begun the journey of .NET as well, trying to keep up with the latest hype.
Occupation: Web Developer
Location: Canada Canada

Other popular Dialogs and Windows articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 26 (Total in Forum: 26) (Refresh)FirstPrevNext
GeneralIt MUST get the bug:Memory Leak PinmemberShuly1:43 16 May '07  
GeneralSome remarks Pinmembercristitomi7:18 21 Mar '07  
QuestionConvert the code to dll Pinmemberx1372938818:24 5 Jan '07  
GeneralIt don't works! Pinmembermarkechidna5:57 30 Oct '04  
GeneralRe: It don't works! PinmemberThatsAlok23:19 9 Jan '05  
GeneralFont Color Change Pinmemberdiilbert11:26 30 Apr '04  
GeneralRe: Font Color Change PinmemberAndré Voigt2:01 5 May '04  
GeneralERROR and 32 Warnings PinmemberBalkrishna Talele0:39 12 Dec '03  
GeneralRe: ERROR and 32 Warnings Pinmemberdiilbert16:30 30 Apr '04  
GeneralRe: ERROR and 32 Warnings Pinmembersonawane ajay20:44 2 Aug '04  
Generalplayer's fix Pinmemberp1ayer21:45 24 Nov '03  
GeneralRe: player's fix Pinmembercristitomi7:01 21 Mar '07  
Generalnew source bad for 98 PinmemberEndLESSracingZ5:30 22 Sep '03  
GeneralCreateBalloon Suggestion... Pinmemberadlpena14:38 24 May '03  
GeneralMicrosoft Web Browser Object into DialogBox, without MFC? PinmemberAdrian Bacaianu21:46 8 Apr '03  
GeneralNot Working + Fix PinmemberBandu Patil1:17 7 Jun '02  
GeneralRe: Not Working + Fix Pinmemberbaifriend15:51 3 Dec '02  
GeneralRe: Not Working + Fix PinsussAnonymous19:15 3 Dec '02  
GeneralMemory leak Pinmemberlaotong0:07 26 Mar '02  
GeneralNot working under Win2000? PinmemberDavide Calabro0:18 11 Dec '01  
GeneralRe: Not working under Win2000? PinmemberPrateek Kaul0:47 11 Dec '01  
GeneralRe: Not working under Win2000? PinmemberMarc M20:28 11 Dec '01  
GeneralMessage is non-modal PinmemberAlex Farber5:35 10 Dec '01  
GeneralRe: Message is non-modal PinmemberRoger Allen1:04 11 Dec '01  
Generalwrong link PinmemberLove In Snowing1:04 10 Dec '01  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 28 Nov 2002
Editor: Chris Maunder
Copyright 2001 by Prateek Kaul, RK_2000
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project