Re: grid
I would probably draw the grid as part of the OnDraw() or OnPaint() process.
You might want to take a look at this sample code. It has a background grid
that scrolls nicely with the scrollview.
http://msdn2.microsoft.com/en-us/library/9t94971d(VS.80).aspx
Tom
"William" <port@mx15.freecom.ne.jp> wrote in message
news:ulsmgSggHHA.4032@TK2MSFTNGP02.phx.gbl...
Env: WindowsXP, VC++6.0
In my application, I need to draw grid on scaled(x8) bitmap in
CMyScrollView::OnDraw(CDC* pDC).
In the method No.1(below), I draw directly grid on the current hDC. But it
has a problem. When we move the scrollbar button, the view of grid is
changed(gray to white on some places).
In the method No.2(below), I firstly draw grid on another hdcScale. Then
copy it to the current hDC. There is no such problem. But I have to
consume
memory.
So, I am wondering how to work it around by method No.1.
TIA
William
***********************************************************************************
Method No.1
CMyScrollView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(&rcClient);
int iWindowWid, iWindowHei;
iWindowWid = rcClient.right / iZoom; //iZoom=8
iWindowHei = rcClient.bottom / iZoom;
//add one point
iWindowWid++;
iWindowHei++;
//when original bitmap is small than view window
iWindowWid = min(iWindowWid, cxImage);
iWindowHei = min(iWindowHei, cyImage);
::StretchBlt( pDC->m_hDC, 0, 0, iWindowWid * iZoom , iWindowHei * iZoom,
hdcImage, 0, 0, iWindowWid, iWindowHei, SRCCOPY);
//
// Draw grid
//
DrawGrid(pDC->m_hDC);
}
void CMyScrollView::DrawGrid(HDC hdcTemp)
{
const int brush_width = 8, brush_height = 8;
COLORREF colors[] = {RGB(128,128,128), RGB(192,192,192)};
HDC hDCPattern = ::CreateCompatibleDC(hdcTemp);
HBITMAP hBMP = ::CreateCompatibleBitmap(hdcTemp, brush_width,
brush_height);
HBITMAP hBMPOld = (HBITMAP)SelectObject(hDCPattern, hBMP);
for (int i=0; i<brush_width; i++)
for (int j=0; j<brush_height; j++)
SetPixelV(hDCPattern, i, j, colors[(i+1)*(j+1)&1]);
HBRUSH hBrPattern = ::CreatePatternBrush(hBMP);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdcTemp, hBrPattern );
for (int x = iScale; x < gi.cxScale; x += iScale)
PatBlt(hdcTemp, x, 0, 1, gi.cyScale, PATCOPY);
for (int y = iScale; y < gi.cyScale; y += iScale)
PatBlt(hdcTemp, 0, y, gi.cxScale, 1, PATCOPY);
SelectObject(hDCPattern, hBMPOld);
SelectObject(hdcTemp, hOldBrush);
DeleteObject(hBrPattern);
}
***********************************************************************************
Method No.2
CMyScrollView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(&rcClient);
int iWindowWid, iWindowHei;
iWindowWid = rcClient.right / iZoom; // //iZoom=8
iWindowHei = rcClient.bottom / iZoom;
//add one point
iWindowWid++;
iWindowHei++;
//when original bitmap is small than view window
iWindowWid = min(iWindowWid, cxImage);
iWindowHei = min(iWindowHei, cyImage);
HDC hdcScale;
HBITMAP hbmScale;
hdcScale = CreateCompatibleDC(hdcImage);
hbmScale = CreateCompatibleBitmap(hdcImage, iWindowWid * iZoom, iWindowHei
* iZoom);
SelectObject(hdcScale, hbmScale);
::StretchBlt( hdcScale, 0, 0, iWindowWid * iZoom , iWindowHei * iZoom,
hdcImage, 0, 0, iWindowWid, iWindowHei, SRCCOPY);
//
// Draw grid on hdcShow.
//
DrawGrid(hdcScale);
//
// Copy to the screen.
//
::BitBlt(pDC->m_hDC, 0, 0, iWindowWid * iZoom, iWindowHei * iZoom,
hdcScale, 0, 0, SRCCOPY);
DeleteDC(hdcScale);
DeleteObject(hbmScale);
}
*********************************************************************
NOTE:
hdcImage is made at initiation period as follows,
{
HDC hdcParent;
hdcParent = GetDC(m_hWnd);
hdcImage = CreateCompatibleDC(hdcParent);
hbmImage = Create256DIBitmap(hdcParent, cxImage, cyImage, FALSE ); //at
it CreateDIBSection() is called.
SelectObject(hdcImage, hbmImage);
}