飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4901|回复: 2

[C/C++] VC++中色彩的运用

[复制链接]

该用户从未签到

发表于 2010-5-27 13:27:51 | 显示全部楼层 |阅读模式
如华丽得体的衣装可以让一个外貌平平的女孩变得自信而愉快那样,在VC++程序界面中适当地配上颜色也会使你的程序变得生动悦目。

  一、寻找VC++中调色板的配色参数
  最直接的方法是设置应用程序主窗体的背景色。对此,简单的办法是通过ClassWizard在视图中创建一个成员函数来响应消息WM_ERASEBKGND,关键源代码如下:

   BOOL CMyView::OnErase Bkgnd(CDC* pDC)

  {

   CBrush backBrush(RGB(255,255,0));

   CBrush* pOldBrush=pDC->SelectObject(&backBrush);

   CRect rect;

   pDC->GetClipBox(&rect);

   pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);

   pDC->SelectObject(pOld Brush);

  return TRUE;

  }

  本段代码的作用是将主窗体背景绘制成米**,其中所用的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下调试运行通过。
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 16:37:43 | 显示全部楼层
    现在还用这种方式?ui痛!
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-5-27 17:21:14 | 显示全部楼层
    回复 2# whypro


        没办法  我业余
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表