单文档非客户区重绘怎么保持重绘效果

单文档非客户区重绘如何保持重绘效果
说一下现在的情况,新建单文档应用程序,
重载 OnNcPaint() ,在里面 用 StretchBlt() TransparentBlt() 贴图重绘非客户区

画好了之后,程序启动肯定是贴的那个样子,但是移动,放大,缩小,无焦点等等情况,它就会成为原来的样子,这是就要用 DefWindowProc()
我的代码是这样写的
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if (message == WM_MOVE || message == WM_NOTIFY || message == WM_NCACTIVATE)
{
OnNcPaint();
}
return CFrameWnd::DefWindowProc(message, wParam, lParam);
}


初衷是,收到这些消息,就再画一下非客户区,但是问题就在,这里好像没有涵盖完所有情况,假设一种情况,程序启动,程序有焦点,但是点一下其它程序,我写的程序没有焦点,就没有我贴的图了,更甚的是就算点我写的程序给他焦点,也不会有贴图,第二种情况就是我的系统是win7,我写的程序最小化后,鼠标放在底部程序时,win7生成预览,点预览,依然是没有贴图,点程序是有贴图的 第三种情况,按着程序底部程序按钮不放,程序就没有贴图,此时松开,就有贴图然后程序最小话,如果点着的时候,鼠标移到其他地方松开,程序不最小化,也一直没有贴图了

说了这么多情况,我只是希望大家能知道我问的是什么,我只所以坚信问题能得到解决,是当我不判断消息的时候 在 defWindowProc 中 直接 OnNcPaint();我上面说的那些情况都不存在,但是我觉得这样做并不好,因为消息那么多,每收到一个消息不管有关没有关都去重画非客户区,并不好。

求高手给我说我应该都在接收到那些消息时 调用OnNcPaint();

提供建议都给分
非客户区重绘 OnNcPaint DefWindowProc

------解决方案--------------------
引用:
Quote: 引用:

在 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
改 cs 是 没用的 。必须在窗口 产生后:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
ModifyStyle(WS_CAPTION,0) ;


好吧,我百度“单文档去掉非客户区”我好像发现了什么
ModifyStyle(WS_CAPTION,  0,  SWP_FRAMECHANGED);
好像应该这样写呀,这样写就是你贴图的那个样式了


除了WS_CAPTION 以外  还有ws_border ws_sizebox什么的 都要去掉

然后得到一个纯净的客户区,然后截获鼠标消息,模拟非客户区消息 基本都是这么用的,

wn7的 非客户区绘制 采用的是另外一种模式,尤其在失去焦点的时候 绘制半透明的效果  不太好用,至少我是没弄明白。
------解决方案--------------------
已发 带 exe
------解决方案--------------------
在不同的主题风格下也会出现问题的,比如在Win7 Areo那中风格下,可能OnNcPaint并不一定好使