⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdc.cpp

📁 基于Windml2.0的窗口系统原代码 , 以及和MFC CDC兼容的CDC
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "cdc.h"
#include "cbitmap.h"
#include "cbrush.h"
#include "cfont.h"
#include "cpen.h"
#include "stdio.h"
#include "CWMLHelp.h"

//##ModelId=40500037005A
CDC::CDC()
{
	CWMLHelp::RegisterClass("CDC" , (int)this);
	
	uglDriverFind (UGL_FONT_ENGINE_TYPE, 0, (UGL_UINT32 *)&m_uglFontDrvId);
	
	uglDriverFind (UGL_DISPLAY_TYPE, 0, (UGL_UINT32 *)&m_uglDevId);
	
	m_uglGcId = uglGcCreate(m_uglDevId);
	
	InitGC(m_uglGcId);	
	
	m_nBkMode = TRANSPARENT;
	
	m_nCurPosition = CPoint(0 , 0);	
}

CDC::CDC(UGL_GC_ID gc)
{
	CWMLHelp::RegisterClass("CDC" , (int)this);
	
	m_uglGcId = gc;
	
	uglDriverFind (UGL_FONT_ENGINE_TYPE, 0, (UGL_UINT32 *)&m_uglFontDrvId);
	
	uglDriverFind (UGL_DISPLAY_TYPE, 0, (UGL_UINT32 *)&m_uglDevId);
		
	InitGC(m_uglGcId);
		
	m_nBkMode = TRANSPARENT;
	
	m_nCurPosition = CPoint(0 , 0);
}

//##ModelId=405000370063
CDC::~CDC()
{	
	CWMLHelp::UnRegisterClass("CDC" , (int)this);
	DeleteObject();
}

void CDC::InitGC(UGL_GC_ID uglGcId)
{
/*	//设置前景色和背景色
	UGL_COLOR backgroundColor = IND_WHITE;
	UGL_COLOR foregroundColor = IND_BLACK;
*/	
	UGL_COLOR backgroundColor , foregroundColor;
	uglForegroundColorGet(m_uglGcId, &foregroundColor);
    uglBackgroundColorGet(m_uglGcId, &backgroundColor);

	//初始化对应的CBitmap , CPen, CBrush , CFont	
	//初始化CBitmap
	m_pBitmap = UGL_NULL;	
    
	//初始化CPen
	UGL_LINE_STYLE lineStyle;
	UGL_SIZE lineWidth;
	uglLineStyleGet(m_uglGcId , &lineStyle);
	uglLineWidthGet(m_uglGcId , &lineWidth);
	m_pCurPen = new CPen(lineStyle , lineWidth , foregroundColor);	
	
	//初始化CBrush
	m_pCurBrush = new CBrush(backgroundColor);
	
	
	//初始化CFont
	m_pCurFont = new CFont;
	UGL_FONT_ID fontId;
	UGL_FONT_DEF fontDef;	
	
//	uglFontFindString(m_uglFontDrvId, "Times Bold 10", &fontDef);
//	uglFontFindString(m_uglFontDrvId, "familyName=Song_Pitch_12", &fontDef);
	uglFontFindString(m_uglFontDrvId, "familyName=Song; pixelSize=16", &fontDef);
    
    if ((fontId = uglFontCreate(m_uglFontDrvId, &fontDef)) == UGL_NULL){
        printf("Font not found. Exiting.\n");
        uglFontGet (m_uglGcId, &fontId);
		m_pCurFont->SetFontId(fontId);
    }else{
    	uglFontSet(m_uglGcId , fontId);    		
		m_pCurFont->SetFontId(fontId);		        
    }               
}

UGL_GC_ID CDC::GetGcID()
{
	return m_uglGcId;
}


bool CDC::SetViewPort(int left , int top , int right , int  bottom)
{
	if(uglViewPortSet(m_uglGcId , left , top , right , bottom) != UGL_STATUS_OK)
		return false;
	
	return true;
}
bool CDC::GetViewPort(int *left , int *top , int *right , int *bottom)
{
	if(uglViewPortGet(m_uglGcId , left , top , right , bottom) != UGL_STATUS_OK) 
		return false;
		
	return true;
}
	
			

void CDC::BeginDraw()
{
	uglBatchStart(m_uglGcId);
}
void CDC::EndDraw()
{
	uglBatchEnd(m_uglGcId);
}



