本段代码的作用是将主窗体背景绘制成米黄色,其中所用的RGB宏是用于指定三原色(红,绿,蓝)的“配比数”,每个值都是0~255之间的一个整数。在上面代码中RGB表示混合同样一份红色与绿色,并关闭蓝色得到黄色;0,0,0为黑色,255,255,255为白色。
RGB宏是VC++程序使用颜色的基础,但在使用时遇到的棘手问题是,当你选择一种“中间色”时,你如何才能知道确切的“配方”──那三个0~255之间的颜色参数分别是多少?这也是笔者在研制一个项目中遇到的一个实际问题,尽管它在整个项目中显得微不足道。为此,笔者编制了一个实验程序,运行后可以调用MFC的颜色对话框,当我们选中具体颜色后,就得到其RGB值,并存放到文本文件RGBNum中。当我们得到这个值后,在上面代码中就可以用这个数值去替代RGB宏了。实验程序具体代码如下:
void CMyView::OnSelRGB()
{
CColorDialog colorDialog;
COLORREF Mycolor;
FILE *fin;
fin=fopen("RGBNum.txt","a");
if(colorDialog.DoModal()==IDOK)
{
Mycolor =colorDialog.GetColor();
fprintf(fin," Mycolor =%ld\n",Mycolor);
fclose(fin);
}
}
上述代码是通过COLORREF获取RGB颜色值的。COLORREF是一个32bit整数,它常用RGB宏作初始化。
二、设置对话框的背景颜色
要改变应用程序所有对话框的背景颜色,可以调用CwinApp::SetDialogBkColor(),它的第一个参数指定了背景颜色,第二个参数指定了文本颜色。
下例将应用程序对话框设置为蓝色背景和黄色文本。
BOOL CMyApp::InitInstance()
{
......
//蓝色背景黄色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,255,0));
......
}
三、如何控制文字的显示颜色
在VC++编程中,常会用LOGFONT结构中的14个字段定义去控制显示字符的大小、粗细、角度、字体等。而且可以用函数SetTextColor(COLORREF crColor)设置字符颜色。有关代码如下所示:
void CMyView::OnDraw(CDC* pDC)
{
CMenuCom03Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 设置文本颜色
COLORREF color=RGB(0,250,0);
pDC->SetTextColor(color);
pDC->TextOut(120,200,"彩色字体样例");
}
下一步,我们还可以设置具有翻转背景颜色的文本。即调用CDC::SetBkMode()函数并传送TRANSPARENT使背景颜色保持不变。以下代码用红色带阴影显示文本:
void CMyView::OnDraw(CDC* pDC)
{
CDelemeDoc* pDoc = Get Document();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(rc);
CString str(_T("Hello,World!"));
pDC->SetBkMode(TRANS PARENT);
rc.OffsetRect(1,1);
pDC->SetTextColor(RGB(0,0,0));
pDC->DrawText(str,str.GetLength(),rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
rc.OffsetRect(-1,-1);
pDC->SetTextColor(RGB(255,0,0));
pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE|DT_CEN TER|DT_VCENTER);
}
本文列举的源代码均在VC++6.0下调试运行通过。
计算机等级考试释疑:VB应试心得
VB因简单易学、功能强大和微软的支持而成为主流,于是越来越多参加全国计算机等级考试的人选择了它。不过请大家注意:二级VB考试笔试与上机时间均为90分钟,千万不要与其他语言的考试时间发生混淆。
VB与QB的区别与联系
VB与QB在数据类型、语法和程序结构等方面有很多相同之处,VB仍采用基本的BASIC语言,但它们的区别却是根本性的:
1.QB只是一门程序设计语言,而VB不但是一门程序设计语言,更重要的还是在Windows操作系统界面下的软件开发工具,它主要用来开发可视化软件。
2.QB中的程序是一个完整的程序系统,是不可以分割的,程序执行时从头执行到尾,编写程序时一定要精确地写出每一个步骤;而VB程序采用的是事件驱动编程机制,用户编写程序时不必写出很长的程序,只要写出简短的程序片断就可以了。
比如这样一个例子,要求编程实现:输入两个数,输出它们的和。如果用QB,程序如下:
INPUT a;b
c=a+b
PRINT c
END
而用VB程序则如下:
Private Sub Command1_Click()
A=InputBox("a=")
B=InputBox("b=")
C=val(a)+val(b)
Print C
End Sub
这个例子中QB程序与VB程序在程序代码和语法规则上基本相似,但执行时就不一样了:QB只要运行,就可以得出结果;而VB程序则必须用鼠标单击Command1对象才能执行其代码,得出结果。如果单击窗体则操作对象错误;如果对Command1不单击而进行其他操作,则对象响应事件错误。这两者都不能执行VB下面的程序代码。因而在VB应试学习过程中,既要学会分析BASIC程序的执行流程,又要熟悉和掌握VB的操作界面、面向对象程序设计的特点。
重视VB的基本概念
VB的基本概念中,要特别重视数据类型的定义、表达式、函数及常用控件的属性、功能和使用。这是掌握面向对象程序设计、学会编写事件代码的基础,考试的内容涉及面很广,大家要多加记忆与理解。
在前面的例子中,如果将其中的“C=val(a)+val(b)”改为“C=A+B”,那么从键盘输入A=1,B=2,结果还是3吗?答案是否定的。因为InputBox函数是输入语句,它只能接收文本,所以变量A与B内存放的并非是数字1与2而是字符“1”与“2”,而语句C=A+B中的“+”号的含义对于文本来讲并不是加而是连接的意思,因而答案为12。这个问题的理解充分地说明了掌握基本概念的重要性。
2002年秋季笔试中有一选择题:在窗体上画一个名称为Commandl的命令按钮,然后编写如下程序:
Private Sub Command1_Click()
Static X As Integer
Static Y As Integer
Cls
Y=1
Y=Y+5
X=5+X
Print X,Y
End Sub
程序运行时,三次单击命令按钮Commandl后,窗体上显示的结果为:
A) 15 16 B) 15 6
C) 15 15 D) 5 6
解析:本题主要考查对数据的定义,用Dim和用Static定义的变量在程序中的结果是完全不同的。用Dim定义的变量,在过程运行结束后,变量的值不会保留;用Static定义的变量,其值只被初始化一次,其后的值将继续保留。题目中x定义为Static类型,x第一次运行时初值为0,第二次运行前其值变为5,第三次运行前其值变为10,而y虽然也定义为Static,但每次都要执行一个“y=1”这个赋值语句,所以第三次执行完,其结果应为:x=15,y=6。
掌握VB中的控件
在VB中,控件是非常重要的内容,考试中常常应用在程序分析和上机操作中。考生们要多记忆、多运用、多对比、多总结,举一反三,才能掌握好各个控件。
2002年春季笔试中有一选择题:在窗体上画两个单选按钮,名称分别为Option1、Option2,标题分别为“宋体”、“黑体”;一个复选框,名称为Check1,标题为“粗体”;一个文本框,名称为Text1,Text属性为“改变文字字体”。要求程序运行时,“宋体”单选按钮和“粗体”复选框被选中(窗体外观如图1),则能够实现上述要求的语句序列是:
A) Option1.value=True B) Option1.Value=True
Check1.Value=False Check1.Value=True
C) Option2.Value=False D) Option1.Value=True
Check1.Value=True Check1.Value=1
解析:本题主要考核VB的两个控件,单选按钮控件与复选框控件的Value属性,虽然它们属性名是一样的,但取值却不同。单选按钮Value属性值为True表示选中,而复选框选中其值应为1,所以正确答案应为D。许多考生由于学习过程中不注重对比,没有真正理解和掌握,常错选为B。
2002年秋季考试中有一填空题:在窗体上画两个标签,其名称分别为Label1和Label2,Caption属性分别为“数值”及空白;然后画一个名称为HScroll1的水平滚动条,其Min的值为0,Max的值为100。程序运行后,如果单击滚动条两端的箭头,则在标签Lable2中显示滚动条的值,如图2所示。请在[1]和[2]处填入适当的内容,将程序补充完整。
Private Sub HScroll1_[1]
Labl2.Caption=HScroll1.[2]
End Sub
解析:本题主要考查考生对于滚动条控件事件及属性的掌握,因为滚动条支持两个事件,即跟踪滚动条中的动态变化的Scroll事件和得到滚动条最后位置的Change事件,题中要求单击滚动条两端的箭头所能触发的事件应为Change事件,可以显示当前滚动位置(即数值)的应为Value属性,故应填入Change和Value。 |