The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
当用户从菜单中选择了一个命令项
当一个控件向其父窗口发送了一条通知消息
当一个加速键被翻译
WM_COMMAND 消息被发送

WM_COMMAND  
wNotifyCode = HIWORD(wParam); // notification code  通知码
wID = LOWORD(wParam);         // item, control, or accelerator identifier  菜单项,控件或加速键
hwndCtl = (HWND) lParam;      // handle of control  控件句柄
==============================================
WM_SYSCOMMAND
A window receives this message when the user chooses a command from the window menu (also known as the System menu or Control menu) or when the user chooses the Maximize button or Minimize button.
 
当用户从窗口菜单选择了一命令项或当用户选择了“最大化”、“最小化”按钮时,窗口会收到这个消息

WM_SYSCOMMAND  
uCmdType = wParam;        // type of system command requested 系统请求命令的类型
xPos = LOWORD(lParam);    // horizontal postion, in screen coordinates 在屏幕坐标的水平位置
yPos = HIWORD(lParam);    // vertical postion, in screen coordinates 垂直位置
 
 
子窗体和父窗体:
子窗体被触发时,向父窗体发送一个WM_COMMAND消息,父窗体的窗口函数处理这个消息,进行相关的处理。lParam表示子窗口句柄,LOWORD(wParam)表示子窗口ID,HIWORD (wParam)表示通知码(例如单击,双击,SETFOCUS等)。

WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同?  
WM_MESSAGE是最普通的WINDOWS消息,对于这种类型的消息没什么好说的。那WM_COMMAND和WM_NOTIFY消息都是WINDOWS CONTROL给它的父窗体发的消息,那这两种消息有什么不同呢?WM_COMMAND消息其实是早期的(WIN3.X时代)子窗体消息,子窗体给父窗体发送消息,父窗体就捕获WM_COMMAND来处理子窗体的消息。但是这个消息只包括了有限的信息,例如wParam包括了子窗口ID和通知码,lParam则包括了子窗口句柄,就这点信息了,如果想知道一些额外的信息的话(例如,鼠标点在了子控件的位置)就要借助于其他的WM_*消息。所以对于新型的WIN32控件,微软就增加了一个新的NOTIFICATION消息,这个消息的参数是这样的:wParam包含了控件ID,而lParam则包含了一个结构体的指针,这个结构体是NMHDR结构或者以NMHDR结构为第一项的一个更大的结构体。这样就可以包含了很多的子控件想给父窗体提供的信息了,甚至可以自己去定义这种的结构体。
    这就是这几种消息的差别点了。

控件的自画:
    首先在创建控件的时候当然就是指定BS_OWNERDRAW的STYLE,这个STYLE是告诉控件,别自己处理外观,让主程序来处理你的外观,这时你就有权决定这个控件是画成什么样子了。然后就是处理WM_DRAWITEM的消息,利用 LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; 来取得一些必要的信息,如按钮的DC,位置等。这才能对这个DC的内容进行绘画啊。COMMON CTRL的STYLE都在COMMCTRL.H头文件里。
按钮在以下状态时会对它的父窗口发送WM_COMMAND的消息:
按了一次(BN_CLICKED),取得焦点(BN_SETFOCUS),失去焦点(BN_KILLFOCUS)等。
这个是按钮的发送WM_COMMAND的条件,其他的控件什么时候会发送WM_COMMAND消息可查看该控件的通知码(在wParam的高位HIWORD)。例如,滚动条控件在被滚动的时候会向它的父窗体发送消息,但是不是WM_COMMAND消息,而是WM_VSCROLL和WM_HSCROLL消息。这只是为了说明凡是子控件,都会在适当的条件下向它的父窗体发送消息。无论是WM_COMMAND还是WM_NOTIFY或是WM_VSCROLL消息等。
MoveWindow会产生WM_SIZE消息。