1.MSG_DESTROY
调用DestroyMainWindow/DestroyWindow时发送到窗口过程中
例:程序在MSG_DESTROY消息中销毁被托管主窗口的位图、字体等
case MSG_DESTROY:
DestroyIocn(icon1);
DestroyIocn(icon2);
DestroyAllControls(hWnd);
return 0;
例:被托管主窗口响应MSG_CLOSE消息
case MSG_CLOSE:
DestroyMainWindow(hWnd);
MainWindowCleanup(hWnd);
return 0;
2.MSG_CLOSE
点击“X”按钮时向窗口过程发送该消息,程序该在响应该消息时调用DestroyMainWindow销毁主窗口并用PostQuitMessage向队列中投放MSG_QUIT消息
3.MSG_PAINT
窗口进行重绘时该消息被发送到窗口过程
窗口在初始显示时
从隐藏状态变为显示状态
从部分不可见到可见状态
调用InvalidateRect时
窗口过程在收到该消息时应该对窗口进行界面维护
case MSG_PAINT:
HDC hdc;
hdc=BeginPaint(hwnd);
...
EndPaint(hwnd,hdc);
return 0;
程序处理完后要直接返回,不应该再传递给默认窗口过程处理
4.MSG_ERASEBKGND
需要清除窗口背景时发送该消息
InvalidateRect/UpdateWindow并为bErase传递TRUE时
如果在MSG_PAINT消息时重绘所有的窗口客户区应忽略该消息
case MSG_ERASEBKGND:
return 0;
在窗口背景上填充图片:
case MSG_ERASEBKGND:
HDC hdc=(HDC)wParam;
const RECt *clip=(const RECT*)lParam;
BOOL fGetDC=FALSE;
RECT rcTemp;
if(hdc==0)
{
hdc=GetClientDC(hwnd);
fGetDC=TRUE;
}
if(clip)
{
rcTemp=*clip;
ScreenToClient(hDlg,&rcTemp.left,&rcTemp.top);
ScreenToClient(hDlg,&rcTemp.right,&rcTemp.bottom);
IncludeClipRect(hdc,&rcTemp);
}
FillBoxWithBitmap(hdc,0,0,0,0,&bmp_bkgnd);
if(fGetDC)
ReleaseDC(hdc);
return 0;
5.MSG_FONTCHANGED
调用SetWindowFont改变了默认字体后将引发该消息
窗口过程需要处理以便反映出新的字体设置
如编辑框就要处理并重绘自己:
case MSG_FONTCHANGED:
{
sled=(PSLEDITDATA)GetWindowAdditionalData2(hwnd);
sled->startpos=0;
sled->editpos=0;
edtGetLineInfo(hwnd,sled);
DestroyCaret(hwnd);
CreateCaret(hwnd,NULL,1,GetWindowFont(hwnd)->size);
SetCaretPos(hwnd,sled->leftMargin,sled->topMargin);
InvalidateRect(hwnd,NULL,TRUE);
return 0;
}
6.MSG_FONTCHANGING
当调用SetWindowFont改变默认字体时引发该消息
通常窗口过程将此消息传递给默认窗口过程处理
如果窗口不允许用户改变字体可以加以截获该消息将返回非零值
case MSG_FONTCHANGING:
return -1;
7.MSG_CREATE
窗口成功创建并添加到窗口管理器中时引发该消息
8.MSG_SIZECHANGED
窗口尺寸变化时发生,wParam包含窗口大小,lParam用于保存窗口客户区大小的RECT指针
case MSG_SIZECHANGED:
RECT *rcClient=(RECT*)lParam;
rcClient->right=rcClient->left+_WIDTH;
rcClient->bottom=rcClient->top+_HEIGHT;
return 0;
9.MSG_SIZECHANGING
窗口尺寸发生变化时引发该消息,用于确定窗口大小
wParam包含预期窗口尺寸值,lParam用于保存结果值
case MSG_SIZECHANGING:
memcpy((PRECT)lParam,(PRECT)wParam,sizeof(RECT));
return 0;
可以截获该消息使创建的窗口位于指定的位置或具有固定的大小
case MSG_SIZECHANGING:
const RECT *rcExpect=(const RECT*)wParam;
RECT*rcResult=(RECT*)lParam;
rcResult->left=rcExcept->left;
rcResult->top=rcExcept->top;
return 0;
10.MSG_NCCREATE
建立主窗口过程中引发, 此时窗口对象尚未建立,不能使用GetDC等函数
必须在此消息的处理中进行输入法窗口注册
case MSG_NCCREATE:
if(hz_input_init())
SendMessage(HWND_DESKTOP,MSG_IME_REGISTER,(WPARAM)hwnd,0);
else
return -1;
break;