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

  • Best-in-Class organizations execute on a strategy that supports the multi-channel nature of customer requests. These leading organizations do not just open up their service infrastructures to accommodate new channels, but also empower their teams to deliver an effective and consistent experience regardless of the channel selected by the customer. This document will highlight the key business capabilities that support a Best-in-Class customer engagement strategy.

  • Live Event Date: September 16, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you starting an on-premise-to-cloud data migration project? Have you thought about how much space you might need for your online platform or how to handle data that might be related to users who no longer exist? If these questions or any other concerns have been plaguing you about your migration project, check out this eSeminar. Join our speakers Betsy Bilhorn, VP, Product Management at Scribe, Mike Virnig, PowerSucess Manager and Michele …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds