我的一段处理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;
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;
解决方案 »
- simple协议 问题?
- 怎么得到编辑框的每一行高度
- 怎样把jpg格式的图片转为bmp格式
- VC调用DLL??
- 我用了一个quatech的多串口卡,在高速采集的时候需要设置波特率500k,但总是参数错误,不知道为什么?
- 用VC.net试做Activex控件,在其他工程中引入,却在属性中显示:该组件上的GetValue操作失败
- 请教高手这是什么错误?
- 求助:MOF file是啥文件。#pragma是干啥用的,小人英语不好,msdn看不懂。
- 已知一个dll文件包含了一些窗体,如何调用这些窗体?
- 看《MFC Windows程序设计》之前要不要先看《Windows程序设计》
- 十万火急!!!win7 系统 VC控件 不能更新与变量相关联的值 好像是不能刷屏
- 这是什么毛病?警告信息不能随警告级别的变化而变化。
{
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;
请教 DefWindowProc(hwnd, msg, wParam, lParam); 这句话主要起什么作用呀?把消息给缺省的窗口过程处理吗?如果给缺省的窗口过程处理了,后面的语句还继续运行吗?后面的语句干什么用呀?请教高手回答一下
缺省窗口过程处理了,只要没返回,后面的语句当然还会继续运行。
这段代码在XP系统里是成功运行的,但在Win7里面虽然也执行了,但没有在窗口中表示出来。
你可以参考这个:http://www.sceneblog.tk/2010/custom-window-frame-using-dwm
先用DwmExtendFrameIntoClientArea把客户区域扩展到整个窗口,然后响应WM_NCCALCSIZE消息,当其wParam=TRUE时要记得返回0,这样就删除了默认的窗口框架。表现在窗口的图标和标题栏都消失了(但是窗口结构里的标题栏文字还是有的,从Dock或Ctrl+Tab可以看到),然后用DrawThemeTextEx绘制窗口标题文字(为了防止闪烁,需要先准备一个内存DC,然后Bitblt)就可以了。