2024年4月28日发(作者:)
MFC标题栏及边框的自绘
SDI 和MDI 程序中对非客户区(标题栏、左右下边界)的美化
基本思路是重载CMainFrame 类的DefWindowProc()函数,并判断消息为:
WM_NCPAINT,WM_NCACTIV A TE,WM_NOTIFY的时候,调用自己的绘制窗口标
题栏的函数。用GetSystemMetrics(SM_CSFRAME)和
GetSystemMetrics(SM_CYFRAME)可以取得标题栏的左上角的坐标。最大化,最小化的
按钮自己画,如果不是在标准的位置,一定要记录下他们的位置,并且在
WM_NCLBUTTONDOWN消息处理函数中判断是否是点击了按钮,以做出相应的处理。
系统图标也可以自己重新画。
主要任务有贴图(包括标题栏、左边界、右边界、下边界、系统图标、最大化、最小
化、
关闭按钮)、处理消息(屏蔽系统自带按钮、双击状态栏改变大小、鼠标停放在三个
自绘按钮上时改变按钮图标、单击自绘按钮时作出相应反应)。
一、响应的消息及重载的函数
响应的消息及重载的函数都在CMainFrame 类中。响应DefWindowProc 函数,在
其中
判断消息是不是WM_NCPAINT、WM_MOVE、WM_NCACTIV A TE、
WM_NOTIFY,若是则重画标题栏、左框架、右框架、下框架、最大化、最小化、关闭按
钮(放在一个函数里)。
响应消息WM_NCHITTEST,使鼠标位于自绘按钮时返回相应hittest 值,同时屏蔽
自带
按钮的鼠标事件。简言之,当鼠标位于自绘按钮时,让系统误以为鼠标位于相应按钮,
而当鼠标位于系统自带按钮时,让系统误以为鼠标只是位于标题栏。自绘图标与之类似,
不再赘述。
响应消息WM_NCMOUSEMOVE,判断光标是不是位于自绘最大化、最小化、关闭按
钮
区域,如是则重画相应的按钮。
响应消息WM_NCLBUTTONDOWN,判断单击左键时鼠标是否位于自绘制的最大化、
最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。
响应消息WM_NCLBUTTONDBCLK,使双击标题栏时窗口能最大化或还原。
二、主要函数
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam,
LPARAM lParam),在此函数内判断WM_NCPAINT、WM_MOVE、WM_NCACTIV A
TE、WM_NOTIFY 消息,自绘框架。
发布评论