📄 cdc.cpp
字号:
#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 + -