//##ModelId=405000370065
bool CDC::CreateCompatibleDC(CDC* pDC)
{				
	//初始化所有的属性
		//初始化对应的CBitmap , CPen, CBrush , CFont	
	//初始化CBitmap
	m_pBitmap = UGL_NULL;
	
	//初始化CPen

	UGL_LINE_STYLE lineStyle;
	UGL_SIZE lineWidth;
	UGL_COLOR foreColor;
	uglLineStyleGet(pDC->m_uglGcId , &lineStyle);
	uglLineWidthGet(pDC->m_uglGcId , &lineWidth);
	uglForegroundColorGet(pDC->m_uglGcId , &foreColor);


	
	m_pCurPen->m_nPenStyle = lineStyle;
	m_pCurPen->m_nWidth = lineWidth;
	m_pCurPen->m_crColor = foreColor;

	uglLineStyleSet(m_uglGcId , lineStyle);
	uglLineWidthSet(m_uglGcId , lineWidth);
	uglForegroundColorSet(m_uglGcId , foreColor);
	
	//初始化CBrush
	UGL_COLOR backColor;
	uglBackgroundColorGet(pDC->m_uglGcId , &backColor);
	m_pCurBrush->m_BackgroundColor = backColor;
	uglBackgroundColorSet(m_uglGcId , backColor);
	
/*	//初始化CFont
	UGL_FONT_ID fontId;
	UGL_FONT_DEF fontDef;	
	uglFontFindString(m_uglFontDrvId, "familyName=Song; pixelSize=16", &fontDef);
   
    if ((fontId = uglFontCreate(pDC->m_uglFontDrvId, &fontDef)) == UGL_NULL){
        printf("Font not found. Exiting.\n");
        return false;        
    }
    
    uglFontSet(m_uglGcId , fontId);
    	
	m_pCurFont = new CFont;
	m_pCurFont->SetFontId(fontId);
*/
	return true;
		
}

//##ModelId=405000370067
CSize CDC::GetTextExtent(LPCTSTR lpszString, int nCount)
{
	
	CSize size;
	
	int length = (nCount > strlen(lpszString)) ? strlen(lpszString) : nCount;
		

	if(uglTextSizeGet(m_pCurFont->m_uglFontId , &size.cx , &size.cy , length , lpszString) != UGL_STATUS_OK)
		return CSize(0,0);
	
	return size;
	
}

//##ModelId=40500037006A
CSize CDC::GetTextExtent(CString& str, int nCount)
{
	CSize size;
	
	int length = (nCount > str.GetLength()) ?  str.GetLength() : nCount;


	if(uglTextSizeGet(m_pCurFont->m_uglFontId , &size.cx  , &size.cy , length , str.GetBuffer(str.GetLength())) != UGL_STATUS_OK)
		return CSize(0,0);

	return size;
}

//##ModelId=40500037006F
CSize CDC::GetTextExtent(const CString& str)
{
	CSize size;
																  
	if(uglTextSizeGet(m_pCurFont->m_uglFontId , &size.cx  , &size.cy , -1 , ((CString)str).GetBuffer(str.GetLength())) != UGL_STATUS_OK)
		return CSize(0,0);
	
	return size;
}

//##ModelId=405000370071
CSize CDC::GetTextExtent(const char* pStr)
{
	CSize size;


	if(uglTextSizeGet(m_pCurFont->m_uglFontId , &size.cx  , &size.cy , -1 , pStr) != UGL_STATUS_OK)
		return CSize(0,0);
	
	
	return size;
}

CFont* CDC::SelectObject(CFont* pFont)
{	
	if(pFont == UGL_NULL)
		return UGL_NULL;

	                
	uglFontSet(m_uglGcId , pFont->m_uglFontId);	
	pFont->m_uglFontId = UGL_NULL;

	//保存原来的画笔
	CFont* preFont = m_pCurFont;
	
	//替换当前的画笔
	m_pCurFont = pFont;
	
	return preFont;

}

//##ModelId=405000370077
CPen* CDC::SelectObject(CPen* pPen)
{	
	
	 if(pPen == UGL_NULL)
        return UGL_NULL;
        
	                
	if(m_uglGcId == UGL_NULL)
		return UGL_NULL;	

	//设置windml内部
	uglForegroundColorSet(m_uglGcId , pPen->m_crColor);	
	uglLineStyleSet(m_uglGcId , pPen->m_nPenStyle);	
	uglLineWidthSet(m_uglGcId , pPen->m_nWidth);


	//保存原来的画笔
	CPen* prepen = m_pCurPen;
	
	//替换当前的画笔
	m_pCurPen = pPen;
	
	return prepen;	
}

//##ModelId=405000370079
CBrush* CDC::SelectObject(CBrush* pBrush)
{
	if(pBrush == UGL_NULL)
        return UGL_NULL;              
	
	//设置windml内部	
	if(pBrush->m_pBitmap == UGL_NULL)
		uglBackgroundColorSet(m_uglGcId , pBrush->m_BackgroundColor);
	else
		uglFillPatternSet(m_uglGcId , pBrush->m_pBitmap->m_uglDDB_ID);

    //保存原来的画刷
	CBrush* prebrush = m_pCurBrush;
	
	//替换当前的画刷
	m_pCurBrush = pBrush;
	
	return prebrush;	
}

