在无文档的VIEW中,在生成VIEW的函数中有Create函数,可以修改Create函数中关于背景颜色的设定值就可以改变View的背景色。
但是在有文档的DOC/VIEW结构中,程序中找不到View的Create函数,这时如何修改VIEW的背景色?
我搜索过,目前有三种方法:
1 修改View的注册类的信息
2 使用WM_CTLCOLOR消息
3 使用WM_ERASEBKGND消息
请教这三种方法的实施例,特别是第一种方法的,能否详细说明!
但是在有文档的DOC/VIEW结构中,程序中找不到View的Create函数,这时如何修改VIEW的背景色?
我搜索过,目前有三种方法:
1 修改View的注册类的信息
2 使用WM_CTLCOLOR消息
3 使用WM_ERASEBKGND消息
请教这三种方法的实施例,特别是第一种方法的,能否详细说明!
{
CRect rect;
GetClientRect(rect);
pDC->FillSolidRect(rect, RGB(...));
return TRUE;}
{ //设置brush为希望的背景颜色
CBrush backBrush(RGB(255, 128, 128)); //保存旧的brush
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect); //画需要的区域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush); return TRUE;} 若要改变CFromView继承类的背景颜色,下面是一个范例代码:HBRUSH CMyFormView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{switch (nCtlColor)
{ case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
{ pDC->SetBkMode(TRANSPARENT);
//不加任何处理或设置背景为透明}
case CTLCOLOR_DLG:
{ CBrush* back_brush;
COLORREF color;
color = (COLORREF) GetSysColor(COLOR_BTNFACE);
back_brush = new CBrush(color);
return (HBRUSH) (back_brush->m_hObject);}} return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));}
谢谢!
strMyClass = AfxRegisterWndClass(
CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH) ::GetStockObject(WHITE_BRUSH),//在这里进行设置
::LoadIcon(NULL, IDI_APPLICATION));
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap; // only paint the rect that needs repainting
CRect client;
pDC->GetClipBox(client);
CRect rect = client;
DocToClient(rect);
//---------------------------------------------------不让它闪
if (!pDC->IsPrinting()) //如果没有使用打印机
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC)) //创建一个与其它设备相兼容的内存设备表,可在内存中准备图像
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height())) //初始化一个与pDC相容的位图,作为PDC指定的设备相
//容的任何内存设备的当前位图
{
OnPrepareDC(&dc, NULL); //为打印预览调用ONDRAW OR ONPAINT 函数之前 pDrawDC = &dc; //CDC类的对象附值给CDC的指针 // offset origin more because bitmap is just piece of the whole drawing
dc.OffsetViewportOrg(-rect.left, -rect.top); //修改视口原点坐标
pOldBitmap = dc.SelectObject(&bitmap);
dc.SetBrushOrg(rect.left % 8, rect.top % 8); //指定下一个进入设备环境的画刷的原点坐标 // might as well clip to the same rectangle
dc.IntersectClipRect(client);
//当前区与指定区相交区创建的一个新的裁剪区。
}
}
}
else {//printing
}
// paint background
//------------------------------------------------------
CBrush brush;
if (!brush.CreateSolidBrush(pDoc->GethtqColor()))//RGB(0,0,0)))//pDoc->GetPageColor())) //pDoc的函数返回一个色
return; brush.UnrealizeObject(); //重新安排一个画刷的开始的色。
pDrawDC->FillRect(client, &brush);
pDoc->UpdateAllViews(this);
if (pDrawDC != pDC)//drawing in the view //在上面有附值
{
pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dc.SetViewportOrg(0, 0);
dc.SetWindowOrg(0,0);
dc.SetMapMode(MM_TEXT);
//设置一系列的坐标
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), //拷位图
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
}WM_ERASEBKGND中封掉所有代码,return TRUE;