Click here to Skip to main content
15,868,292 members
Articles / Desktop Programming / MFC

MSN Messenger Type Status Bar Popup Message Box

Rate me:
Please Sign up or sign in to vote.
4.35/5 (31 votes)
1 Apr 2012CPOL3 min read 503.4K   8.3K   204   59
MSN Messenger type status bar popup message box

Sample Image - StatusBarMsgWnd.jpg

Introduction

One of the interesting things I found in 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 constructor 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.

C++
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 the 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:

C++
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 anything you would like to do. At this point, OnLButtonDown() only shows a message box. You can change and do anything to suit your needs.

C++
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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralThanks Pin
Rob A.11-Sep-02 10:05
sussRob A.11-Sep-02 10:05 
Generalwill this popup during fullscreen directx games Pin
Anonymous14-Aug-02 10:09
Anonymous14-Aug-02 10:09 
GeneralSublclassing MSN Popupu Pin
26-Apr-02 3:46
suss26-Apr-02 3:46 
GeneralSome fix for flicker free. Pin
29-Jan-02 21:00
suss29-Jan-02 21:00 
GeneralRe: Some fix for flicker free. Pin
31-Jan-02 4:01
suss31-Jan-02 4:01 
GeneralStatus Bar Pin
Choppa12-Nov-01 3:42
Choppa12-Nov-01 3:42 
GeneralRe: Status Bar Pin
12-Nov-01 21:00
suss12-Nov-01 21:00 
GeneralClose while pop-up Pin
2-Nov-01 6:25
suss2-Nov-01 6:25 
Exception occurs if you close the application while the pop-up window is displayed. How to fix this?
GeneralRe: Close while pop-up Pin
29-Jan-02 20:52
suss29-Jan-02 20:52 
QuestionCan I do it in .Net Pin
28-Oct-01 23:58
suss28-Oct-01 23:58 
QuestionIs there any message length restriction? Pin
zizzer28-Oct-01 17:12
zizzer28-Oct-01 17:12 
AnswerRe: Is there any message length restriction? Pin
Prateek Kaul29-Oct-01 2:55
Prateek Kaul29-Oct-01 2:55 
GeneralBackground color Pin
Henk Devos22-Oct-01 0:17
Henk Devos22-Oct-01 0:17 
GeneralRe: Background color Pin
Prateek Kaul22-Oct-01 3:00
Prateek Kaul22-Oct-01 3:00 
QuestionWhy copyright sh*tty classes like this ? Pin
19-Oct-01 7:26
suss19-Oct-01 7:26 
AnswerRe: Why copyright sh*tty classes like this ? Pin
Christian Skovdal Andersen21-Oct-01 16:54
Christian Skovdal Andersen21-Oct-01 16:54 
AnswerRe: Why copyright sh*tty classes like this ? Pin
29-Oct-01 11:47
suss29-Oct-01 11:47 
AnswerRe: Why copyright sh*tty classes like this ? Pin
OJ7-Jan-03 19:19
OJ7-Jan-03 19:19 
Questionnice .. but..? Pin
Karavaev Denis18-Oct-01 2:33
Karavaev Denis18-Oct-01 2:33 
AnswerRe: nice .. but..? Pin
Prateek Kaul18-Oct-01 3:24
Prateek Kaul18-Oct-01 3:24 
Generalerror Pin
18-Oct-01 3:41
suss18-Oct-01 3:41 
GeneralRe: error Pin
Prateek Kaul18-Oct-01 4:12
Prateek Kaul18-Oct-01 4:12 
GeneralRe: error Pin
Karavaev Denis18-Oct-01 4:29
Karavaev Denis18-Oct-01 4:29 
Generalmaybe the reason is: Pin
Karavaev Denis18-Oct-01 4:47
Karavaev Denis18-Oct-01 4:47 
Generalfinished! Pin
Karavaev Denis18-Oct-01 23:05
Karavaev Denis18-Oct-01 23:05 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.