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
Then call the following function in the publisher's constructor
// publisher's class constructor

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

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.


Download demo project - 52 Kb
Download source - 2 Kb


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

  • Nice Program

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

    Originally posted by: Chris Richardson


    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.

    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

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

Top White Papers and Webcasts

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

  • Enterprises are increasingly looking to platform as a service (PaaS) to lower their costs and speed their time to market for new applications. Developing, deploying, and managing applications in the cloud eliminates the time and expense of managing a physical infrastructure to support them. PaaS offerings must deliver additional long-term benefits, such as a lower total cost of ownership (TCO), rapid scalability, and ease of integration, all while providing robust security and availability. This report …

Most Popular Programming Stories

More for Developers

RSS Feeds

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