在无文档的VIEW中,在生成VIEW的函数中有Create函数,可以修改Create函数中关于背景颜色的设定值就可以改变View的背景色。
但是在有文档的DOC/VIEW结构中,程序中找不到View的Create函数,这时如何修改VIEW的背景色?
我搜索过,目前有三种方法:
1 修改View的注册类的信息
2 使用WM_CTLCOLOR消息
3 使用WM_ERASEBKGND消息
请教这三种方法的实施例,特别是第一种方法的,能否详细说明!

解决方案 »

  1.   

    BOOL CYourView::OnEraseBkgnd(CDC* pDC)
    {
    CRect rect;
    GetClientRect(rect);
    pDC->FillSolidRect(rect, RGB(...));
    return TRUE;}
      

  2.   

    若要改变CView,CFrameWnd或CWnd对象的背景颜色需要处理WM_ERASEBKGND消息,下面就是一个范例代码:BOOL CSampleView::OnEraseBkgnd(CDC* pDC) 
    { //设置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));}
      

  3.   

    请zswzwy(←圣骑士!帕迪拉斯!) 详细介绍!
    谢谢!
      

  4.   

    你说的是不是重新构造一个窗口
     strMyClass = AfxRegisterWndClass(
        CS_VREDRAW | CS_HREDRAW,
        ::LoadCursor(NULL, IDC_ARROW),
        (HBRUSH) ::GetStockObject(WHITE_BRUSH),//在这里进行设置
        ::LoadIcon(NULL, IDI_APPLICATION));
      

  5.   

    不是重新构造一个窗口,而是修改已有的View的背景色
      

  6.   

    背景颜色只需要处理WM_ERASEBKGND消息.这是我的做法.
      

  7.   

    CDBFMDoc* pDoc = GetDocument();
    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;