Skip to main content

What is Message Maps ?

Message Maps


MFC uses message maps to get around a fundamental problem with virtual
functions. Look at the CWnd class in the MFC help file. It contains over 200
member functions, all of which would have to be virtual if message maps were
not used. Now look at all of the classes that subclass the CWnd class. For
example, go to the contents page of the MFC help file and look at the visual
object hierarchy. 30 or so classes in MFC use CWnd as their base class. This
set includes all of the visual controls such as buttons, static labels, and lists.
Now imagine that MFC used virtual functions, and you created an application
that contained 20 controls. Each of the 200 virtual functions in CWnd would
require its own virtual function table, and each instance of a control would
therefore have a set of 200 virtual function tables associated with it. The
program would have roughly 4,000 virtual function tables floating around in
memory, and this is a problem on machines that have memory limitations.
Because the vast majority of those tables are never used, they are unneeded.
Message maps duplicate the action of a virtual function table, but do so on an
on-demand basis.

When you create an entry in a message map, you are saying
to the system, "when you see the specified message, please call the specified
function." Only those functions that actually get overridden appear in the
message map, saving memory and CPU overhead.

When you declare a message map with DECLARE_MESSAGE_MAP and
BEGIN_MESSAGE_MAP, the system routes all messages through to your
message map. If your map handles a given message, then your function gets
called and the message stops there. However, if your message map does not
contain an entry for a message, then the system sends that message to the
class specified in the second parameter of BEGIN_MESSAGE_MAP.

That class may or may not handle it and the process repeats. Eventually, if no message
map handles a given message, the message arrives at a default handler that
eats it.

Comments

Popular posts from this blog

Explain Polymorphism and Flavors of Polymorphism...

Polymorphism is the ability of different objects to react in an individual manner to the same message. This notion was imported from natural languages. For example, the verb "to close" means different things when applied to different objects. Closing a door, closing a bank account, or closing a program's window are all different actions; their exact meaning is determined by the object on which the action is performed. Most object-oriented languages implement polymorphism only in the form of virtual functions. But C++ has two more mechanisms of static (meaning: compile-time) polymorphism: Operator overloading. Applying the += operator to integers or string objects, for example, is interpreted by each of these objects in an individual manner. Obviously, the underlying implementation of += differs in every type. Yet, intuitively, we can predict what results are. Templates. A vector of integers, for example, reacts differently from a vector of string objects when it receives ...

Function name mangling for C++ and Java

G++ internals - Mangling Both C++ and Jave provide overloaded function and methods, which are methods with the same types but different parameter lists. Selecting the correct version is done at compile time. Though the overloaded functions have the same name in the source code, they need to be translated into different assembler-level names, since typical assemblers and linkers cannot handle overloading. This process of encoding the parameter types with the method name into a unique name is called name mangling . The inverse process is called demangling . It is convenient that C++ and Java use compatible mangling schemes, since the makes life easier for tools such as gdb, and it eases integration between C++ and Java. Note there is also a standard "Jave Native Interface" (JNI) which implements a different calling convention, and uses a different mangling scheme. The JNI is a rather abstract ABI so Java can call methods written in C or C++; we are concerned he...