EventManager CWnd Derived

Environment: VC6

This article presents an Event Manager class to route messages to CWnd derived classes. The concept of this class is based on the popular Publisher / Subscriber idea. Any class shall be able to publish an event to a CEventManager object (single instance). Any class that is CWnd derived shall be able to subscribe to the event. When an event is signalled by the Publisher, the event manager shall propagate the message to the subscribers in the order of subscription.

To use this class, first create a single instance of the CEventManager class. The simplest way is to declare the variable in the file containing the CWinApp derived class.
// CWinApp derived class header file.
#include "EventManager.h"
extern CEventManager m_evtManager;

...
// CWinApp derived class source file.
CEventManager m_evtManager;
After this any class that wishes use the CEventManager needs to make sure that the CWinApp derived class' header file is included in that class first.

To publish an event declare the event id in the stdafx.h first as

// stdafx.h
#define MSG_MYMESSAGE   WM_USER+1
Then call the following function in the publisher's constructor
// publisher's class constructor
m_evtManager.PublishEvent(MSG_MYMESSAGE);

Likewise in the subscribers class constructor,

// publisher's class constructor
m_evtManager.SubscribeEvent(this, MSG_MYMESSAGE);
For the subscriber, we would need to declare a function to handle the event and create the message map as follows.
// message map
ON_MESSAGE(MSG_MYMESSAGE, OnMyMessage)
and the function shall be declared as follows
// afx messages
afx_msg void OnMyMessage(WPARAM, LPARAM)
In this fashion, we can have as many subscribers listening to a single event.

For a publisher to signal an event, use the following command,

// publisher
m_evtManager.SignalEvent(MSG_MYMESSAGE,wparam,lparam);

The method described here might not be optimized and there are in fact other alternatives. But what the CEventManager class shall allow us to do is to experiment and control how messages might propagate throughout the application. Thus any improvements are always welcomed.

The demo project attached demonstrates how messages might be propagated throughout the application. The CMainFrame class shall broadcast the Window Moved event which shall be caught by the CView class who shall inturn signal the CDisplayDlg1 class.

Downloads

Download demo project - 52 Kb
Download source - 2 Kb


Comments

  • Great, I like it

    Posted by Legacy on 04/04/2002 12:00am

    Originally posted by: liner alpha

    I removed the event manager's dependency of CWnd and changed the subscriber from CWnd* to HWND. It works in ATL as fine as previously works in MFC.

    Reply
  • Nice Program

    Posted by Legacy on 04/03/2002 12:00am

    Originally posted by: Chris Richardson

    Hi,

    Your idea here is a good one, and I like the neat demo program. Great work. I did notice one bug, and had one suggestion for others who will download this.

    The bug is in DisplayDlg1.cpp, in the MoveDialog function. When you move the window around, the dialog will eventually be sized to nothing. This is because the client rectangle dimensions are being used instead of the window rectangle dimensions. This code will work better:

    CRect rcClient;
    // Call GetWindowRect instead of GetClientRect.
    GetWindowRect(rcClient);

    MoveWindow((int)wParam, (int)lParam, rcClient.Width(), rcClient.Height());


    The suggestion I had for other users, is that if you want to be able to see the HTML page, change the URL in CoolUIDoc.cpp on line 35 to point to the correct location of the HTML page.

    Once again, nice work.

    Chris Richardson

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Organizations are increasingly gravitating toward mobile-first application development as they assess the need to revamp their application portfolios to support touch computing and mobility. Consumerization has brought higher expectations for application usability along with the mobile devices themselves. Enterprises are increasingly shifting their new application acquisitions and development efforts toward mobile platforms. With this backdrop, it is natural to expect application platform vendors to invest in …

  • Thanks to wide spread cloud hosting and innovations small businesses can meet and exceed the legacy systems of goliath corporations. Explore the freedom to work how you want, with a phone system that will adapt to your evolving needs and actually save you lots of expense—read Get an Enterprise Phone System without High Cost and Complexity. The article clearly illustrates: The only hardware you'll need is phone equipment for advanced voice and fax. How to join all your employees, mobile devices, …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date