Click here to Skip to main content
6,306,412 members and growing! (17,239 online)
Email Password   helpLost your password?
Desktop Development » Dialogs and Windows » Dialogs     Intermediate

MSN Messenger type status bar popup message box

By Prateek Kaul

MSN Messenger type status bar popup message box
VC6, VC7Win2K, MFC, Dev
Posted:14 Oct 2001
Updated:21 Oct 2001
Views:342,702
Bookmarked:153 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
44 votes for this article.
Popularity: 6.75 Rating: 4.11 out of 5
2 votes, 7.7%
1

2
3 votes, 11.5%
3
9 votes, 34.6%
4
12 votes, 46.2%
5

Sample Image - StatusBarMsgWnd.jpg

Introduction

One of the interesting things I found in the recent times about Windows programming was the popping up of status bar message windows when somebody logs in MSN messenger. Here is the code I would like to share with anyone out there who would also like to use it, but was not able to do so because of no direct API help for the following task.

How to use the source code

Include the following files in your project.

  • StatusBarMsgWnd.h
  • StatusBarMsgWnd.cpp

Following lines show how to create an object of CStatusBarMsgWnd and use it to pop up a window. We use a pseudo contructor called CreateObject() because we want to force heap creation. For making the normal constructor unavailable we make it "private". We want to make the object on the heap because the PopMsg() function will trigger timers and animate the popping up and collapsing of the window even after it has returned. So the message window should remain in memory till all timers subside and the window collapses. This even makes the parent application more responsive than using Sleep() API which I had used earlier. Using Sleep() made the application block till the window got destroyed.

CStatusBarMsgWnd* t_MsgWnd = CStatusBarMsgWnd::CreateObject(
    _T("Some idiot has signed in !!"), // the message to be displayed

    180, // width of the window

    150, // height of window   

    4000, // time for the message to be displayed

    10, // delay for animation, how fast the window opens and closes

    CRect(30, 30, 130, 110), // rectangle in the window where the 

                             //message will be displayed 

    this // parent of the message window

    );
t_MsgWndMsg.PopMsg();

Details

The PopMsg() function first checks, where is the status bar on the desktop? There are only four cases

  1. Status bar at the bottom of the screen.
  2. Status bar at top of the screen.
  3. Status bar at the left of the screen
  4. Status bar at the right of the screen.

The following code of PopMsg() function is shown

void CStatusBarMsgWnd::PopMsg()
{
    if (CheckIfStatusBarBottom())  
        // Most frequent case is status bar at bottom

    {
        PopWndForBottomStatusBar();
    }
    else
    {
        if (CheckIfStatusBarTop())
        {
            PopWndForTopStatusBar();
        }
        else
        {
            if (CheckIfStatusBarLeft())
            {
                PopWndForLeftStatusBar();
            }
            else
            {
                PopWndForRightStatusBar();
            }
        }
    }
}

The CheckIfStatusBarBottom() (or CheckIfStatusBarTop(), CheckIfStatusBarLeft()) functions use GetSystemMetrics() and SystemParatmeterInfo() APIs to calculate the full screen area and the area on the screen minus the status bar. Then with some elementary high school mathematics we calculate where exactly the status bar is (bottom, top, left or right) and appropriately show the message window with some animation.

The real action occurs in the OnTimer() function which gets triggered because of WM_TIMER messages. There are three timers

  1. IDT_POP_WINDOW_TIMER -> Gets triggered for animating popup
  2. IDT_SHOW_WINDOW_TIMER -> Gets triggered for showing and keeping the window in position for some time
  3. IDT_COLLAPSE_WINDOW_TIMER -> Gets triggered for animating window collapse

There are three other constants namely STP_BOTTOM, STP_TOP, STP_RIGHT and STP_LEFT which represent where the status bar position is. These are used in OnTimer) for the appropriate animation calculations.

The window is automatically deleted after collapsing in the OnTimer() function using delete this. That's the reason we force this window's creation on heap

Class Details

The class CStatusBarMsgWnd is derived from CFrameWnd. The title bar is removed in the OnCreate() member function. Two CFont objects are created, one underlined font and the other non-underlined. We show the underlined font when mouse is above the window using OnMouseHover() function (for WM_MOUSEHOVER message). Similarly we use the non-underlined font when the mouse leaves the window with OnMouseLeave() function (for WM_MOUSELEAVE message). Initialize a "hand" cursor m_hCursor for showing the mouse when it is over the window.

