WM_COMMAND user message macro

Here is a nice macro that works very nice if you are
working on an MFC project involving user messages.
I always got irritated every time I had to add user
messages, and sometimes forgot what parameters should
be used. This macro pops up a nice dialog box where you
just enter your user message (e.g. WM_MYMESSAGE) and
it inserts the message body + the line in the AFX_MSG_MAP
as well as the line in the header file under AFX_MSG.

It creates the name based on the message, so if it finds
“WM_” in the beginning, this is stripped away and replaced
with the word “On” just like all the other MFC messages
are defined.

It uses another macro you have on your web page called
ToggleHandCPP. It should probably be refined better so
that it doesn’t spew garbage when it is unable to find
the header file.

BTW, you have to be in the CPP file to run the macro,
if not a message box will pop up. (The macro can be
extended to do this switch automatically of course.)

I’ve been using this for a while and it seems to work just
fine. Please report any bugs if you find them.


Sub AddMessage()
‘DESCRIPTION: Adds user messages to MFC project (WM_COMMAND)

ext = ActiveDocument.Name
pos = Instr(ext, “.”)
if pos > 0 then
Do While pos <> 1
ext = Mid(ext, pos, Len(ext) – pos + 1)
pos = Instr(ext, “.”)
Loop
ext = LCase(ext)
end if
If ext = “.cpp” Then
msg = InputBox (“Write the message ID:”)
If msg <> “” Then
‘func = LCase(msg)
If Left(msg, 3) = “WM_” Then
func = “On” + Mid(msg,4,1) + Mid(LCase(msg),5)
End If

ActiveDocument.Selection.EndOfDocument
ActiveDocument.Selection.FindText “AFX_MSG_MAP”, dsMatchBackward
ActiveDocument.Selection.FindText “AFX_MSG_MAP”, dsMatchBackward
ActiveDocument.Selection.CharRight dsMove, 2
ActiveDocument.Selection.WordRight dsExtend
ActiveDocument.Selection.Copy
ActiveDocument.Selection.EndOfLine
ActiveDocument.Selection.NewLine
ActiveDocument.Selection = “ON_MESSAGE(“+msg+”, “+func+”)”
ActiveDocument.Selection.EndOfDocument
ActiveDocument.Selection.NewLine
ActiveDocument.Selection = “LONG ”
ActiveDocument.Selection.Paste
ActiveDocument.Selection = “::”+func+”( UINT uParam, LONG lParam )”
ActiveDocument.Selection.NewLine
ActiveDocument.Selection = “{”
ActiveDocument.Selection.NewLine
ActiveDocument.Selection = “return 0;”
ActiveDocument.Selection.NewLine
ActiveDocument.Selection.CharLeft
ActiveDocument.Selection = “}”
ActiveDocument.Selection.NewLine
ActiveDocument.Selection.LineUp
ActiveDocument.Selection.LineUp
ActiveDocument.Selection.LineUp
ActiveDocument.Selection.EndOfLine
ActiveDocument.Selection.NewLine
ToggleHandCPP
ActiveDocument.Selection.EndOfDocument
ActiveDocument.Selection.FindText “AFX_MSG”, dsMatchBackward
ActiveDocument.Selection.LineUp
ActiveDocument.Selection.EndOfLine
ActiveDocument.Selection.NewLine
ActiveDocument.Selection = “afx_msg LONG “+func+”( UINT uParam, LONG lParam );”
ToggleHandCPP
End If
Else
MsgBox “File is not a .cpp file”
End If
End Sub

More by Author

Must Read