BOOL CMYView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
this->m_chessboard.LoadBitmapW(IDB_CHESSBOARD);
this->m_begin.LoadBitmapW(IDB_BEGIN);
this->m_end.LoadBitmapW(IDB_END);
this->isBitmapLoaded=true; return CView::PreCreateWindow(cs);
}void CMYView::OnDraw(CDC* pDC)
{
CGobangDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return; // TODO: add draw code for native data here if(this->isBitmapLoaded){//如果不加这个判断,贴图就会一闪就消失,看不到效果,请问是为什么?
this->C_Chessboard.CreateCompatibleDC(pDC);
this->C_Begin.CreateCompatibleDC(pDC);
this->C_Begin.CreateCompatibleDC(pDC); this->C_Chessboard.SelectObject(this->m_chessboard);
this->C_Begin.SelectObject(this->m_begin);
this->C_End.SelectObject(this->m_end); this->isBitmapLoaded=false;
} pDC->BitBlt(0,0,800,600,&this->C_Chessboard,0,0,SRCCOPY);
pDC->BitBlt(590,145,119,64,&this->C_Begin,0,0,SRCCOPY);
pDC->BitBlt(590,275,115,63,&this->C_End,0,0,SRCCOPY);
}
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
this->m_chessboard.LoadBitmapW(IDB_CHESSBOARD);
this->m_begin.LoadBitmapW(IDB_BEGIN);
this->m_end.LoadBitmapW(IDB_END);
this->isBitmapLoaded=true; return CView::PreCreateWindow(cs);
}void CMYView::OnDraw(CDC* pDC)
{
CGobangDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return; // TODO: add draw code for native data here if(this->isBitmapLoaded){//如果不加这个判断,贴图就会一闪就消失,看不到效果,请问是为什么?
this->C_Chessboard.CreateCompatibleDC(pDC);
this->C_Begin.CreateCompatibleDC(pDC);
this->C_Begin.CreateCompatibleDC(pDC); this->C_Chessboard.SelectObject(this->m_chessboard);
this->C_Begin.SelectObject(this->m_begin);
this->C_End.SelectObject(this->m_end); this->isBitmapLoaded=false;
} pDC->BitBlt(0,0,800,600,&this->C_Chessboard,0,0,SRCCOPY);
pDC->BitBlt(590,145,119,64,&this->C_Begin,0,0,SRCCOPY);
pDC->BitBlt(590,275,115,63,&this->C_End,0,0,SRCCOPY);
}
解决方案 »
- VC最新动向? 现在VS.net 2008出来了。VC方面有什么变化吗?
- CListCtrl根据item是否被选中,决定删除按钮是否有效。
- VC++如何实现窗口继承(VC新手希望得到高手们的帮助谢谢)
- 哎~~~超级女生的卖点是什么?? 眼泪!!
- 后台服务进程如何在用户登陆时收到通知?
- 自定消息碰到的问题
- 请问关于CWinApp::CWinApp的问题
- 简单问题请教:WM_SYSKEYDOWN、WM_NCLBUTTONDOWN都是什么消息?
- 怎么把窗口置顶?-------在线等待!
- 不知用SDK编的程序,最小是多大的啊!
- 链接有问题,不知道如何解决
- MSHTML的问题,在walkall例程中,有些元素值得不到,怎么办?
上面代码的重点是:重复CreateCompatibleDC,SelectObject就不能正确贴图。CreateCompatibleDC,SelectObject执行一次后就不能反复执行,否则贴图就会一闪就消失,看不到效果。
this->C_Begin.CreateCompatibleDC(pDC);
怎么有两行一样的?
不加这个判断问题多着呢。
看不见效果算是幸运的了吧。
不好意思,这个地方是我打错了
this->C_Begin.CreateCompatibleDC(pDC);
this->C_End.CreateCompatibleDC(pDC);那么为什么会出现那样的问题,能说说吗?
我想应该和
this->isBitmapLoaded=false; 这句有关。
你不加判断就相当于这样。
问题就在于,为什么要避免CreateCompatibleDC,SelectObject执行多次??
{
this->m_chessboard.LoadBitmapW(IDB_CHESSBOARD); this->isBitmapLoaded=true; return CView::PreCreateWindow(cs);
} void CMYView::OnDraw(CDC* pDC)
{
if(this->isBitmapLoaded){
this->C_Chessboard.CreateCompatibleDC(pDC); this->C_Chessboard.SelectObject(this->m_chessboard); this->isBitmapLoaded=false;
} pDC->BitBlt(0,0,800,600,&this->C_Chessboard,0,0,SRCCOPY);
}//我把上面的代码精简些这样会容易看清些。
如果cd对像已经attach了一个句柄,要想在调用CreateCompatibleDC,应该先调用DeleteDC。
我多次选择同一个画笔,如this->m_chessboard,和只选择一次画笔有什么区别?
为什么,多次选择画笔就出现了贴图一闪就消失的情况?
void CMYView::OnDraw(CDC* pDC)
{
if(this->isBitmapLoaded){
this->C_Chessboard.CreateCompatibleDC(pDC); this->isBitmapLoaded=false;
}
this->C_Chessboard.SelectObject(this->m_chessboard);
pDC->BitBlt(0,0,800,600,&this->C_Chessboard,0,0,SRCCOPY);
}
试试。