//##ModelId=40500037007B
int CDC::SelectObject(CRgn* pRgn)
{
	UGL_REGION_ID curClipRegionId;

	uglClipRegionGet(m_uglGcId , &curClipRegionId);	
	
	if(curClipRegionId == NULL)
	{
		curClipRegionId = uglRegionCreate();
		if(curClipRegionId == NULL){
			CWMLHelp::MessageBox("clip region created false");
			assert(false);
		}
		
		uglClipRegionSet(m_uglGcId , curClipRegionId);		
	}
	
	if(pRgn == NULL){
		uglRegionEmpty(curClipRegionId);
		return 0;
	}
				
	assert(pRgn->m_uglRegionId);	               	
	uglRegionCopy(pRgn->m_uglRegionId , curClipRegionId);	
	return 0;
}


//##ModelId=40500037007D
CBitmap* CDC::SelectObject(CBitmap* pBitmap)
{
	if(pBitmap == UGL_NULL)
		uglDefaultBitmapSet(m_uglGcId , UGL_NULL);	
	else
		uglDefaultBitmapSet(m_uglGcId , pBitmap->m_uglDDB_ID);	


    //保存原来的裁减区
	CBitmap* prebitmap = m_pBitmap;
	
	//替换当前的画刷
	m_pBitmap = pBitmap;
	
	return prebitmap;
}



//##ModelId=405000370082
/*
CGdiObject* CDC::SelectStockObject(int nIndex)
{
}
*/

//##ModelId=405000370084
int CDC::GetClipBox(RECT *lpRect) const
{
		
	uglClipRectGet(m_uglGcId , (int *)&lpRect->left,
		(int *)&lpRect->top,(int *)&lpRect->right,(int *)&lpRect->bottom);


	return 0;
	
}

//##ModelId=40500037008B
int CDC::GetClipBox(CRect *lpRect) const
{
	
	uglClipRectGet(m_uglGcId , &lpRect->left,&lpRect->top,&lpRect->right,&lpRect->bottom);

	
	return 0;
}

//##ModelId=40500037008E
int CDC::SetROP2(int nDrawMode)
{
	int preDrawMode;	
	
	uglRasterModeGet(m_uglGcId , (UGL_RASTER_OP *)&preDrawMode);
		
	uglRasterModeSet(m_uglGcId , (UGL_RASTER_OP)nDrawMode);	
	
	return preDrawMode;
}

//##ModelId=405000370090
int CDC::GetROP2()
{
	int nDrawMode;

	
	uglRasterModeGet(m_uglGcId , (UGL_RASTER_OP *)&nDrawMode);

	
	return nDrawMode;
}

//##ModelId=405000370091
bool CDC::BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, unsigned int dwRop)
{
	if(pSrcDC->m_pBitmap == UGL_NULL)
		return false;
	if(pSrcDC->m_pBitmap->m_uglDDB_ID == UGL_NULL)
		return false;
	
	int preDrawMode = SetROP2(dwRop);

	uglBitmapBlt(m_uglGcId , pSrcDC->m_pBitmap->m_uglDDB_ID , xSrc , ySrc , nWidth + xSrc ,
				 nHeight + ySrc , UGL_DEFAULT_ID , x , y);
	
	SetROP2(preDrawMode);
			
	return true;
}

bool CDC::StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, unsigned int dwRop)
{
	if(pSrcDC->m_pBitmap == UGL_NULL)
		return false;
	if(pSrcDC->m_pBitmap->m_uglDDB_ID == UGL_NULL)
		return false;
	
	int preDrawMode = SetROP2(dwRop);


	uglBitmapStretchBlt(m_uglGcId , pSrcDC->m_pBitmap->m_uglDDB_ID , xSrc , ySrc , nWidth + xSrc ,
				 nHeight + ySrc , UGL_DEFAULT_ID , x , y , x + nWidth , y + nHeight);

	
	SetROP2(preDrawMode);
			
	return true;
}


//##ModelId=4050003700A0
bool CDC::Polygon(POINT *lpPoints, int nCount)
{
	UGL_POS posList[(nCount + 1) * 2];
	int i;
	for(i = 0 ; i < nCount ; i ++ )
	{
		//由于windml对于带有负数的多边形绘制会有问题
		posList[i*2] = (lpPoints[i].x >= 0) ? lpPoints[i].x:0;
		posList[i*2 + 1] = (lpPoints[i].y >= 0) ? lpPoints[i].y:0;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -