BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap mymap;
mymap.LoadBitmapW(MAKEINTRESOURCE(IDB_BITMAP5));
BITMAP bmpinfo;
mymap.GetBitmap(&bmpinfo); CDC memDC;
CClientDC dc(this);
memDC.CreateCompatibleDC(&dc); CBitmap* pbmpOld=memDC.SelectObject(&mymap); CRect rectclient;
GetClientRect(&rectclient);
dc.StretchBlt(0,0,rectclient.right,rectclient.bottom,
&memDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY); memDC.SelectObject(pbmpOld);
memDC.DeleteDC();
return TRUE;
}
先做下说明:
这是我学MFC时一个测试用的对话框程序中OnEraseBkgnd函数部分.
这个对话框窗口中有两个非自绘的普通的Windows按钮控件.
IDB_BITMAP5是资源中的一幅位图ID作为背景图.当执行上面代码后,对话框中的按钮控件是不可见的.只有鼠标移到按钮位置上才可见,当鼠标移至另一按钮位置上时,另一按钮则浮显出来,而之前的按钮则被背景刷掉.
后来将 dc.StretchBlt(0,0,rectclient.right,rectclient.bottom,
&memDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
这条语句改为
pDC->StretchBlt(0,0,rectclient.right,rectclient.bottom,
&memDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
后,则显示正常.所有按钮均可见在背景之上.提问:
为什么会出现这种情况?只是换了个CDC对象而已.
我的理解是:当窗口程序需要重绘时,会先刷新背景(即:调用OnEraseBkgnd函数),后再进行OnPaint()或OnDraw()的图形绘制.而我也认为在对话框中的按钮控件的绘制也是在OnEraseBkgnd刷完背景后才进行的动作.
1,所以如果是这样的顺序,那为什么用自已定义的dc就会把按钮控件先刷掉呢?
2.当需要刷背景时,控件自身的绘制是在什么时候进行的.
小弟请教:我的理解在哪出错了.忒搞怪了.