olor);
}
自己写一个好看的按钮的 DrawItem函数还是很有难度的,现在很多人都是用强大的CButtonST类,在网上可以找到,不过该类的方法有很多,还没去研究。
最后是位图的显示。要显示一副位图,主要的过程是:先创建位图,然后创建兼容DC,将位图放入兼容DC中,最后将兼容DC中的位图贴到当前DC中。
兼容DC的创建是使用 CreateCompatible 函数。
view plain
virtual BOOL CreateCompatibleDC( CDC* pDC );
该函数参数就是当前DC的指针,创建的兼容DC就是要与之兼容。兼容DC实际上是一个内存块,表示一个显示的表面。如果想把图像复制到实际的DC中,可以先用兼容DC在内存中准备这些图像,然后再将其复制到实际DC中。当兼容DC被创建的时候,它的显示表明标准是一个像素的大小。在应用程序可以使用内存设备上下文进行绘图操作之前,必须将一个具有正确高度和宽度的位图选入设备上下文,这时,内存设备上下文的显示表面大小就由当前选入的位图决定了。
窗口绘制的过程是分两个步骤的:首先擦除窗口背景,然后在进行窗口重绘。
当窗口背景被擦除的时候会发送一个 WM_ERASEBKGND 消息,因此可以在该消息的响应函数中进行位图的显示:
view plain
BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&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);
}
在该函数的最后 不可以返回调用基类的函数,不然位图只会显示完马上就被擦除,应该然后TRUE。
然后呢,在显示位图的时候,如果想1:1显示的话,就用BitBlt函数,如果想位图可以根据客户区大小进行拉伸或者压缩,使得可以显示整张位图的话,就要用StretchBlt函数。
view plain
BOOL BitBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc,
int ySrc, DWORD dwRop );
view plain
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
第二个函数就比第一个多了两个参数,就是原来那副位图的宽度和高度。
作者“Kay's space”