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

  • Ever-increasing workloads and the challenge of containing costs leave companies conflicted by the need for increased processing capacity while limiting physical expansion. Migration to HP's new generation of increased-density rack-and-blade servers can address growing demands for compute capacity while reducing costly sprawl. Sponsored by: HP and Intel® Xeon® processors Intel, the Intel logo, and Xeon Inside are trademarks of Intel Corporation in the U.S. and/or other countries. HP is the sponsor …

  • Download the Information Governance Survey Benchmark Report to gain insights that can help you further establish business value in your Records and Information Management (RIM) program and across your entire organization. Discover how your peers in the industry are dealing with this evolving information lifecycle management environment and uncover key insights such as: 87% of organizations surveyed have a RIM program in place 8% measure compliance 64% cannot get employees to "let go" of information for …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds