**********************************************************************************
HBITMAP bit;//存放内存中的位图
HBITMAP bitBuffer;//存放兼容性位图
HDC MemDC;//绘制小图片的内存DC
HDC BackDC;//绘制背景图片的内存DC
HDC BackBuffer;//背景缓冲
CRect ClientRect;
******************************************
BOOL CGameStudyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
GetClientRect(ClientRect);
MemDC=CreateCompatibleDC(0);
BackDC=CreateCompatibleDC(0);
BackBuffer=CreateCompatibleDC(0);
bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());
SelectObject(BackBuffer,bitBuffer);
dir="pictures/";
p=39;
posX=200;
posY=30;
TimerEvent=0;
cc=dir+"earth.bmp";
if(LoadBmp(cc)==FALSE)
{
MessageBox(cc+"can't be found!","Error");
return FALSE;
}
SelectObject(BackDC,bit);
return TRUE; // return TRUE unless you set the focus to a control
}
*******************************************************************************************
void CGameStudyDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(p<49) //确定取第几张小图片
p++; //
else //
p=40; //
if(posY>=ClientRect.Height()/2) //
p=0; //
cc.Format("%shuman/c%03d.bmp",dir,p);
CClientDC dc(this);
BitBlt(BackBuffer,0,0,ClientRect.Width(),ClientRect.Height(),BackDC,0,0,SRCCOPY);//Draw background
if(LoadBmp(cc)==false)
{
AfxMessageBox(cc+"can't be found!");
return;
}
SelectObject(MemDC,bit);
TransparentBlt(BackBuffer,posX,posY,w,h,MemDC,0,0,w,h,RGB(255,255,255));//Draw the walking man
BitBlt(dc.m_hDC,0,0,ClientRect.Width(),ClientRect.Height(),BackBuffer,0,0,SRCCOPY);
if(posY<ClientRect.Height()/2)
posY+=2;
CDialog::OnTimer(nIDEvent);
}
*****************************************************************************************************
void CGameStudyDlg::OnOK()
{
TimerEvent=SetTimer(1,150,0);
GetDlgItem(IDOK)->EnableWindow(false);
//CDialog::OnOK();
}
12 个解决方案
#1
CDC* pDC = this->GetDC();
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );
#2
创建的DC不是根据dialog创建的,所以几个DC直接没有任何关系.
因此要先个getdc,然后根据这个dc创建memdc,backDC, BackBuffer, bitBuffer,在函数结束前记得releasedc.
好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建
因此要先个getdc,然后根据这个dc创建memdc,backDC, BackBuffer, bitBuffer,在函数结束前记得releasedc.
好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建
#3
上面的程序到底问题出现在哪里呢?为什么会没有图象显示出来?
#4
--变量定义乱七八糟的。
先检查一下ClientRect是否宽度,高度是0.
GetClientRect(&ClientRect); ??
先检查一下ClientRect是否宽度,高度是0.
GetClientRect(&ClientRect); ??
#5
GetClientRect(ClientRect);这一句没有问题。
#6
MemDC=CreateCompatibleDC(0);
BackDC=CreateCompatibleDC(0);
BackBuffer=CreateCompatibleDC(0);
bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());
用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);
BackDC=CreateCompatibleDC(dc);
BackBuffer=CreateCompatibleDC(dc);
bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());
BackDC=CreateCompatibleDC(0);
BackBuffer=CreateCompatibleDC(0);
bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());
用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);
BackDC=CreateCompatibleDC(dc);
BackBuffer=CreateCompatibleDC(dc);
bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());
#7
是呀,楼上的兄弟说的对,创建兼容DC你总得告诉人家操作系统要建立一个跟谁兼容的DC吧!呵呵。
#8
CreateCompatibleDC
The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.
HDC CreateCompatibleDC(
HDC hdc // handle to DC
);
Parameters
hdc
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。
The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.
HDC CreateCompatibleDC(
HDC hdc // handle to DC
);
Parameters
hdc
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。
#9
创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
#10
创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
***********************************************
可是编译时没有错误提示啊!
***********************************************
可是编译时没有错误提示啊!
#11
确实是没有编译错误。
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来
#12
帮你UP
#1
CDC* pDC = this->GetDC();
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );
#2
创建的DC不是根据dialog创建的,所以几个DC直接没有任何关系.
因此要先个getdc,然后根据这个dc创建memdc,backDC, BackBuffer, bitBuffer,在函数结束前记得releasedc.
好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建
因此要先个getdc,然后根据这个dc创建memdc,backDC, BackBuffer, bitBuffer,在函数结束前记得releasedc.
好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建
#3
上面的程序到底问题出现在哪里呢?为什么会没有图象显示出来?
#4
--变量定义乱七八糟的。
先检查一下ClientRect是否宽度,高度是0.
GetClientRect(&ClientRect); ??
先检查一下ClientRect是否宽度,高度是0.
GetClientRect(&ClientRect); ??
#5
GetClientRect(ClientRect);这一句没有问题。
#6
MemDC=CreateCompatibleDC(0);
BackDC=CreateCompatibleDC(0);
BackBuffer=CreateCompatibleDC(0);
bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());
用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);
BackDC=CreateCompatibleDC(dc);
BackBuffer=CreateCompatibleDC(dc);
bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());
BackDC=CreateCompatibleDC(0);
BackBuffer=CreateCompatibleDC(0);
bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());
用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);
BackDC=CreateCompatibleDC(dc);
BackBuffer=CreateCompatibleDC(dc);
bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());
#7
是呀,楼上的兄弟说的对,创建兼容DC你总得告诉人家操作系统要建立一个跟谁兼容的DC吧!呵呵。
#8
CreateCompatibleDC
The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.
HDC CreateCompatibleDC(
HDC hdc // handle to DC
);
Parameters
hdc
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。
The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device.
HDC CreateCompatibleDC(
HDC hdc // handle to DC
);
Parameters
hdc
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。
#9
创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
#10
创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
***********************************************
可是编译时没有错误提示啊!
***********************************************
可是编译时没有错误提示啊!
#11
确实是没有编译错误。
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来
#12
帮你UP