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