请教一个关于static控件背景出错的问题 用透明背景可以么我的对话框还有个背景图片,static控件在图上显示一些信息 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在draw函数的最开始加了如下设置控件透明的代码:BOOL util_url_draw(HWND hwnd, HDC hdc, RECT *calcrect) { int iOldBkMode; iOldBkMode = SetBkMode(hdc, TRANSPARENT); SetBkMode(hdc, iOldBkMode); ...}故障依旧,static控件的背景,被前面显示的对话框的内容搞花了,就是说刚才覆盖static控件的对话框的内容留在了static控件的背景上,而没有随着对话框的切换而消失。该draw函数是在控件的窗体函数中响应WM_PAINT消息时调用的:LRESULT CALLBACK urlctrl_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ... case WM_PAINT: PAINTSTRUCT ps; HDC hdc = (HDC) wParam; hdc = BeginPaint(hwnd, &ps); util_url_draw(hwnd, hdc, NULL); EndPaint(hwnd, &ps); return 0; ...}问题是static控件是通过util_url_draw函数手动画的,当然包括背景也要自己来画,就是不知道怎样才能使得背景跟系统当前主题下的对话框背景颜色一致(不同的主题对话框背景颜色不一样)。要是能让控件背景透明就好,但好像问题不在透明不透明这点上面,因为整个控件都是手动画的,在util_url_draw里面画,背景也是。如果没有对控件的背景做任何操作的话,那么背景就会被前面覆盖它的内容所影响(因为没做任何处理嘛),但如果要在画控件的时候手动处理背景的话该如何才能使得控件背景跟系统当前主题的背景颜色一致呢?而且我发现一个现象,就是当控件背景有故障的情况下(背景被其他对话框的内容“污染”了),这时候如果我拖动另外一个窗口,使得该窗口覆盖控件的一部分,再移开该窗口,那么这时发现static控件的背景中,被刚才那个窗口覆盖过的部分呈现出正确的控件背景颜色,而其他部分仍然是被污染的,呈现出一种一分为二的显示状态。这是怎么回事呢,明明我的控件绘制函数util_url_draw中没有处理控件背景啊,为什么那部分会显示出正确的颜色?是谁来画的呢? 我的例子:透明背景,修改了static的文字之后,主动重绘一下,m_staticInfo是一个Static控件,用RedrawWindow重绘static控件那个区域,消除了之前的文字留下的痕迹void CInitDlg::SetInfo(LPCTSTR lpszInfo){ CRect rect; m_staticInfo.GetWindowRect(&rect); ScreenToClient(&rect); RedrawWindow(&rect); m_staticInfo.SetWindowText((LPCTSTR)lpszInfo);} 多谢你的热心帮助,我明白你的意思,就是说在设置static控件显示的文字之前,把这个控件主动重新绘制一下,以消除以前的旧文字。但在我的那个实例中,问题就是出在绘制函数里面,也就是说我的绘制函数是完全自己手动编写的,问题是在自己手动绘制的时候,static控件的背景不知道要如何才能绘制得跟当前操作系统的主题下,对话框的背景颜色或者风格一致。所以重新绘制一遍也是调用我那个自定义的绘制函数一遍,问题还是会出现的。 你可以直接在图片上textOut输出文字 不是很明白,文字的输出也是在控件的绘制函数中进行的:BOOL util_url_draw(HWND hwnd, HDC hdc, RECT *calcrect) { ... DrawText(hdc, szText, -1, &rc, style); ... } 问题在绘制控件的时候背景该怎么处理?就是控件颜色怎么样才能跟不同主题下的对话框颜色一致。或者有没有其他的默认绘制函数(比如基类的绘制函数)能画出跟系统主题一致的控件外观?这只是个假设了,要是有的话就可以想办法直接去调用它来绘制一下就可以了,不用再手动绘制背景。 我的意思是当你draw玩这个图片后,直接在这个DC上输出透明背景的文字。控件内部实现透明有点难度,大部分都这样处理:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(nCtlColor==CTLCOLOR_STATIC) {pDC->SetBkMode(TRANSPARENT); hbr=(HBRUSH)::GetStockObject(NULL_BRUSH); } // TODO: Change any attributes of the DC here // TODO: Return a different brush if the default is not desired return hbr; } 恩。。收到,也明白了。不过实际情况是这样的,我理一下代码结构:前言:该static不是单纯的显示文本的static,它是用来提供一个链接的static,因此与它相关的函数都是用urlctrl来开头的。代码的运行顺序:1.执行dlgSetupAboutInit()函数 //对话框初始化函数 调用urlctrl_set()函数,该函数操作如下,都是调用SetWindowLong()函数的动作: (1)关联static控件的窗体函数urlctrl_proc到该控件的句柄 (2)关联相关的Window Style到该控件句柄 (3)关联要显示的文本及链接到该控件的句柄2.执行dlgSetupAbout()函数 //对话框的窗体处理函数 响应WM_CTLCOLORSTATIC消息 (to fathappy:我测试过了,在WM_CTLCOLORSTATIC消息的处理过程中,函数传递进来的lParam参数根本就没有变成我想处理的static控件的ID过,也就是说,我在这里访问不到我的static控件。似乎在前面的初始化过程以后,对话框的窗体处理函数就没把我的控件当成一般的static控件了。所以这里不能对我的static控件的文本和背景属性进行修改。) 在ONCREATE中好像GETCLIENTRECT()函数好像得到的是空值 变量调用的问题 请教,activex插件的滚动条问题 求教vc网络编程入门级图书。。。。。。。。。。。。。 怎么样实现RECT内写字符串,自动换行 请人教 Activex 组件的编写,急急急! 高分求思路,一个大的项目! 各位大哥大姐,怎么样才能杀掉所有正在运行的程序?望指点。 请问关于CRichEditCtrl的问题! 侯捷先生的c++ primer 国内有卖的吗?有简体中文版的吗?什么时候出啊? VC+SQL 有关无效的描述符索引 求声卡示波器VC++的源码
BOOL util_url_draw(HWND hwnd, HDC hdc, RECT *calcrect)
{
int iOldBkMode; iOldBkMode = SetBkMode(hdc, TRANSPARENT);
SetBkMode(hdc, iOldBkMode);
...
}故障依旧,static控件的背景,被前面显示的对话框的内容搞花了,就是说刚才覆盖static控件的对话框的内容留在了static控件的背景上,而没有随着对话框的切换而消失。该draw函数是在控件的窗体函数中响应WM_PAINT消息时调用的:
LRESULT CALLBACK urlctrl_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
...
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = (HDC) wParam;
hdc = BeginPaint(hwnd, &ps);
util_url_draw(hwnd, hdc, NULL);
EndPaint(hwnd, &ps);
return 0;
...
}
问题是static控件是通过util_url_draw函数手动画的,当然包括背景也要自己来画,就是不知道怎样才能使得背景跟系统当前主题下的对话框背景颜色一致(不同的主题对话框背景颜色不一样)。要是能让控件背景透明就好,但好像问题不在透明不透明这点上面,因为整个控件都是手动画的,在util_url_draw里面画,背景也是。如果没有对控件的背景做任何操作的话,那么背景就会被前面覆盖它的内容所影响(因为没做任何处理嘛),但如果要在画控件的时候手动处理背景的话该如何才能使得控件背景跟系统当前主题的背景颜色一致呢?
而且我发现一个现象,就是当控件背景有故障的情况下(背景被其他对话框的内容“污染”了),这时候如果我拖动另外一个窗口,使得该窗口覆盖控件的一部分,再移开该窗口,那么这时发现static控件的背景中,被刚才那个窗口覆盖过的部分呈现出正确的控件背景颜色,而其他部分仍然是被污染的,呈现出一种一分为二的显示状态。这是怎么回事呢,明明我的控件绘制函数util_url_draw中没有处理控件背景啊,为什么那部分会显示出正确的颜色?是谁来画的呢?
{
CRect rect;
m_staticInfo.GetWindowRect(&rect);
ScreenToClient(&rect);
RedrawWindow(&rect);
m_staticInfo.SetWindowText((LPCTSTR)lpszInfo);
}
但在我的那个实例中,问题就是出在绘制函数里面,也就是说我的绘制函数是完全自己手动编写的,问题是在自己手动绘制的时候,static控件的背景不知道要如何才能绘制得跟当前操作系统的主题下,对话框的背景颜色或者风格一致。所以重新绘制一遍也是调用我那个自定义的绘制函数一遍,问题还是会出现的。
BOOL util_url_draw(HWND hwnd, HDC hdc, RECT *calcrect)
{
...
DrawText(hdc, szText, -1, &rc, style);
...
}
问题在绘制控件的时候背景该怎么处理?就是控件颜色怎么样才能跟不同主题下的对话框颜色一致。或者有没有其他的默认绘制函数(比如基类的绘制函数)能画出跟系统主题一致的控件外观?这只是个假设了,要是有的话就可以想办法直接去调用它来绘制一下就可以了,不用再手动绘制背景。
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_STATIC)
{pDC->SetBkMode(TRANSPARENT);
hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
}
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
return hbr;
}
不过实际情况是这样的,我理一下代码结构:
前言:该static不是单纯的显示文本的static,它是用来提供一个链接的static,因此与它相关的函数都是用urlctrl来开头的。代码的运行顺序:
1.执行dlgSetupAboutInit()函数 //对话框初始化函数
调用urlctrl_set()函数,该函数操作如下,都是调用SetWindowLong()函数的动作:
(1)关联static控件的窗体函数urlctrl_proc到该控件的句柄
(2)关联相关的Window Style到该控件句柄
(3)关联要显示的文本及链接到该控件的句柄
2.执行dlgSetupAbout()函数 //对话框的窗体处理函数
响应WM_CTLCOLORSTATIC消息
(to fathappy:我测试过了,在WM_CTLCOLORSTATIC消息的处理过程中,函数传递进来的lParam参数根本就没有变成我想处理的static控件的ID过,也就是说,我在这里访问不到我的static控件。似乎在前面的初始化过程以后,对话框的窗体处理函数就没把我的控件当成一般的static控件了。所以这里不能对我的static控件的文本和背景属性进行修改。)