请问如何将整个窗口的底色改变

xsun0531 2002-08-01 10:23:48
谢谢
...全文
207 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsun0531 2002-08-04
  • 打赏
  • 举报
回复
谢谢
ConserLin 2002-08-02
  • 打赏
  • 举报
回复
MFC的做法; (处理信息ON_WM_CTLCOLOR())
//注意: m_br是自已定义的成员变量(CBrush)

HBRUSH CYourDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(pWnd == this)
{
//如果是本窗口,则改变Color,可以在其它方法中改变m_br的
// Color
return (HBRUSH)m_br;

}
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
ttzzgg_80713 2002-08-02
  • 打赏
  • 举报
回复
同意楼上的。
virtualfunction 2002-08-02
  • 打赏
  • 举报
回复
映射WM_ERASEBKGND消息,在OnErasebkgnd(CDC *pDC)中加入绘图代码;这样不仅可以任意改变颜色,还可以用图片做背景。
andy_lau 2002-08-02
  • 打赏
  • 举报
回复
映射WM_ERASEBKGND消息,在OnErasebkgnd(CDC *pDC)中加入绘图代码;这样不仅可以任意改变颜色,还可以用图片做背景。
classy 2002-08-01
  • 打赏
  • 举报
回复
Visual C++的程序设计技巧
山东科技大学智能工程研究所 杨在春 何明祥


Microsoft Visual C++是一种可视化编程语言,因功能强大而受到广大程序设计人员的青睐。但是,由于VC++的应用程序框架结构非常复杂,使得许多初学者望而却步。本文通过对设置视图背景颜色和改变对话框标题的几种实现方法的分析研究,揭示了VC++程序代码执行时的一些本质特征和有关的程序设计技巧,对理解MFC库的结构和Windows操作系统的内部工作方式提供了一定的帮助。
设置视图背景颜色
对于VC++文档、视结构中的视图,从用户的角度来看,只是可以改变大小、位置的普通窗口,同其他基于Windows应用程序的窗口是一样的;从程序员的角度来看,视图并不是普通的窗口,而是从MFC库中CView类派生的类对象。像任何VC++对象一样,视图对象的行为由类的成员函数(数据成员)决定,包括派生类中应用程序定义的函数和从基类继承来的函数。
提出问题
视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的。设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景。我们可以用Windows函数SetSysColors来重新指定COLOR_WINDOW所对应的实际颜色,来达到改变视图背景颜色的目的。但这样会同时改变其他应用程序的视图窗口背景,使得整个Windows系统的颜色设置产生混乱。另外,我们可能会用以下方法来设置视图的背景颜色,即在CView的OnDraw函数中添写如下一段程序代码:

void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;
CBrush brushBkColor;
GetClientRect(rectClient);
brushBkColor.CreateSolidBrush(RGB(255,0,0));
pDC->DPtoLP(rectClient);
pDC->FillRect(rectClient,&brushBkColor);

}

这样可以达到改变当前应用程序的视图背景的目的,但同时也产生了一些不良影响,使得程序运行效果不尽如人意。
分析问题
我们知道,在VC++的文档、视结构中,CView的OnDraw函数用于实现绝大部分图形绘制的工作。如果用户改变窗口尺寸,或者显示隐藏的区域,OnDraw函数都将被调用来重画窗口。并且,当程序文档中的数据发生改变时,一般必须通过调用视图的Invalidate(或InvalidateRect)成员函数来通知Windows所发生的改变,对Invalidate的调用也会触发对OnDraw函数的调用。正因为OnDraw函数被频繁调用,所以在其执行时,每次都刷新填充一次视图客户区域,便会使屏幕不稳定,产生闪烁现象。
笔者通过对VC++应用程序框架结构和Windows消息映射系统的仔细研究,找到另外一种改变视图背景的方法,其执行效果比上述两种方法都好。其实在程序调用OnDraw函数之前,会触发一个Windows消息:WM_ERASEBKGND,以擦除视图刷新区域。在缺省情况下,Windows系统使用视图窗口注册时窗口类中的成员hbrBackground所描述的画刷来擦除屏幕,这一般会将屏幕刷新成COLOR_WINDOW所对应的颜色。因此,在OnDraw函数中设置背景颜色的执行过程是这样的:先将屏幕刷新成COLOR_WINDOW所对应的颜色,接着又在OnDraw函数中填充其他颜色,这正是产生屏幕闪烁的根本原因。
解决问题
通过上述分析,我们应将视图背景颜色填充移到Windows消息:WM_ERASEBKGND所对应的消息映射函数中,而不是在OnDraw函数中。我们可以通过下列步骤实现这一过程:在文档类中增加一成员变量m_viewBkColor保存当前背景颜色,同时增加两个成员函数GetViewBkColor和SetViewBkColor对其进行读写操作。这样做的好处是可以对m_viewBkColor成员进行序列化,将其和文档联系在一起,打开某一文档时,其背景将和上一次程序操作该文档时的背景保持一致。在视图类中为视图的Windows消息WM_ERASEBKGND增加消息映射函数OnEraseBkgnd,代码如下:

BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
CBrush brush;
brush.CreateSolidBrush(GetDocument()->GetViewBkColor());
pDC->GetClipBox(rect);
pDC->FillRect(rect,&brush);
return true;
}
在该函数中不需要对客户区域矩形进行设备坐标到逻辑坐标的转换,并且Windows在调用该函数时会自动进行裁剪区域的计算,使得需要刷新的屏幕面积达到最小。这样我们可以在程序中通过设计下列菜单函数轻松地改变视图背景的颜色,而且运行效果相当令人满意。
void CTestView::OnChangeViewBkcolor()
{
CColorDialog cdlg;
if(cdlg.DoModal()==IDOK)
{
GetDocument()->SetViewBkColor
(cdlg.GetColor());
InvalidateRect(NULL);
}
}
改变对话框标题
提出问题
在VC++程序设计过程中经常会遇到这样的情况:执行程序的多个地方需要调用同一个对话框,但在不同的情况下希望给对话框加上不同的标题。开始我们可能会用下面的一段程序以达到这一目的:
CTestDialog dlg;
dlg.SetWindowText(“标题-1");
dlg.DoModal();
利用上述办法,我们本希望在程序不同的地方,通过设置函数SetWindowText不同的参数,以达到使同一对话框具有不同标题的目的,但这样做是行不通的。
分析问题
利用这种方法,当执行该段程序时,在一个可以忽略的错误之后,对话框的标题不会发生任何改变。这是因为,VC++程序设计中,大部分窗体是动态创建的。比如上述对话框,在对dlg.DoModal的调用之前,虽然已构造了对话框的VC++对象,但窗体对象还没有被创建,显然对一个没有创建窗体对象的对话框设置标题是行不通的。另外,dlg.DoModal的调用结束时,对话框窗体对象将立即被释放,因此在该函数之后设置对话框标题也是不行的。
解决问题
通过对VC++框架结构中函数的调用顺序的分析,我们发现在dlg.DoModal执行的开始时,程序会自动调用对话框的一系列初始化函数,其中包括对对话框成员函数OnInitDialog的调用,从这里入手,将找到改变对话框标题的办法。为此,首先为对话框引进一个类型为CString的公有成员变量m_strCaption,并将上述程序段改为:
CTestDialog dlg;
dlg.m_strCaption = “标题-1";
dlg.DoModal();
然后重载对话框的虚成员函数OnInitDialog如下:
BOOL CTestDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(m_strCaption);

return TRUE;
}
通过这种办法,每次在打开对话框之前,只要将对话框公有成员变量m_strCaption设置为一个不同的值,就可使得对话框有不同的标题。
小 结
本文介绍的2个技巧有一个相似之处,就是用于解决问题的程序实现代码基本上是相同的,只是被放在了程序流程的不同地方。这正是学习和熟练掌握VC++的一个非常重要的方面,是影响其程序执行效率和性能的关键。
















plum_zr 2002-08-01
  • 打赏
  • 举报
回复
在c***app::initinstance()中加入
SetDialogBkColor(RGB(204, 204, 204), RGB(0, 0, 0));
看看!
关于TextDiff: 编写 TextDiff 的主要目的是演示我的 Delphi 控件 TDiff 的比较速度与精确性,因而与商业文本比较合并工具相比,本程序会缺少一些特性。 主要特性: ?快速的比较算法 ?高亮显示不同的行 ?允许忽略空格及字母大小写的区别 ?在不同处之间快捷跳转 ?快捷合并 ?文本编辑 ?多重撤销/重复 ?查找及替换文字 ?开放源代码的自由软件 比较文本: 使用 文件|打开 菜单可以在相邻的比较窗口中打开需要比较的两个文本文件。(也可以将文件拖曳到 TextDiff 窗口中。) 使用 操作|比较 (F9) 菜单可以比较打开的文件。比较完成之后,不同的文本块将以高亮颜色标记。可以自定义文本显示字体和高亮标记颜色。按下 Ctrl+N 或 Ctrl+P 组合键可以快速切换到下一个或上一个不同的文本块。 编辑文本: 任意时候都可以编辑文本并回存到文件中。如果需要在比较之前编辑文本,必须在比较前保存文件。比较之后,仍然可以编辑文件。另外,本程序也支持剪切、复制、粘贴等剪贴板操作。被修改的文本行将以银灰底色标记。 合并文本: 完成文件比较之后(参见上图),任何不同之处都可以从一个文件合并到另一个文件。 高亮标记的文本块可以方便地从一个文件复制到另一个文件中。把光标移到准备复制的文本块中,按下 Ctrl+Alt+Right 或 Ctrl+Alt+Left 组合键就能分别将整个文本块复制到右侧或左侧文件中。注意不要打乱文本块的对齐顺序(插入或删除文本行),否则之后的所有文本块都不能应用合并文本操作。 声明: TextDiff 是自由软件。任何使用本软件的用户都不能为任何目的要求本软件实现某种功能或达到某个精确度。另外,任何使用本软件的用户都必须自己承担使用本软件可能造成的任何损失,软件作者不为此承担任何责任。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