Rewrite the OnLButtonDown() for the WM_LBUTTONDOWN message to suit any thing you would like to do. At this point OnLButtonDown() only shows a message box. You can change and do anything to suit your needs.

int CStatusBarMsgWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    ModifyStyle(WS_CAPTION, 0, 
        SWP_FRAMECHANGED); // removes title bar


    // Start creating two fonts, one underlined , 

    // other non underlined 

    
    // LOGFONT structure for font properties

    LOGFONT lf;
    ::ZeroMemory (&lf, sizeof (lf));
    lf.lfHeight = 100;
    lf.lfWeight = FW_BOLD;
    lf.lfUnderline = TRUE;

    ::strcpy (lf.lfFaceName, _T("Arial"));

    // Prepare for an underlined font

    m_fontMessageUnderline.CreatePointFontIndirect(&lf);

    // Prepare  an non underlined font

    lf.lfUnderline = FALSE;
    m_fontMessageNoUnderline.CreatePointFontIndirect(&lf);

    // Initialize the cursor.

    m_hCursor = ::LoadCursor(NULL, IDC_HAND);

    return 0;
}

How to use the demo project exe

Double click the popwnd.exe and use the "Message Menu" to pop up a message window

Future Work to be done, in progress...

  • MSN messenger uses color scheme in the message box taking the color from the active title bar.

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 Author

Prateek Kaul


Member

Occupation: Web Developer
Location: India India

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 55 (Total in Forum: 55) (Refresh)FirstPrevNext
Generalhow can i do this in c#? Pinmembercodrobin3:09 28 Nov '07  
GeneralKilltimer Pinmembercarlos gomes12:26 5 Mar '06  
GeneralNot working when you uncheck the "Keep the task bar on top of the other windows" PinmemberVenkatakrishnan Krishnan7:35 28 Jul '05  
GeneralTwo or more popups at the same time Pinmemberagabi77:57 15 Feb '05  
GeneralMessage Box position Pinsusstoto_at7:17 29 Nov '04  
Generalhow to change the browser's status bar's font color Pinsusskarthi_dac200018:51 29 Sep '03  
General(Other) widgets on popup?? Pinmemberadonadon7:44 6 Jul '03  
GeneralMSN Autoresponder PinsussJDBarclay8:19 30 Jun '03  
Generalhow to change the background? Pinmemberhappy888820:05 19 Jun '03  
GeneralImplementing this on a webpage !help! Pinmemberrtrajan7:28 9 Jun '03  
GeneralDialog Based Application Pinmemberiffi9925:04 29 May '03  
GeneralMicrosoft Web Browser Object into DialogBox, without MFC? PinmemberAdrian Bacaianu21:42 8 Apr '03  
GeneralRe: Microsoft Web Browser Object into DialogBox, without MFC? Pinmember.S.Rod.22:11 8 Apr '03  
GeneralTaskbar position PinmemberWeng Wei1:54 8 Feb '03  
GeneralHow i stop to transfer the focus on the popup window? PinmemberSaeed A. Siddiqui21:21 5 Nov '02  
GeneralRe: How i stop to transfer the focus on the popup window? PinsussPrateek K5:37 6 Nov '02  
GeneralRe: How i stop to transfer the focus on the popup window? Pinmembersanpee17:27 21 Jul '04  
GeneralRe: How i stop to transfer the focus on the popup window? PinmemberPrateek Kaul20:28 21 Jul '04  
GeneralGDI leak PinsussAndreyZ6:25 18 Sep '02  
GeneralThanks PinsussRob A.11:05 11 Sep '02  
Generalwill this popup during fullscreen directx games PinsussAnonymous11:09 14 Aug '02  
GeneralSublclassing MSN Popupu PinmemberAnonymous4:46 26 Apr '02  
GeneralSome fix for flicker free. PinmemberYou-shin Won22:00 29 Jan '02  
GeneralRe: Some fix for flicker free. PinmemberIgor Green5:01 31 Jan '02  
GeneralStatus Bar PinmemberChoppa4:42 12 Nov '01  

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

PermaLink | Privacy | Terms of Use
Last Updated: 21 Oct 2001
Editor: Nishant Sivakumar
Copyright 2001 by Prateek Kaul
Everything else Copyright © CodeProject, 1999-2009
Web16 | Advertise on the Code Project