帮忙看个VC程序
|
yushangtian
知名人士
|
[1楼]
大 中
小 发表于 2006-6-14 08:17:11 只看该作者
帮忙看个VC程序 #include "GDISurface.h"
#include "GDIGraphicsDevice.h" CGDISurface::CGDISurface() { m_iWidth = 0; m_iHeight = 0; m_hBitmap = NULL; m_hMaskBitmap = NULL; m_hOldBitmap = NULL; m_hOldMaskBitmap = NULL; m_hDC = NULL; m_hMaskDC = NULL; } CGDISurface::~CGDISurface() { } bool CGDISurface::Create( CGDIGraphicsDevice *pDevice, int iWidth, int iHeight ) { // 获得主窗口绘图设备句柄 HWND hWnd = pDevice->GetWnd(); HDC hdcWindow = ::GetDC( hWnd ); // 创建图形设备句柄 m_hDC = ::CreateCompatibleDC( hdcWindow ); m_hMaskDC = ::CreateCompatibleDC( hdcWindow ); // 创建位图和透明位图 m_hBitmap = ::CreateCompatibleBitmap( hdcWindow, iWidth, iHeight ); m_hMaskBitmap = ::CreateBitmap( iWidth, iHeight, 1, 1, NULL ); // 关联设备和位图句柄 m_hOldBitmap = (HBITMAP)::SelectObject( m_hDC, m_hBitmap ); m_hOldMaskBitmap = (HBITMAP)::SelectObject( m_hMaskDC, m_hMaskBitmap ); // 制作透明通道位图 ::SetBkColor( m_hDC, RGB(0,0,255) ); ::BitBlt( m_hMaskDC, 0, 0, iWidth, iHeight, m_hDC, 0, 0, SRCCOPY ); ::SetBkColor( m_hDC, RGB(0,0,0) ); ::SetTextColor( m_hDC, RGB(255,255,255) ); ::BitBlt( m_hDC, 0, 0, iWidth, iHeight, m_hMaskDC, 0, 0, SRCAND ); // 释放主窗口绘图句柄 ::ReleaseDC( hWnd, hdcWindow ); // 保存表面大小 m_iWidth = iWidth; m_iHeight = iHeight; return true; } //实现从文件读取位图, 方法和创建位图类似,只是原位图从文件用LoadImage读入。 // 从文件读取一个位图 bool CGDISurface::LoadBmp( CGDIGraphicsDevice *pDevice, const char *szFileName ) { FILE *fp =fopen( szFileName, "rb" );// 读取位图文件信息,确定位图大小 if( NULL == fp ) { OutputDebugString( FSTR( "Open bmp file [%s] failed(%s:%d)", szFileName, __FILE__, __LINE__ ) ); return false; } BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; fread( &bmfh, sizeof(BITMAPFILEHEADER), 1, fp ); fread( &bmih, sizeof(BITMAPINFOHEADER), 1, fp ); fclose(fp); // 如果不是位图则返回失败 if( bmfh.bfType != 0x4D42 ) { OutputDebugString( FSTR( "the bmp file [%s] type is failed(%s:%d)", szFileName, __FILE__, __LINE__ ) ); return false; } HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, szFileName, IMAGE_BITMAP, bmih.biWidth, bmih.biHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION ); m_iWidth = bmih.biWidth; m_iHeight = bmih.biHeight; HWND hWnd = pDevice->GetWnd(); HDC hdcWindow = ::GetDC( hWnd ); m_hBitmap = ::CreateCompatibleBitmap( hdcWindow, m_iWidth, m_iHeight ); m_hMaskBitmap = ::CreateBitmap( m_iWidth, m_iHeight, 1, 1, NULL ); HDC hTempDC = ::CreateCompatibleDC( hdcWindow ); m_hDC = ::CreateCompatibleDC( hdcWindow ); m_hMaskDC = ::CreateCompatibleDC( hdcWindow ); HBITMAP hOldBitmap = (HBITMAP)::SelectObject( hTempDC, hBmp ); m_hOldBitmap = (HBITMAP)::SelectObject( m_hDC, m_hBitmap ); m_hOldMaskBitmap = (HBITMAP)::SelectObject( m_hMaskDC, m_hMaskBitmap ); ::BitBlt( m_hDC, 0, 0, m_iWidth, m_iHeight, hTempDC, 0, 0, SRCCOPY ); ::SetBkColor( m_hDC, RGB(0,0,255) ); ::BitBlt( m_hMaskDC, 0, 0, m_iWidth, m_iHeight, m_hDC, 0, 0, SRCCOPY ); ::SetBkColor( m_hDC, RGB(0,0,0) ); ::SetTextColor( m_hDC, RGB(255,255,255) ); ::BitBlt( m_hDC, 0, 0, m_iWidth, m_iHeight, m_hMaskDC, 0, 0, SRCAND ); ::SelectObject( hTempDC, hOldBitmap ); DeleteDC( hTempDC ); DeleteObject( hBmp ); ::ReleaseDC( hWnd, hdcWindow ); return true; } //实现释放位图 // 释放位图 void CGDISurface::Release() { ::SelectObject( m_hDC, m_hOldBitmap ); ::SelectObject( m_hMaskDC, m_hOldMaskBitmap ); ::DeleteDC( m_hMaskDC ); ::DeleteDC( m_hDC ); ::DeleteObject( m_hBitmap ); ::DeleteObject( m_hMaskBitmap ); } //实现4个基本绘图操作 // 清除表面为 某种颜色 void CGDISurface::Clear( COLORREF c ) { // 创建填充画笔 HBRUSH hBrush = CreateSolidBrush( c ); // 填充整个表面 RECT rect = { 0, 0, m_iWidth, m_iHeight }; FillRect( m_hDC, &rect, hBrush ); // 释放画笔 DeleteObject( hBrush ); } // 画店 void CGDISurface::SetPixel( int x, int y, COLORREF c ) { ::SetPixel( m_hDC, x, y, c ); } // 画线 void CGDISurface::Line( int x1, int y1, int x2, int y2, COLORREF c ) { HPEN hPen = CreatePen(PS_SOLID, 1, c ); HPEN hOldPen = (HPEN)SelectObject( m_hDC, hPen ); MoveToEx( m_hDC, x1, y1, (LPPOINT) NULL ); LineTo( m_hDC, x2, y2 ); SelectObject( m_hDC, hOldPen ); DeleteObject( hPen ); } // 画矩形 void CGDISurface::Rect( int x1, int y1, int x2, int y2, COLORREF c ) { // 画4条线 矩形边框 Line( x1, y1, x2, y1, c ); Line( x1, y2, x2, y2, c ); Line( x1, y1, x1, y2, c ); Line( x2, y1, x2, y2, c ); } //实现位图传送功能 // 位图传送 void CGDISurface::Blt( CGDISurface *pSurface, int x, int y, int rx, int ry, int w, int h, SurfaceBltMode iMode ) { HDC hdcDst = pSurface->GetDC(); switch( iMode ) { case BLT_BLOCK: // 基本复制方式传送位图 BitBlt( hdcDst, x, y, w, h, m_hDC, rx, ry, SRCCOPY ); break; case BLT_ALPHATEST: // 带透明色方式传送位图 SetBkColor( hdcDst, RGB(255,255,255) ); SetTextColor( hdcDst, RGB(0,0,0) ); BitBlt( hdcDst, x, y, w, h, m_hMaskDC, rx, ry, SRCAND ); BitBlt( hdcDst, x, y, w, h, m_hDC, rx, ry, SRCPAINT ); break; case BLT_ALPHABLEND: break; } } 在头文件中已经包含了对WINDOWS。H的引用。 这个程序在连接的时候出现7个错误,全部是关于文件操作的错误。例如 FILE ,fopen,fclose等。系统说没有对这些常量和函数进行定义。 大家帮忙看看,谢谢。 |
|
TOP |







