MFC对话框应用程序自绘问题积累:(2009)
1.
天问:为什么瑞星的三态按钮要放在同一个PNG文件里?而且背景底色是粉色的呢?
我答:那是因为GDI Plus的DrawImage,或CImage的Draw函数的参数可以是CRect对象用它可以定义PNG文件的坐标 或用Offset偏移指定矩形区域的PNG文件,粉色是因为粉色不常用?故把它定义为透明色最终用GDI Plus
或CImage的函数将其透化掉了.
2.
天问:为什么360的主窗口不叫#32770呢 ?为什么它的关闭按钮用SPY++扫不到Button呢?
我答:那是因为360的主窗口从MFC的CWnd类继承并子类化了,也或许直接用SDK写了主类,不过不据我了解不
像是后者.而且它去除了标题栏和边框,也没有用Button控件,只是贴了一个关闭按钮图片对此区域进行消息响 应。
3.
天问:为什么我的主窗口只有一个背景图,移动时还会闪呢?
我答:那是因为我把绘图函数写在了OnPaint里,关键的是没有重载OnErasBkgnd并return TRUE;
4.
天问:为什么360的关闭按钮当鼠标移上去会变红,而我的却不行呢?
我答:那是因为360截获了DefWindowProc或DefDlgProc,这样它可以在假标题栏上自绘,而我的虽然也做了假标题栏
但只是在OnPaint里自绘,这样的话,系统误以为你的假标题栏是真标题栏,因此不允许你在标题上乱搞。
所以要么像360那样再建一个子对话框作为标题栏,要么把关闭按钮等那部分区域排除出标题栏,要么截获 DefWindowProc或DefDlgProc。
5.
天问:为什么360的假标题栏可以拖动,而我的却不行呢?
我答:确切的说,我的也行,只是我想换成用PtInRect实现,因为OnNCHitTest传回的point是相对于屏幕的,而 OnMouseMove传回的point是相对于窗口的,GetWindowRect传回的CRect对象是相对于屏幕的GetClientRect传回 的CRect对象是相对于窗口的,关键的是我在调用PtInRect成员函数的CRect对象里把后两个参数传递了Width各 Height,而正确的是传递Right,Bottom.
6.
不断积累中...