我的一段处理WM_NCPAINT改变窗口标题字体的代码在XP中能用,换到Win7系统里就不能用了,标题不显示。都是用的VS2005,很奇怪,希望各位讨论讨论,会是什么原因。代码如下:
case WM_NCPAINT://使用自定义的字体显示窗口标题
{
HDC hdc;
HFONT hf;
RECT rect;
int x, y, x1, y1; DefWindowProc(hwnd, msg, wParam, lParam); if (NULL != g_hfFont)//这个是自定义的字体
{
SetWindowText(hwnd, ""); GetWindowRect(hwnd, &rect);
hdc = GetWindowDC(hwnd);
hf = SelectObject(hdc, g_hfFont);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT)); //写标题
x = GetSystemMetrics(SM_CXSIZE)+GetSystemMetrics(SM_CXBORDER)+GetSystemMetrics(SM_CXDLGFRAME);
y = GetSystemMetrics(SM_CYDLGFRAME);
y1 = GetSystemMetrics(SM_CYICON)-GetSystemMetrics(SM_CYDLGFRAME)-GetSystemMetrics(SM_CYBORDER);
x1 = rect.right - rect.left - 3*(GetSystemMetrics(SM_CXSIZE)+GetSystemMetrics(SM_CXBORDER)+GetSystemMetrics(SM_CXDLGFRAME));
rect.left  = x;
rect.top = y;
rect.right = x1;
rect.bottom = y1;
//FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOWFRAME));
DrawTextA(hdc, "New Caption", -1, &rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
SelectObject(hdc, hf);
ReleaseDC(hwnd, hdc);
}
}
break;

解决方案 »

  1.   

    用模板重新发一下代码 case WM_NCPAINT://使用自定义的字体显示窗口标题
    {
    HDC hdc;
    HFONT hf;
    RECT rect;
    int x, y, x1, y1; DefWindowProc(hwnd, msg, wParam, lParam); if (NULL != g_hfFont)
    {
    SetWindowText(hwnd, ""); GetWindowRect(hwnd, &rect);
    hdc = GetWindowDC(hwnd);
    hf = SelectObject(hdc, g_hfFont);
    SetBkMode(hdc, TRANSPARENT);
    SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT)); //写标题
    x = GetSystemMetrics(SM_CXSIZE)+GetSystemMetrics(SM_CXBORDER)+GetSystemMetrics(SM_CXDLGFRAME);
    y = GetSystemMetrics(SM_CYDLGFRAME);
    y1 = GetSystemMetrics(SM_CYICON)-GetSystemMetrics(SM_CYDLGFRAME)-GetSystemMetrics(SM_CYBORDER);
    x1 = rect.right - rect.left - 3*(GetSystemMetrics(SM_CXSIZE)+GetSystemMetrics(SM_CXBORDER)+GetSystemMetrics(SM_CXDLGFRAME));
    rect.left  = x;
    rect.top = y;
    rect.right = x1;
    rect.bottom = y1;
    //FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOWFRAME));
    DrawTextA(hdc, "New Caption", -1, &rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
    SelectObject(hdc, hf);
    ReleaseDC(hwnd, hdc);
    }
    }
    break;
      

  2.   


    请教 DefWindowProc(hwnd, msg, wParam, lParam); 这句话主要起什么作用呀?把消息给缺省的窗口过程处理吗?如果给缺省的窗口过程处理了,后面的语句还继续运行吗?后面的语句干什么用呀?请教高手回答一下
      

  3.   

    缺省处理是先将窗口边框画一遍,然后后面的就是改标题的字体并且显示了。其实标题是空字符串,后面的只是在标题栏上写字而已。
    缺省窗口过程处理了,只要没返回,后面的语句当然还会继续运行。
    这段代码在XP系统里是成功运行的,但在Win7里面虽然也执行了,但没有在窗口中表示出来。
      

  4.   

    Vista和Win7里都用DWM来管理窗口,以前的方法及不能用了,除非你程序的manifest禁用Aero,那样的话所有窗口都会受影响失去透明效果……所以需要新方法。
    你可以参考这个:http://www.sceneblog.tk/2010/custom-window-frame-using-dwm
    先用DwmExtendFrameIntoClientArea把客户区域扩展到整个窗口,然后响应WM_NCCALCSIZE消息,当其wParam=TRUE时要记得返回0,这样就删除了默认的窗口框架。表现在窗口的图标和标题栏都消失了(但是窗口结构里的标题栏文字还是有的,从Dock或Ctrl+Tab可以看到),然后用DrawThemeTextEx绘制窗口标题文字(为了防止闪烁,需要先准备一个内存DC,然后Bitblt)就可以了。
      

  5.   

    多谢,终于知道是为什么了。需要仔细看http://msdn.microsoft.com/en-us/library/bb688195(v=vs.85).aspx的说明了,看来是自己学的东西太古老了。
      

  6.   

    学习了,我说怎么在WIN7不正常呢,最后只有在客户区模拟出标题栏了事。