![]() |
Desktop Development »
Dialogs and Windows »
Dialogs
Intermediate
MSN Messenger type status bar popup message boxBy Prateek KaulMSN Messenger type status bar popup message box |
VC6, VC7Win2K, MFC, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||

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.
Include the following files in your project.
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();
The PopMsg() function first checks, where is the status bar on the desktop?
There are only four cases
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
IDT_POP_WINDOW_TIMER -> Gets triggered for animating popupIDT_SHOW_WINDOW_TIMER -> Gets triggered for showing and keeping the window in position for some timeIDT_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
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; }
Double click the popwnd.exe and use the "Message Menu" to pop up a message window
General
News
Question
Answer
Joke
Rant
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 |