none
将自己导入的bitmap显示 RRS feed

  • 问题

  • 自己导入一个IDB_PICTURE显示不了。其他部分没问题,就是绘图出现问题。请教高手解答,万分感激。
    在CGAMEWND中定义了:
    RECT m_rcClient;
    CBrush m_brsBG;
    在类初始化中,
    CGameWnd::CGameWnd()
    {
    m_bmp.LoadBitmap(IDB_PICTURE);
    m_brsBG.CreateSolidBrush(COLOR_BLACK);
    }
    
    绘图函数:
    void CGameWnd::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    	CDC dcMemory; // 内存设备
    
    	CBitmap bitmap;
    	CRect m_rcClient;
      GetWindowRect(&m_rcClient);
    	// 与dc设备兼容
    	dcMemory.CreateCompatibleDC(&dc);
    	
    	// 使得bitmap与实际显示的设备兼容
    	bitmap.CreateCompatibleBitmap(&dc, m_rcClient.Width(),m_rcClient.Height());
    // 内存设备选择物件-位图
    	dcMemory.SelectObject(&bitmap);
    	//绘制背景框
    	dcMemory.FillRect(&m_rcClient, &m_brsBG);
    				
    	//DrawWall((CPaintDC&) dcMemory);
    
    	for (int i = 0; i<M_NUM_HEIGHT; i++) 
    	{
    		for (int j = 0; j<M_NUM_WIDTH; j++) 
    		{
    			switch(m_cMap[i][j])
    			{
    				case MAP_WALL:
    				DrawWall((CPaintDC&) dcMemory, i, j);
    			}		
    		}
    	}
    	// 将内存设备的内容拷贝到实际屏幕显示的设备
    	dc.BitBlt(0, 0, m_rcClient.Width(),m_rcClient.Height(), &dcMemory, 0, 0, SRCCOPY);
    	bitmap.DeleteObject();
    	
    }
    
    void CGameWnd::DrawWall(CPaintDC &dc, int j , int i )
    {
    	CDC dcMemory; //用作内存设备	
    	dcMemory.SelectObject(m_bmp); //将内存设备与位图资源关联	
    	dcMemory.CreateCompatibleDC(&dc); //使得这个设备与dc兼容
    	dc.StretchBlt(32*j, 32*i, 32, 32, &dcMemory, 0, 0, 32, 32, SRCCOPY);
    }
    2011年8月14日 3:50

答案

  • 您的DrawWall函数中的CDC dcMemory; 您后面的两句顺序好像不对,应该先CreateCompatibleDC来创建内存兼容DC,然后再SelectObject加载位图吧。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年8月19日 8:43
    2011年8月14日 12:05
    版主