VC++深入详解·chapter10·笔记

来源:互联网 发布:java后端工程师简历 编辑:程序博客网 时间:2024/06/06 10:58

1、颜色对话框的使用:
   CColorDialog dlg;
   dlg.m_cc.Flags|=CC_RGBINIT;//此处必须用或操作,否则原值将被擦掉。
   dlg.m_cc.rgbResult=m_clr;
   if(IDOK==dlg.DoModal())
   {
       m_clr=dlg.m_cc.rgbResult;
   }
   注:如果想要设置颜色对话框初始选择的颜色,则需要设置该对话框的CC_RGBINIT标记。这个标记可以在创建对话框时通过其构造函数的第二个参数设置,也可以在该对话框对象创建之后,设置其m_cc成员变量的Flags成员。Flags成员的取值还有一常用标价CC_FULLOPEN,该标记的作用就是让颜色对话框完全展开。  

2、字体对话框的使用:
   CFontDialog dlg;
   if(IDOK==dlg.DoModal())
   {
       if(m_font.m_hObject)//利用GetGdiObject对象的数据成员m_hObject来判断CFont m_font是否已经与某个字体资源关联了
                                      //m_hObject保存了与CGdiObject对象相关联的Windows GDI资源的句柄
            m_font.DeleteObject();//如果关联了就释放字体资源
       this->m_font.CreateFontIndirectW(dlg.m_cf.lpLogFont);//保存用户选择的字 体
       m_strFont=dlg.m_cf.lpLogFont->lfFaceName;//保存字体名称,是一个字符串
       Invalidate();//让窗口无效,谠下一次发生WM_PAINT消息是,窗口就会进行重绘
   }

3、CGdiObject类(CPen, CFont, CBitmap, CBrush等)对象:是一个类的对象
    Windows GDI对象:是一种资源对象
    二者的关系就好像窗口类的对象和窗口的关系一样。GetGdiObject对象的数据成员m_hObject保存了与CGdiObject对象相关联的 Windows GD
    资源的句柄,二者之间通过此一数据成员来维系。

4、ScreenToClient函数:由屏幕坐标转换为客户坐标
    原型:void ScreenToClient(LPRECT lpRect) const;

5、改变对话框和控件的背景色及文本颜色:
   1> 当一个字空间将要被绘制时,它都会向它的父窗口发送一个WM_CTLCOLOR消息来准备一个设备上下文,以便使用正确的颜色来绘制该控件。
   2> 如果要想改变该控件上的文本颜色,可以在OnCtlColor函数中指定的颜色为参数调用SetTextColor函数(WM_CTLCOLOR的响应函数)来实现。
   3> 改变对话框的背景颜色:自定义一个画刷,然后让OnCtlColor函数返回这个画刷句柄即可。//注释掉默认画刷,即return hbr;
   4> 控件上的文本本身也有背景颜色,应将其设置为透明的
   5> OnCtlColor第二个参数指定当前要绘制的控件的指针
   eg:示例代码:
   if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)
   {
       pDC->SetTextColor(RGB(255, 0, 0));
       //pDC->SetBkMode(TRANSPARENT);
       return m_brush;
   }
   if(pWnd->GetDlgCtrlID()==IDC_EDIT1)//一Edit Control,通过函数第二个参数调用GetCtrlID获得当前绘制控件的ID
   {
       pDC->SetTextColor(RGB(255, 0, 0));
       pDC->SetBkColor(RGB(0, 255, 0));
       return m_brush;
   }
   if(pWnd->GetDlgCtrlID()==IDC_WIDTH)//一static text
   {
       pDC->SetTextColor(RGB(255, 0, 0));
       pDC->SetBkColor(RGB(0, 255, 0));
       return m_brush;
   }
   if(pWnd->GetDlgCtrlID()==IDC_TEXT)//一static text
   {
       //pDC->SetTextColor(RGB(255, 0, 0));
       pDC->SetBkColor(RGB(0, 255, 0));
       pDC->SelectObject(&m_font);//设置字体
       return m_brush;
   }
   return m_brush;

6、改变按钮控件的背景色及文本颜色:
   1> 使用CButton类成员函数DrawItem
   2> 设置按钮的BS_OWNERDRAW风格:勾选Owner draw属性(自绘制按钮)
   3> 编写一个自定义的按钮类,让这个类派生于CButton,并重写DrawItem函数,在此函数中实现按钮背景色和文本颜色的设置。然后将目标按钮与这个类相关联。
   4> CButtonST按钮类(网上资源)

7、窗口的绘制过程:
   1> 首先擦出窗口背景。当擦除窗口背景时,程序会发送一个WM_ERASEBKGND消息,可以在此函数中完成位图的显示
   2> 然后在对窗口重新进行绘制

8、位图的显示/兼容DC的使用:(因为我们没有擦除背景,而是直接贴上位图,所以窗口闪烁比较小/注释了基类erase函数的调用)
   BOOL CdrawView::OnEraseBkgnd(CDC* pDC)
   {
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   CBitmap bitmap;
   bitmap.LoadBitmapW(IDB_BKGND);

   CDC dcCompatible;
   dcCompatible.CreateCompatibleDC(pDC);

   //兼容DC原始只有1个像素大小,它的大小由选入的位图的大小所确定
   dcCompatible.SelectObject(&bitmap);

   //得到一副位图的信息(如宽度、高度等)
   BITMAP bmp;
   bitmap.GetBitmap(&bmp); //此函数的调用,将用bitmap(CBitmap类型)的相关信息填充bmp结构体,即bmp中已保存了bitmap的信息了

   CRect rect;
   GetClientRect(&rect);
   //pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY);
   pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);//可以实现 拉伸功能
  
   return true;
   //return CView::OnEraseBkgnd(pDC);// 调用基类的erase函数,效果是把窗口的背景擦除,并返回非0值。
   }
   注:BitBlt的功能是把源设备上下文中的位图复制到目标设备上下文中。

原创粉丝点击