📄 freedirectdraw.cpp
字号:
HRESULT hr;
int count = nCount;
DDSURFACEDESC2 dd;
INIT_STRUCT( dd );
hr = m_back_surface->Lock(NULL,&dd,DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
if(hr != DD_OK)
{
m_log.SaveMessage("锁定表面失败!");
return 1;
}
mempitch = dd.lPitch;
lp_buf = (unsigned char*)dd.lpSurface;
int nBitSize = dd.lPitch * m_n_height;
//清除后缓冲区中的数据
__asm
{
CLD ; clear direction of copy to forward
MOV EAX, 0 ; color goes here
MOV ECX, nBitSize ; number of DWORDS goes here
MOV EDI, lp_buf ; address of line to move data
REP STOSB ; send the pentium X on its way
}
srand( GetTickCount() );
for(int i = 0; i < count; i++ )
{
UCHAR color = rand() % MAX_PALETTE_COLORS;
x = rand() % m_n_width;
y = rand() % m_n_height;
lp_buf[ x + y * mempitch ] = color;
}
hr = m_back_surface->Unlock(NULL);
if(hr != DD_OK)
{
m_log.SaveMessage("解锁定表面失败!");
return 2;
}
*/
return 0;
}
/*---------------------------------------------------------------------------------
功能:切换副页面为主页面
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Flip()
{
while( m_prim_surface->Flip( NULL, DDFLIP_WAIT ) != DD_OK );
return 0;
}
/*---------------------------------------------------------------------------------
功能:开始等待
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Start_Clock()
{
m_clock_count = GetTickCount();
return 0;
}
/*---------------------------------------------------------------------------------
功能:等待
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Wait_Clock(double count)
{
m_clock_count += count;
while( GetTickCount() < m_clock_count );
return 0;
}
/*---------------------------------------------------------------------------------
功能:载入位图
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::LoadBitmapFile(ULONG bitmap_file_ptr, ULONG bitmap_file_name)
{
int nRet;
char* szFileName = (char*)bitmap_file_name;
DWORD read_len;
HANDLE file_handle;
BITMAP_FILE_PTR lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;
if( szFileName == NULL )
{
return 1;
}
if( lp_bitmap == NULL )
{
return 2;
}
//////////////////////////////////////////////////////////////////////////
file_handle = CreateFile( szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( file_handle == INVALID_HANDLE_VALUE )
{
return 3;
}
//初始化位图文件结构
memset( lp_bitmap, 0, sizeof( BITMAP_FILE ) );
//读入文件头
nRet = ReadFromFile( file_handle, (LPVOID)&lp_bitmap->m_file_head, sizeof( BITMAPFILEHEADER ), &read_len );
if( nRet != 0 )
{
return nRet;
}
if( lp_bitmap->m_file_head.bfType != BITMAP_ID )
{
CloseHandle( file_handle );
return 6;
}
//读入位图信息
nRet = ReadFromFile( file_handle, (LPVOID)&lp_bitmap->m_info_head, sizeof( BITMAPINFOHEADER ), &read_len );
if( nRet != 0 )
{
return nRet;
}
if( lp_bitmap->m_info_head.biBitCount == 8 )
{
nRet = ReadFromFile( file_handle, (LPVOID)lp_bitmap->m_palette, sizeof( PALETTEENTRY ) * MAX_PALETTE_COLORS, &read_len );
if( nRet != 0 )
{
return nRet;
}
int temp_color;
for( int i = 0; i < MAX_PALETTE_COLORS; i++ )
{
temp_color = lp_bitmap->m_palette[i].peRed;
lp_bitmap->m_palette[i].peRed = lp_bitmap->m_palette[i].peBlue;
lp_bitmap->m_palette[i].peBlue = temp_color;
lp_bitmap->m_palette[i].peFlags= PC_NOCOLLAPSE;
}
}
//读入位图像素信息
if( lp_bitmap->m_info_head.biBitCount == 8 ||
lp_bitmap->m_info_head.biBitCount == 16 ||
lp_bitmap->m_info_head.biBitCount == 24 ||
lp_bitmap->m_info_head.biBitCount == 32 )
{
lp_bitmap->m_mem_buf = new UCHAR[ lp_bitmap->m_info_head.biSizeImage ];
if( lp_bitmap->m_mem_buf == NULL )
{
CloseHandle( file_handle );
return 7;
}
nRet = ReadFromFile( file_handle, (LPVOID)lp_bitmap->m_mem_buf, lp_bitmap->m_info_head.biSizeImage, &read_len );
if( nRet != 0 )
{
return nRet;
}
}
//将位图反转过来
nRet = Flip_Bitmap( lp_bitmap );
if( nRet != 0 )
{
return 8;
}
return 0;
}
/*---------------------------------------------------------------------------------
功能:拷贝位图信息到屏幕缓冲区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::CopyBitmapToPlain08(ULONG bitmap_file_ptr, ULONG plain_ptr)
{
BITMAP_FILE_PTR lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;
OFFSCREEN_PTR lp_plain = (OFFSCREEN_PTR)plain_ptr;
if( lp_plain == NULL || lp_bitmap == NULL || lp_bitmap->m_mem_buf == NULL )
{
return 1;
}
DDSURFACEDESC2 ddsd;
INIT_STRUCT(ddsd);
int nWidth,nHeight;
int y,nPitch,src_pos,dest_pos;
UCHAR *src_buf, *dest_buf;
//得到位图的宽度和高度
nWidth = lp_bitmap->m_info_head.biWidth * lp_bitmap->m_info_head.biBitCount / 8;
nHeight = lp_bitmap->m_info_head.biHeight;
src_buf = lp_bitmap->m_mem_buf;
if( FAILED( lp_plain->m_off_screen->Lock( NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL ) ) )
{
return 2;
}
nPitch = ddsd.lPitch;
dest_buf= (UCHAR*)ddsd.lpSurface;
if( nPitch == nWidth )
{
memcpy( dest_buf, src_buf, lp_bitmap->m_info_head.biSizeImage );
}
else
{
for( y = 0; y < nHeight; y++ )
{
src_pos = y * nWidth;
dest_pos = y * nPitch;
memcpy( dest_buf + dest_pos, src_buf + src_pos, nPitch );
}
}
lp_plain->m_off_screen->Unlock( NULL );
return 0;
}
/*---------------------------------------------------------------------------------
功能:显示一个图像
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::ShowUnit(ULONG plain_ptr, int x_pos, int y_pos )
{
OFFSCREEN_PTR lp_screen = (OFFSCREEN_PTR)plain_ptr;
RECT rect,dest_rect;
rect.left = 0 ;
rect.top = 0 ;
rect.right = lp_screen->m_n_width;
rect.bottom = lp_screen->m_n_height;
dest_rect = rect;
dest_rect.left += x_pos;
dest_rect.top += y_pos;
dest_rect.right += x_pos;
dest_rect.bottom += y_pos;
if( FAILED( m_back_surface->Blt( &dest_rect, lp_screen->m_off_screen, &rect, DDBLT_WAIT, NULL ) ) )
{
return 1;
}
return 0;
}
/*---------------------------------------------------------------------------------
功能:创建一个离屏区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::CreateOffScreenPlain(ULONG plain_ptr, int nWidth, int nHeight, ULONG dwFlags)
{
OFFSCREEN_PTR lp_screen = (OFFSCREEN_PTR)plain_ptr;
DDSURFACEDESC2 ddsd;
INIT_STRUCT(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | dwFlags;
ddsd.dwWidth = nWidth;
ddsd.dwHeight = nHeight;
if( FAILED( m_dd->CreateSurface(&ddsd, &lp_screen->m_off_screen, NULL ) ) )
{
m_log.SaveMessage("创建离屏区失败!");
return 1;
}
lp_screen->m_n_width = nWidth;
lp_screen->m_n_height = nHeight;
return 0;
}
/*---------------------------------------------------------------------------------
功能:卸载位图
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UnloadBitmapFile(ULONG bitmap_file_ptr)
{
BITMAP_FILE_PTR lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;
if( lp_bitmap == NULL )
{
return 0;
}
if( lp_bitmap->m_mem_buf == NULL )
{
return 0;
}
delete [] lp_bitmap->m_mem_buf;
lp_bitmap->m_mem_buf = NULL;
return 0;
}
/*---------------------------------------------------------------------------------
功能:清除离屏区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::ReleaseOffScreenPlain(ULONG plain_ptr)
{
OFFSCREEN_PTR lp_plain = (OFFSCREEN_PTR)plain_ptr;
SAFE_RELEASE( lp_plain->m_off_screen );
return 0;
}
/*---------------------------------------------------------------------------------
功能:从配置文件载入位图的配置信息
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::LoadFromConfigFile(ULONG config_struct_ptr)
{
CONFIG_PTR lp_config = (CONFIG_PTR)config_struct_ptr;
m_ini.SetIniFileName( lp_config->m_file_name );
m_ini.ReadIniInt( &lp_config->m_n_bit, "DIRECTDRAW", "BITCOUNT" );
m_ini.ReadIniInt( &lp_config->m_n_width, "DIRECTDRAW", "WIDTH" );
m_ini.ReadIniInt( &lp_config->m_n_height, "DIRECTDRAW", "HEIGHT" );
m_ini.ReadIniString( lp_config->m_file_name, 20, "DIRECTDRAW", "FILENAME" );
m_ini.GetFullFileName( lp_config->m_file_name );
m_log.SaveMessage( lp_config->m_file_name );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -