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的功能是把源设备上下文中的位图复制到目标设备上下文中。