问题1:
为什么我的对话框类CTestDlig继承自类CDialogEy,而CDialogEy类继承自CDialog,在CDialogEy类中重写了消息响应函数,比如OnPaint、OnNcMouseMove、OnNcLButtonDown、OnNcLButtonUp,而在对话框上发送的消息不能响应。。
解决办法1:
在类CTestDialog中添加消息响应函数既可以了。比如::
void CTestDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEy::OnNcMouseMove(nHitTest, point);
}
解决办法2:
原来是BEGIN_MESSAGE_MAP(CTestDlg, CDialogEy)这个宏中的两个参数在作怪。。第一个参数类别本身,第二个参数是父类别。。。
自绘窗口::
窗口分为客户区和非客户区,非客户区包括标题栏(图片、按钮(最大化,最小化,关闭))、左边框、下边框、右边框,剩下的即为客户区。
标题栏上按钮一般分为四种状态:
1.正常
2.鼠标经过
3.按下
4.失效
绘制非客户区的消息要用到以WM_NC开头的消息,比如WM_NCPAINT、WM_NCLBUTTONDOWN、WM_NCLBUTTONUP等等。
我们绘图都是在CDC下作图的:有CDC,CPaintDC(也只能用在WM_PAINT消息响应函数中)、CClientDC(用于客户区的绘图)、CWindowDC(可以在非客户区中绘制)。。
CWindowDC dc(this)
CWindowDC dc(GetParent())
CWindowDC dc(GetDesktopWindow())
(该窗口参看郭延明的博客内容。。)
通过CImage函数中的BitBlt方法来绘制最小化、最大化、关闭按钮。。。用于来显示不同的状态,比如,鼠标经过、离开、按下、抬起,这些消息进行响应。。
BOOL BitBlt( HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, DWORD dwROP = SRCCOPY ) const throw( );
返回值:函数成功,返回非零值,否则为0。
参数:
hDestDC 指向CDC对象的指针,标识待拷贝位图的设备上下文。
x Dest指定目标矩形左上角的逻辑x坐标。
y Dest指定目标矩形左上角的逻辑y坐标。
nDestWidth 指定目标矩形和源位图的宽度(逻辑单位)。
nDestHeight 指定目标矩形和源位图的高度(逻辑单位)。
xSrc 指定源位图左上角的逻辑X坐标。
ySrc 指定源位图左上角的逻辑Y坐标。
dwROP 指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。