void CDBDCView::MemDraw(CDC* pDC) { CRect rect; GetClientRect(rect); CDC memDC; CBitmap temBmp; memDC.CreateCompatibleDC(pDC); >>>temBmp.CreateCompatibleBitmap(&memDC,rect.Width(),rect.Height()); CBitmap* pOldBmp=memDC.SelectObject(&temBmp); CBrush brush(RGB(0,255,255)); CBrush* pOldBrush=memDC.SelectObject(&brush); memDC.Rectangle(rect); COLORREF oldColor; oldColor=memDC.SetBkColor(RGB(255,0,0)); memDC.TextOut(100,100,"CSDN"); pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp); >>>memDC.SelectObject(pOldBrush); memDC.SetBkColor(oldColor); }FROM MSDN: A memory DC exists only in memory. When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC.
HDC hMemDC = ::CreateCompatibleDC(hdc);
if(hMemDC == NULL)
return NULL;
CSize cs(GetWidth()+GetPenWidth(),GetHeight()+GetPenWidth());
HBITMAP hBmp = ::CreateCompatibleBitmap(hdc,cs.cx,cs.cy);
..... HBITMAP hOldBmp =(HBITMAP) ::SelectObject(hMemDC,hBmp);
PatBlt(hMemDC,0,0,cs.cx,cs.cy,WHITENESS); ........
CDC::FillSolidRect就可以了------------------------------------就这样
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap;CRect rect;
GetClientRect(&rect);
//========================================================
if (dc.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC,
rect.Width(),
rect.Height()))
{
OnPrepareDC(&dc,NULL);
pDrawDC = &dc;
pOldBitmap = dc.SelectObject(&bitmap);
}
}
//========================================================
pDoc->Draw(pDrawDC,ViewID);
pDrawDC->TextOut(1,1,*str);
dc.DPtoLP(&rect);
//========================================================
if ( pDrawDC != pDC )
{
pDC->BitBlt( 0, 0,rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
bitmap.DeleteObject();
}
各位帮忙给看看,是什么问题?
pOldBitmap = dc.SelectObject(&bitmap);
dc.FillSolidRect(&rect,RGB(255,255,255));
{
CRect rect;
GetClientRect(rect);
CDC memDC;
CBitmap temBmp;
memDC.CreateCompatibleDC(pDC);
temBmp.CreateCompatibleBitmap(&memDC,rect.Width(),rect.Height());
CBitmap* pOldBmp=memDC.SelectObject(&temBmp);
CBrush brush(RGB(0,255,255));
CBrush* pOldBrush=memDC.SelectObject(&brush);
memDC.Rectangle(rect);
COLORREF oldColor;
oldColor=memDC.SetBkColor(RGB(255,0,0));
memDC.TextOut(100,100,"CSDN");
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,
0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
memDC.SetBkColor(oldColor);
}
上面设置的字体背景为红色,但显示时全是黑色的把字都盖了
那个定义的也不行刷子
帮我解释一下这个问题,有什么解决方法
做最下面的画布。-----------------------------
http://ma3310.vicp.net
{
CRect rect;
GetClientRect(rect);
CDC memDC;
CBitmap temBmp;
memDC.CreateCompatibleDC(pDC);
>>>temBmp.CreateCompatibleBitmap(&memDC,rect.Width(),rect.Height());
CBitmap* pOldBmp=memDC.SelectObject(&temBmp);
CBrush brush(RGB(0,255,255));
CBrush* pOldBrush=memDC.SelectObject(&brush);
memDC.Rectangle(rect);
COLORREF oldColor;
oldColor=memDC.SetBkColor(RGB(255,0,0));
memDC.TextOut(100,100,"CSDN");
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
>>>memDC.SelectObject(pOldBrush);
memDC.SetBkColor(oldColor);
}FROM MSDN:
A memory DC exists only in memory. When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC.
>>>temBmp.CreateCompatibleBitmap(&pDC,rect.Width(),rect.Height());
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap;
CRect rect;
GetClientRect(&rect);
//========================================================
if (dc.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC,
rect.Width(),
rect.Height()))
{
OnPrepareDC(&dc,NULL);
pDrawDC = &dc;
pOldBitmap = dc.SelectObject(&bitmap);
}
}
//========================================================
//pDoc->Draw(pDrawDC,ViewID);
>>>>>>>>>pDrawDC->FillSolidRect(0,0, 100,100, RGB(255,0,0));
pDrawDC->TextOut(1,1,_T("ABC"));
dc.DPtoLP(&rect);
//========================================================
if ( 1)//pDrawDC != pDC )
{
pDC->BitBlt( 0, 0,rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
bitmap.DeleteObject();
}