📄 新建 文本文档.txt
字号:
STDMETHOD(LoadFromConfigFile)(/*[in]*/ULONG config_struct_ptr);
STDMETHOD(ReleaseOffScreenPlain)(/*[in]*/ULONG plain_ptr);
STDMETHOD(UnloadBitmapFile)(/*[in]*/ULONG bitmap_file_ptr);
STDMETHOD(CreateOffScreenPlain)(/*[in]*/ULONG plain_ptr,/*[in]*/int nWidth,/*[in]*/int nHeight,/*[in]*/ULONG dwFlags);
STDMETHOD(ShowUnit)(/*[in]*/ULONG plain_ptr,/*[in]*/int x_pos,/*[in]*/int y_pos);
STDMETHOD(CopyBitmapToPlain08)(/*[in]*/ULONG bitmap_file_ptr,/*[in]*/ULONG plain_ptr);
STDMETHOD(LoadBitmapFile)(/*[in]*/ULONG bitmap_file_ptr,/*[in]*/ULONG bitmap_file_name);
STDMETHOD(Wait_Clock)(/*[in]*/double count);
STDMETHOD(Start_Clock)();
STDMETHOD(Flip)();
STDMETHOD(DrawRandPixel_08)(/*[in]*/int nCount);
STDMETHOD(UpdatePalette)(/*[in]*/ULONG lp_palette_entry);
STDMETHOD(SetClipper)(/*[in]*/int nNum,/*[in]*/ULONG lp_rect);
STDMETHOD(UnInit)();
STDMETHOD(Init)(/*[in]*/ULONG hWnd,/*[in]*/int nWidth,/*[in]*/int nHeight,/*[in]*/int nBit);
/*---------------------------------------------------------------------------------
功能:初始化DirectDraw
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Init(ULONG hWnd, int nWidth, int nHeight, int nBit)
{
m_h_wnd = (HWND)hWnd;
m_n_bit = nBit;
m_n_width = nWidth;
m_n_height = nHeight;
/////////////////////////////////////////////////////////
HRESULT result;
DDSCAPS2 caps;
DDSURFACEDESC2 desc;
result = DirectDrawCreateEx( NULL, (void**)&m_dd, IID_IDirectDraw7, NULL );
if( result != DD_OK )
{
m_log.SaveMessage("创建DirectDraw对象失败!");
return 1;
}
result = m_dd->SetCooperativeLevel(m_h_wnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT | DDSCL_ALLOWMODEX );
if( result != DD_OK )
{
m_log.SaveMessage( "设置协调层级失败!" );
return 2;
}
result = m_dd->SetDisplayMode( m_n_width, m_n_height, m_n_bit, 0, 0 );
if( result != DD_OK )
{
m_log.SaveMessage( "设置显示模式失败!" );
return 3;
}
//创建主页面
INIT_STRUCT( desc );
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
desc.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
result = m_dd->CreateSurface( &desc, &m_prim_surface, NULL );
if( result != DD_OK )
{
m_log.SaveMessage( "创建主页面失败!" );
return 4;
}
//副缓冲区
memset( &caps, 0, sizeof( caps ) );
caps.dwCaps = DDSCAPS_BACKBUFFER;
result = m_prim_surface->GetAttachedSurface( &caps, &m_back_surface );
if( result != DD_OK )
{
m_log.SaveMessage( "创建次页面失败!" );
return 5;
}
//如果是8bit,就要创建调色板
if( m_n_bit == 8 )
{
if(CreatePalatte() != 0)
{
m_log.SaveMessage( "创建调色板失败!" );
return 6;
}
}
//设置剪切区
RECT rect[] = {0, 0, m_n_width, m_n_height };
if( SetClipper( m_back_surface, 1, rect ) != 0 )
{
m_log.SaveMessage("设置剪切区失败!");
return 7;
}
m_log.SaveMessage( "DirectDraw组件初始化成功!" );
return 0;
}
/*---------------------------------------------------------------------------------
功能:清除DirectDraw资源
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UnInit()
{
SAFE_RELEASE( m_clipper );
SAFE_RELEASE( m_palette );
SAFE_RELEASE( m_back_surface );
SAFE_RELEASE( m_prim_surface );
SAFE_RELEASE( m_dd );
return 0;
}
/*---------------------------------------------------------------------------------
功能:剪切页面
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::SetClipper(int nNum, ULONG lp_rect)
{
int nRet;
nRet = SetClipper( m_back_surface, nNum, (LPRECT)lp_rect );
return nRet;
}
/*---------------------------------------------------------------------------------
功能:更新调色板
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UpdatePalette(ULONG lp_palette_entry)
{
int nRet;
nRet = UpdatePalette( (PALETTEENTRY*)lp_palette_entry );
return nRet;
}
/*---------------------------------------------------------------------------------
功能:直接在副页面上画随机的点-------8位
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::DrawRandPixel_08(int nCount)
{
int x,y;
int mempitch = 0;
unsigned char* lp_buf = NULL;
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;
BITMAP_FILE_PTR lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;
if( szFileName == NULL )
{
return 1;
}
if( lp_bitmap == NULL )
{
return 2;
}
//////////////////////////////////////////////////////////////////////////
FILE* fp = fopen( szFileName, "rb" );
if( fp == NULL )
{
return 3;
}
rewind( fp );
//初始化位图文件结构
memset( lp_bitmap, 0, sizeof( BITMAP_FILE ) );
//读入文件头
fread( &lp_bitmap->m_file_head, sizeof( CHAR ), sizeof( BITMAPFILEHEADER ), fp );
if( lp_bitmap->m_file_head.bfType != BITMAP_ID )
{
fclose( fp );
return 4;
}
//读入位图信息
fread( &lp_bitmap->m_info_head, sizeof( CHAR ), sizeof( BITMAPINFOHEADER ), fp );
if( lp_bitmap->m_info_head.biBitCount == 8 )
{
fread( &lp_bitmap->m_palette, sizeof( CHAR ), sizeof( PALETTEENTRY ) * MAX_PALETTE_COLORS, fp );
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 )
{
fclose( fp );
return 5;
}
fread( lp_bitmap->m_mem_buf, sizeof( char ), lp_bitmap->m_info_head.biSizeImage, fp );
}
fclose( fp );
//将位图反转过来
nRet = Flip_Bitmap( lp_bitmap );
if( nRet != 0 )
{
return 6;
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -