void CTetris::KeyDown( WPARAM &wParam )
{
switch( wParam )
{
case 0x25:
Move( LEFT );
break;
case 0x26:
if( ThisID != 3 )
{
TurnTo( m_now );
}
break;
case 0x27:
Move( RIGHT );
break;
case 0x28:
Move( DOWN );
break;
case 0x20:
Move( FALL );
break;
} InvalidateRect( m_hWnd , &ClientRect, true );
}
void CTetris::DrawBKG( HDC &hdc )
{
SetBkMode(hdc, TRANSPARENT); HDC hdcmem = CreateCompatibleDC( hdc );
SelectObject( hdcmem, BackgroundBmp );
BitBlt( hdc, ClientRect.left, ClientRect.top, ClientRect.right, ClientRect.bottom, hdcmem, 0, 0 , SRCCOPY ); HPEN hPen = CreatePen( PS_SOLID, 10, RGB( 255, 255, 0 ) );
SelectObject( hdc, hPen ); Rectangle( hdc, HostFrame.left - 5, HostFrame.top - 5, HostFrame.right + 26, HostFrame.bottom + 26 );
Rectangle (hdc, SeverFrame.left - 5 , SeverFrame.top - 5 , SeverFrame.right + 17 * m_size + 26 , SeverFrame.bottom + 26 );
//Rectangle( hdc, NextShapePos.x * m_size, NextShapePos.y * m_size, ( NextShapePos.x + 4 ) * m_size, ( NextShapePos.y + 4 ) * m_size ); SelectObject( hdcmem, FrameBmp );
BitBlt( hdc, HostFrame.left, HostFrame.top, HostFrame.right, HostFrame.bottom, hdcmem, 0, 0, SRCCOPY );
BitBlt( hdc, SeverFrame.left, SeverFrame.top, SeverFrame.right, SeverFrame.bottom, hdcmem, 0, 0, SRCCOPY );
LPWSTR LineStr, ScoreStr, SpeedStr, TimeStr; LineStr = new WCHAR [30];
ScoreStr = new WCHAR [30];
SpeedStr = new WCHAR [30];
TimeStr = new WCHAR [30]; swprintf( LineStr, L" 行数: %d", Line );
swprintf( ScoreStr,L" 得分: %d", Score );
swprintf( SpeedStr,L" 速度: %d", Speed );
swprintf( TimeStr, L" 游戏进行时间: %d", Time );
TextOutW( hdc, HostFrame.right + 2 * m_size, 15 * m_size, LineStr, wcslen( LineStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 16 * m_size, ScoreStr, wcslen( ScoreStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 17 * m_size, SpeedStr, wcslen( SpeedStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 19 * m_size, TimeStr, wcslen( TimeStr ) ); DeleteDC( hdcmem );}void CTetris::DrawBuffer( HDC hdc )
{
HDC hdcBuf = CreateCompatibleDC( hdc ); HBITMAP hBMp = CreateCompatibleBitmap( hdc, ClientRect.right, ClientRect.bottom ); oldhBMp = ( HBITMAP ) SelectObject( hdcBuf, hBMp );
DrawBKG( hdcBuf );
DrawSquares( hdcBuf ); BitBlt( hdc, 0, 0, ClientRect.right, ClientRect.bottom, hdcBuf, 0, 0 ,SRCCOPY ); SelectObject( hdcBuf, oldhBMp );
DeleteObject( hBMp );
DeleteDC( hdcBuf );
}
有时会出现小小的闪烁,但在我一直按住一个移动键的时候屏幕就会严重的闪烁。刷新太频繁了? 如何改?
{
switch( wParam )
{
case 0x25:
Move( LEFT );
break;
case 0x26:
if( ThisID != 3 )
{
TurnTo( m_now );
}
break;
case 0x27:
Move( RIGHT );
break;
case 0x28:
Move( DOWN );
break;
case 0x20:
Move( FALL );
break;
} InvalidateRect( m_hWnd , &ClientRect, true );
}
void CTetris::DrawBKG( HDC &hdc )
{
SetBkMode(hdc, TRANSPARENT); HDC hdcmem = CreateCompatibleDC( hdc );
SelectObject( hdcmem, BackgroundBmp );
BitBlt( hdc, ClientRect.left, ClientRect.top, ClientRect.right, ClientRect.bottom, hdcmem, 0, 0 , SRCCOPY ); HPEN hPen = CreatePen( PS_SOLID, 10, RGB( 255, 255, 0 ) );
SelectObject( hdc, hPen ); Rectangle( hdc, HostFrame.left - 5, HostFrame.top - 5, HostFrame.right + 26, HostFrame.bottom + 26 );
Rectangle (hdc, SeverFrame.left - 5 , SeverFrame.top - 5 , SeverFrame.right + 17 * m_size + 26 , SeverFrame.bottom + 26 );
//Rectangle( hdc, NextShapePos.x * m_size, NextShapePos.y * m_size, ( NextShapePos.x + 4 ) * m_size, ( NextShapePos.y + 4 ) * m_size ); SelectObject( hdcmem, FrameBmp );
BitBlt( hdc, HostFrame.left, HostFrame.top, HostFrame.right, HostFrame.bottom, hdcmem, 0, 0, SRCCOPY );
BitBlt( hdc, SeverFrame.left, SeverFrame.top, SeverFrame.right, SeverFrame.bottom, hdcmem, 0, 0, SRCCOPY );
LPWSTR LineStr, ScoreStr, SpeedStr, TimeStr; LineStr = new WCHAR [30];
ScoreStr = new WCHAR [30];
SpeedStr = new WCHAR [30];
TimeStr = new WCHAR [30]; swprintf( LineStr, L" 行数: %d", Line );
swprintf( ScoreStr,L" 得分: %d", Score );
swprintf( SpeedStr,L" 速度: %d", Speed );
swprintf( TimeStr, L" 游戏进行时间: %d", Time );
TextOutW( hdc, HostFrame.right + 2 * m_size, 15 * m_size, LineStr, wcslen( LineStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 16 * m_size, ScoreStr, wcslen( ScoreStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 17 * m_size, SpeedStr, wcslen( SpeedStr ) );
TextOutW( hdc, HostFrame.right + 2 * m_size, 19 * m_size, TimeStr, wcslen( TimeStr ) ); DeleteDC( hdcmem );}void CTetris::DrawBuffer( HDC hdc )
{
HDC hdcBuf = CreateCompatibleDC( hdc ); HBITMAP hBMp = CreateCompatibleBitmap( hdc, ClientRect.right, ClientRect.bottom ); oldhBMp = ( HBITMAP ) SelectObject( hdcBuf, hBMp );
DrawBKG( hdcBuf );
DrawSquares( hdcBuf ); BitBlt( hdc, 0, 0, ClientRect.right, ClientRect.bottom, hdcBuf, 0, 0 ,SRCCOPY ); SelectObject( hdcBuf, oldhBMp );
DeleteObject( hBMp );
DeleteDC( hdcBuf );
}
有时会出现小小的闪烁,但在我一直按住一个移动键的时候屏幕就会严重的闪烁。刷新太频繁了? 如何改?
解决方案 »
- windows程序色设计书本说的分辨率和我们生活中的分辨率不是一回事
- tomcat下,控件不能正常显示??
- 二维傅里叶变换
- activeX动态调用其他的DLL问题?
- 利用SetWindowLong改变窗口函数,导致堆栈错误
- 关于ShellExecute()函数,它能不能直接打开网络机器上的文件呢?
- 高分100 求助scrollview模拟打印预览窗口的问题!!!!!!!
- 串口读数据出现乱码,怎么解决?急!!!!
- 急急急!!!难道csdn没有人了,问了一个上午也没有人答复!!!
- vc6 简单模拟多用户相互聊天功能
- 求网络通信思路!想在单机版射击游戏加入局域网多人比赛,还有外网上多人比赛功能!
- EnsureParentFrame()函数的用法?
不要在hdc上面画 不然叫什么双缓冲
谢谢提醒,开始窗口擦除了,所以要重新画,改成InvalidateRect( m_hWnd , &ClientRect, false );就行了..呵呵
{
DrawBuffer(pDC->m_hDC);
return TRUE;
}