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);
}

解决方案 »

  1.   

    不讨论select之后要不要delete,
    上面代码的重点是:重复CreateCompatibleDC,SelectObject就不能正确贴图。CreateCompatibleDC,SelectObject执行一次后就不能反复执行,否则贴图就会一闪就消失,看不到效果。
      

  2.   

    this->C_Begin.CreateCompatibleDC(pDC); 
    this->C_Begin.CreateCompatibleDC(pDC);
    怎么有两行一样的?
      

  3.   

    if(this->isBitmapLoaded){//如果不加这个判断,贴图就会一闪就消失,看不到效果,请问是为什么? 
    不加这个判断问题多着呢。
    看不见效果算是幸运的了吧。
      

  4.   


    不好意思,这个地方是我打错了
    this->C_Begin.CreateCompatibleDC(pDC);
    this->C_End.CreateCompatibleDC(pDC);那么为什么会出现那样的问题,能说说吗?
      

  5.   

    isBitmapLoaded 不知道这个变量你是怎么定义的。
    我想应该和
    this->isBitmapLoaded=false; 这句有关。
      

  6.   

    好久没弄这个了,记不太清楚了:一个dc 对象执行一次CreateCompatibleDC以后,在执行就会出错。
    你不加判断就相当于这样。
      

  7.   

    isBitmapLoaded这个就一bool变量,用来避免CreateCompatibleDC,SelectObject执行多次啊。
    问题就在于,为什么要避免CreateCompatibleDC,SelectObject执行多次??
      

  8.   

    BOOL CMYView::PreCreateWindow(CREATESTRUCT& cs) 

    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); 
    }//我把上面的代码精简些这样会容易看清些。
      

  9.   

    你要问为什么不执行多次,我只能回答你微软就是这样分装的CDC的,
    如果cd对像已经attach了一个句柄,要想在调用CreateCompatibleDC,应该先调用DeleteDC。
      

  10.   

    我有个理解是,总以为SelectObject就是选择画笔,BitBlt将画画出来,那么
    我多次选择同一个画笔,如this->m_chessboard,和只选择一次画笔有什么区别?
    为什么,多次选择画笔就出现了贴图一闪就消失的情况?
      

  11.   

    你的SelectObject是给dc选择位图而不是画笔,也就是BitBlt要操作的内容,主要问题不是在这里,而是CreateCompatibleDC不信你可以改成
    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); 

    试试。