画图的基本知识

Posted on 2008-04-24 16:23  少林  阅读(2105)  评论(0编辑  收藏  举报
1. 几种不同设备环境
MFC的CDC类封装了设备环境对象,CDC的成员变量m_hDC指向它的设备环境,可以创建的设备环境类型有:屏幕,打印机,只有打印机的信息部分,位图。
屏幕:
创建一个屏幕设备环境
CDC *Pdc = GetDC();//返回窗口客户区的设备环境
CDC *Pdc = GetWindowDC();//包括客户区和非客户区的设备环境
如果要对整个屏幕进行绘制;
CDC *Pdc = CDC::FromHandle(::GetDC(NULL));
使用完之后要用ReleaseDC(Pdc)释放
每次释放DC之后,为设备环境设置的值都会丢失,可以使用下面两个函数来保存和恢复设置的环境值.
SaveDC();保存设备的当前状态
RestoreDC();将DC恢复到SaveDC()保存的状态.
打印机设备:
要为打印机创建一个设备环境,必须先创建一个C D C类对象,然后使用它的CreateDC( )
成员函数:
CDC dc;
dc.CreateDC(LPCTSTR lpszDriverName,
LPCTSTR lpszDeviceName,
LPCTSTR lpszOutput,
const void* lpInitData)
lpszDriverName: 指向空终止字符串的指针,字符串为设备驱动程序的文件名(不带扩展名,例如:“EPSON”)。也可以为该参数传递Cstring对象。
LpszDeviceName: 指向空终止字符串的指针,字符串为支持特定设备的文件名(例如:“EPSON FX?0”)。如果模块支持不只一个设备,使用lpszDeviceName参数,也可以为该参数传递 Cstring对象。
LpszOutput: 指向空终止字符串的指针,字符串为指定了物理输出媒介的文件和设备名(文件或输出端口)。也可以为该参数传递 Cstring对象
LpInitData: 指向DEVMODE 结构的指针,该结构包含有指定设备驱动程序的初始数据,Windows 的DocumentProperties函数从该结构中获得指定设备的信息。如果设备驱动程序使用用户在控制面板设定的缺省值,lpInitData参数 一定要设置为NULL。如果使用DEVMODE 结构,就需要PRINT.H 头文件。
直接绘制位图的设备环境:
CDC dc;
dc.CreateCompatibleDC(HDC hdc);//创建兼容的DC

要绘制位图,还必须创建一个空的位图对象:
CDC dc;
dc.CreateCompatibleDC(pDC);
Cbitmap bimmap;
Bitmap.CreateCompatileBitmap(pCD,16,16);
dc.SelectObject(&bitmap);
………..
dc.DeleteDC();
     打印机信息设备:
CDC dc;
dc.CreteIC( );
信息设备环境只包含一台打印机或其他非屏幕设备的特性,如颜色支持等。创建信息设
备环境的速度比创建一个常规的打印机设备环境速度快,因为它只包含设备的特性。信息使用后应当删除,与前面描述的一样。
2.画点;
     SetPixel( ) 试图用指定的颜色画一个像素,返回绘制时使用的实际颜色
SetPixelV( ) 与上面的基本相同,但不用返回绘制时使用的实际颜色,因而速度更快
GetPixel()取得点处的RGB颜色
COLORREF GetPixel(int x,int y) const;
COLORREF GetPixel(POINT point) const;// 如果不能在剪切区指定点的坐标,则返回-1。

COLORREF SetPixel(int x ,int y,COLORREF crColor);
COLORREF SetPixel(POINT point,COLORREF crColor);// 点必须在剪切区内,否则函数什么也不做。

BOOL SetPixelV (int x ,int y ,COLORREF crColor );
BOOL SetPixelV (POINT point,COLORREF crColor );// 。该点必须在剪切区内设备表面的可视区域之中

在OnDraw(CDC *pDC)中
COLORREF clcolor ;
clcolor   =   Pdc->GetPixel(20,20);
pDC->SetPixel(40,40,clcolor);

3.画线:
     MoveTo( ) 开始画线、弧和多边形时,把光标移动到一个初始位置
LineTo( ) 画一条从初始位置到另一个点的直线
Arc( ) 画一段弧
ArcTo( ) 画一段弧,并更新初始位置
AngleArc( ) 画一条线,然后画一段弧,并更新初始位置
PolyDraw( ) 画一系列线段和Bezier样条
PolyLine( ) 画一系列线段
PolyPolyLine( ) 画多个系列线条
     画线属性是通过画笔的属性来控制, HPEN句柄指向一个Pen对象。在M F C中创建一个P e n对象,必须先创建一个CPen类对象

    
绘制实例;

CPen *oldpen,pen1,pen2,pen3;

     pen1.CreatePen(PS_SOLID,2,RGB(255,0,0));//画笔1

     LOGPEN logpen;
     logpen.lopnStyle = PS_DASH;
     logpen.lopnWidth.x   = 1;
     logpen.lopnWidth.y   = 1;
     logpen.lopnColor = RGB(199,199,199);
     pen2.CreatePenIndirect(&logpen);//画笔2

     pen3.CreatePen(PS_USERSTYLE| PS_ENDCAP_FLAT,3,RGB(100,120,120));//画笔3

     oldpen = (CPen *)pDC->SelectObject(&pen1);
     pDC->MoveTo(100,100);   //画线
     pDC->LineTo(200,200);

     pDC->SelectObject(&pen2);
     pDC->Arc(&CRect(200,200,400,400),CPoint(200,200), CPoint(200,400)); //画圆弧

     pDC ->SelectObject(&pen3);
     POINT pt[4] = {{10,10},{15,15},{20,40},{50,70}};
     BYTE style[4] = {{ PT_MOVETO},{PT_LINETO},{PT_LINETO},{PT_LINETO}};
     pDC-> PolyDraw(pt,style,4); //画线

     pDC->SelectObject(oldpen);

int SetROP2(int nDrawMode); 绘图模式的前一次取值
nDrawMode指定新的绘制模式,可以为下列值之一;
R2_BLACK   像素始终为黑色。
R2_WHITE   像素始终为白色。
   R2_NOP   像素保持不变。
   R2_NOT   像素为屏幕颜色的反色。
   R2_COPYPEN   像素为笔的颜色。
R2_NOTCOPYPEN   像素为笔颜色的反色。
   R2_MERGEPENNOT   像素为笔颜色或者屏幕颜色反色的组合色。
   R2_MASKPENNOT   像素为笔颜色与屏幕颜色反色的组合色。
   R2_MERGENOTPEN   像素为笔颜色反色或者屏幕颜色的组合色。
R2_MERGEPEN   像素为笔颜色或者屏幕颜色的组合色。
R2_MASKNOTPEN   像素为笔颜色反色与屏幕颜色的组合色。
   R2_NOTMERGEPEN   R2_MERGEPEN的反色。
   R2_MASKPEN   像素为笔颜色与屏幕颜色的组合色。
   R2_NOTMASKPEN   R2_MASKPEN的反色。
R2_XORPEN   像素为笔颜色与或者屏幕颜色异或的颜色。
   R2_NOTXORPEN   R2_XORPEN的反色。
4.绘制形状:
    
FillRect( ) 填充一个矩形
FillSolidRect( ) 用用一单色填充一个矩形
InvertRect( ) 反转一个矩形的颜色
ExtFloodFill( ) 用用当前画刷填充一个区域,提供比FloodFill( )成员函数更多的灵活性
FrameRect( ) 画一个矩形的边框
填充属性是使用的是画笔, B r u s h对象控制怎样填充形状。设备环境用一个H B R U S H句柄指向一个画刷对象。若用M F C创建一个B r u s h对象,首先要创建一个C B r u s h类对象.
GetBrushOrg获取当前画刷的起点
SetBrushOrg指定选入设备上下文的下一个画刷的起点
实例:
     CBrush *oldbrush,brush1,brush2,brush3;
     brush1.CreateSolidBrush(RGB(100,100,100));
     brush2.CreateHatchBrush(HS_CROSS,RGB(200,200,200));
     LOGBRUSH logbrush;
     logbrush.lbStyle = BS_HOLLOW;
     //logbrush.lbColor = ;
     //logbrush.lbHash = ;
     brush3.CreateBrushIndirect(&logbrush);

     //Oldbrush = (CBrush*)pDC->SelectObeject(&brush1);
     pDC->FillRect(&CRect(0,0,100,100),&brush1);
     pDC -> FillSolidRect(&CRect(100,100,200,200),RGB(20,20,20));
     pDC ->InvertRect(&CRect (100,100,200,200));

     oldbrush = (CBrush*)pDC->SelectObject(&brush1);
     pDC ->Rectangle(&CRect(200, 200,250,250));
     pDC ->SelectObject(&brush2);
     pDC ->Rectangle(&CRect(250, 250,300,300));
     pDC ->DrawEdge(&CRect(300, 300,350,350), EDGE_ETCHED|BDR_SUNKENOUTER|BDR_RAISEDINNER, BF_RECT);
     pDC ->Draw3dRect(&CRect(350, 350,400, 400),RGB(20,20,20),RGB(200,200,200));
     pDC ->SelectObject(&brush3);
     pDC ->DrawFocusRect(&CRect (400,400,450,450));

pDC ->DrawFrameControl(&CRect(400,0,500,100), DFC_BUTTON, DFCS_ADJUSTRECT|DFCS_BUTTON3STATE|DFCS_MONO);
pDC->SelectObject(oldbrush);
    

FillRgn( ) 填充一个区域
InvertRgn( ) 反转一个区域的颜色
FrameRgn( ) 画一个特定区域的边框

5.滚动:
通过滚动,可移动屏幕周围像素颜色。
ScrollDC( ) 左、右、上、下移动屏幕图像。
6.绘制文本;
TextOut( ) 在在一个指定的位置,输出一个字符串
ExtTextOut( ) 在在一个矩形区域里输出一个字符串
TabbedTextOut( ) 在基于用该函数传输的一个表,在指定位置输出一个字符串,并将字符串中的任何制表符转换为空格
DrawText( ) 在在指定的矩形域里绘制文本,但比TextOut( )有更多的选项,如把文本居中和显示多行文本

文本属性控制怎样绘制文本。有三种类型的文本属性:颜色、对齐方式和字体
文本颜色的颜色可以使用函数
SetTextColor( ) 设定前景色(即文本色)
SetBkColor( ) 设置输出文本处的背景色。
文 本的对其方式; 对齐方式属性决定文本怎样排列(如:左对齐、右对齐、中央对齐)。确切地说, TextOut( )函数中的x、y变量可以表示文本的左边、右边或者底部。使用默认的对齐方式, x、y代表文本的左上角,但还有其他一些方式。要改变设备环境的文本对齐属性,可以用SetTextAlign( )函数和下面的标志值之一:
TA _ LEFT 儿TextOut( )中的x变量表示文本的左边。TA _ L E F T是默认设置值
TA _ TOP 儿TextOut( )中的y变量表示文本的顶部。TA _ TO P是默认设置值
TA _ RIGHT 儿TextOut( )中的y变量表示文本的右边。计算文本的边界矩形,用以决定从哪儿开始绘制文本
TA _ CENTER 儿TextOut( )中的y变量表示文本的中部
TA _ BASELINE 儿TextOut( ) 中的y变量表示文本的基线
TA _ BOTTOM 儿TextOut( )中的y变量指示文本的底部

virtual int DrawText(LPCTSTR lpszString,ini nCount ,LPRECTlpRect,UINT nForm-at);
int DrawText(const Cstring&str,LPRECT lpRect,UNIT nFormat);// 如果成功,则返回文本高度。
lpszString 指向要绘制的文本的指针。如果nCount是-1,该字符串必须是空终止的。NCount字符串中字符数目。如果为-1,lpszString被认为是一 个指向空终止的字符串的长指针。DrawText自动计算字符数目。LpRect指向RECT结构或Crect对象的指针,结构(或对象)中包含有矩形 (逻辑单位表示),其中的文本带有格式。
NFormat指定格式化文本的方法。它可以是下列值的组合(可用运算符或位操作符进行组合):
DT_BOTTOM   底部对齐的文本。该值必须同DT_SINGLELINE组合使用。
DT_CALCRECT   决定矩形的宽度和高度,如果是多行文字,DrawText将会使用lpRect指向的矩形,并扩展矩形以容纳文本。如果是单行文本,DrawText将会 调整矩形的右边以便容纳该行文字。两种情况下,DrawText都返回格式化文本的高度,但并不绘制它们。
DT_CENTER   将文本水平居中。
DT_END_ELLIPSIS或DT_PATH _ELLIPSIS   如果必要,将用椭圆替代部分指定的文本,以便适合给定的矩形。除非指定DT_MODIFYSTRING 标志,否则给定的字符串不会被修改。可以指定DT_END_ELLIPSIS在字符串末端替代字符,或者指定DT_PATH_ELLIPSIS在字符串中 间替代字符。如果字符串中含有反斜杠(\),DT_PATH_ELLIPSIS将尽可能保存在最后一个反斜杠后的文本。
DT_EXPANDTABS   扩展制表符,每一制表符所含字符的缺省数目是8。
DT_EXTERNALLEADING包括在行高中的字体外部间隔。通常外部间隔不包括在一行文本的高度之中。
DT_LEFT   文本左对齐。
lDT_MODIFYSTRING   修正给定字符串以便与显示文本匹配。只有在指定DT_END_ELLIPSIS 或DT_ PATH_ELLIPSIS 标志时,该标志才起作用。
DT_NOCLIP   绘制但不剪切, DrawText 在使用DT_NOCLIP后总能运行得快一些。
DT_NOPREFIX   关闭前缀字符,通常DrawText 将助记前缀&理解为其后字符加上下划线,&&前缀符表示显示一个&字符,指定 DT_NOPREFIX后,也关闭了这种处理。l DT_PATH_ELLIPSISl DT_RIGHT   文本右对齐。
DT_SINGLELING   指定单行,回车与换行不会中断该行。
DT_TABSTOP   设置制表位,nFormat的高位字节即为每一制表符所含字符的数目,缺省值为8。
DT_TOP   文本靠上对齐(只用于单行文字)。
DT_VCENTER   垂直居中对齐(只用于单行文字)。
DT_WORDBREAK   设定单词中断。如果超过lpRect指定的矩形边界,行会自动在词间断开,回车与换行也会断行。
注意   DT_CALCRECT,DT_EXTERNALLEADING,DT_INTERNAL,DT_NOCLIP和DT_NOPREFIX不能与DT_TABSTOP一同使用。

CString str = "11111111111111111111111";
CRect rect;
rect.top = 200;
rect.left = 200;
rect.bottom = 250;
rect.right = 250;
pDC->DrawText(str,&rect,DT_LEFT|DT_END_ELLIPSIS)//多出的字符用…显示

文本的字体包括字体类型、大小和文本外观的其他方面
字体属性包括在Font对象中,设备环境用HFON T句柄指向该对象。若用M F C创建一个Font对象,首先创建一个CFont类对象
GetTextColor获取当前文本颜色
SetTextColor设置文本颜色
     CRect Rect;
     GetWindowRect(&Rect);
     CFont MyFont;
     MyFont.CreateFont(24,0,0,0,FW_BOLD,true,FALSE,0,0,0,0,0,0,"Arial");
     CString StrInfo="创建立体效果的字符串";
     pDC->SetBkMode(TRANSPARENT);
     CFont *pOldFont=pDC->SelectObject(&MyFont);
     COLORREF OldColor=pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
     Rect.right=Rect.Width();
     Rect.bottom=Rect.Height();
     Rect.left=Rect.top=0;
     pDC->FillSolidRect(Rect,::GetSysColor(COLOR_3DFACE));
     pDC->DrawText(StrInfo,Rect+CPoint(0,1),DT_SINGLELINE|DT_LEFT);
     pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
     pDC->DrawText(StrInfo,Rect,DT_SINGLELINE|DT_LEFT);
     pDC->SetTextColor(OldColor);
     pDC->SelectObject(pOldFont);

7.绘制位图和图标:
DrawIcon     在在指定的位置画一个图标
BitBlt 在       从指定的设备环境中拷贝一个位图,通常是从磁盘中装入或在内存中创建,如前面所述
StretchBlt 在   与BitBlt( )基本相同,但它试图伸展或压缩一个位图以适应目标
PlgBlt       从源设备上下文的指定矩形到给定设备上下文中指定平行多边形,执行颜色数据位的位块传递
FloodFill           用当前画刷填充区域
ExtFloodFill         用当前画刷填充区域。比FloodFill成员函数提供更多灵活性MaskBlt使用给定屏蔽和光栅操作对源和目标位图合并颜色数据
PatBlt           创建位特征
MaskBlt         使用给定屏蔽和光栅操作对源和目标位图合并颜色数据
实例1:
HICON hicon = AfxGetApp()->LoadStandardIcon(MAKEINTRESOURCE(IDI_QUESTION));
pDC->DrawIcon(0,0,hicon);
BOOL BitBlt(int x,int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, intySrc, DWORD dwRop);
x 指定目标矩形左上角的逻辑X坐标。Y指定目标矩形左上角的逻辑Y坐标。NWidth指定目标矩形和源位图的宽度(逻辑单位)。NHeight指定目标矩形 和源位图的高度(逻辑单位)。PSrcDC指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅操作,则它必须为 NULL。XSrc指定源位图左上角的逻辑X坐标。YSrc指定源位图左上角的逻辑Y坐标。
DwRop指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。下面对dwRop列出光栅操作代码及其描述:
BLACKNESS   所有输出变黑。
DSTINVERT   反转目标位图。
MERGECOPY   使用布尔AND操作符合并特征与源位图。
MERGEPAINT   使用布尔OR操作符合并特征与源位图。
NOTSRCCOPY   拷贝反转源位图到目标。
NOTSRCERASE   反转使用布尔OR操作符合并源和目标位图的结果。
PATCOPY   拷贝特征到目标位图。
PATINVERT   使用布尔XOR操作符合并目标位图和特征。
PATPAINT   使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。
SRCAND   使用布尔AND操作符合并目标像素和源位图。
SRCCOPY   拷贝源位图到目标位图。
SRCERASE   反转目标位图并用布尔AND操作符合并这个结果和源位图。
SRCINVERT   使用布尔XOR操作符合并目标像素和源位图。
SRCPAINT   使用布尔OR操作符合并目标像素和源位图。
WHITENESS   所有输出变白。
CDC *memDC = new CDC;
memDC->CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,20,20);
memDC->SelectObject(&bitmap);
pDC->BitBlt(0,0,20,20,memDC,0,0,SRCCOPY);
delete memDC;

BOOL PlgBlt(POINT lpPoint ,CDC* pSrcDC,int xSrc ,int ySrc , intnWidth ,int nHeight, CBitmap& maskBitmap,int xMask ,int yMask);
lpPoint逻辑空间中包含三个点的数组的指针。它指定了一个目标平行四边形的三个顶点。源矩形的左上角与数组中的第一个点映射,右上角与第二个点映射,第三个点指向左下角。源矩形的右下角与平行四边形未能明确表示的第四点映射。
pSrcDC源设备上下文的标识。xSrc用逻辑单位表示的源矩形左上角的X坐标。
ySrc 用逻辑单位表示的源矩形左上角的Y坐标。nWidth用逻辑单位表示的源矩形的宽度。nHeight用逻辑单位表示的源矩形的高度。maskBitmap 标识用以屏蔽源矩形颜色的可选的黑白位图。xMask黑白位图左上角的X坐标。yMask黑白位图左上角的Y坐标。

对源设备上下文指定 的矩形到给定设备上下文中平行四边形的颜色数据实行位块(bit-block)转换。如果位掩码的句柄代表一个有效的位图,函数利用该函数对源矩形的颜色 数据位进行屏蔽。平行四边形的第四个顶点(D)是将前三个点(A,B,C)定义为矢量后,经D=B+C-A计算得到。如果存在位掩码1,表示源像素色将会 拷贝给目标位图,为0表示目标位图的像素不会被改变。如果掩码矩形小于源矩形和目标矩形,函数将复制掩码模式。
在源设备上下文中允许度量形式转换和解释。但不允许选择和剪切转换,掩码位图不是黑白位图,出错。目标设备上下文的扩展模式决定了像素如何被扩展或压缩。如果源设备上下文标识了增强元文件设备上下文,记录增强元文件时,则出错。

BOOL StretchBlt(int x ,int y ,int nWidth,int nHeight,CDC*pSrcDC,intxSrc,int ySrc, int nSrcWidth,int nSrcHeight.DWORD dwRop)
将源矩形中的位图拷贝到目标矩形中,如果有必要,可以扩展或压缩该位图使其与目标矩形尺寸吻合。
如 果nSrcWidth和nWidth或nSrcHeight和nHeight的符号不同,StretchBlt将为位图创建一个镜像。如果 nSrcWidth和nWidth符号不同,函数沿X轴创建镜像。如果nSrcHeight和nHeight符号不同,函数沿Y轴创建镜像。

BOOL MaskBlt(int x ,int y,int nWidth ,int nHeight,CDC* pSrcDC,int xSrc,intySrc,CBitmap& maskBitmap,int xMask ,int yMask,DWORD dwRop);
maskBitmap在源设备上下文中黑白掩码位图与彩色位图的标识。xMaskmaskBitmap设定的掩码位图的水平像素偏移量。yMaskmaskBitmap设定的掩码位图的水平像素偏移量。
使 用给定的掩码和光栅操作组合源位图和目标位图中的彩色数据。maskBitmap设置的掩码值为1,表明dwRop指定的前景光栅操作代码应在该位置上得 以应用。maskBitmap设置的掩码值为0,表明dwRop指定的背景光栅操作代码应在该位置上得以应用。如果光栅操作需要源对象,掩码矩形必须覆盖 源矩形,否则会导致失败。如果光栅操作不需要源对象,掩码矩形必须覆盖目标矩形,否则会导致失败。
8.映射模式:
Wi n d o w s有一些映像模式允许用户以像素、英寸或毫米为单位进行绘制。然而,对于大
多数应用程序,永远也不必考虑映像模式。默认模式以像素为单位,这时的x和y为像素值。
但是,若确实需要x和y为英寸值,则必须要注意逻辑单位和设备单位之间的不同
逻辑单位是传递给绘图函数的x和y值,它们可以表示英寸或毫米;而设备单位是x和y值
在屏幕上的像素数,或者是在打印机上的点阵数。鼠标单击以设备单位返回。如果想知道用
户单击在位图上的什么位置,需要将设备单位转换为逻辑单位。当以逻辑单位方式工作时,
是工作在逻辑坐标系统中;而以设备单位方式工作时,则是设备坐标系统(也称为物理坐标系统或客户坐标系统)。
映像模式用SetMapMode ( )
MM_TEXT 这这是默认的映像模式,x和y值等于一个屏幕像素或打印机点阵。在屏幕或打印页中,正的y值向下递减
MM_HIENGLISH 这X和y值相当于屏幕上或打印页上的1 / 1 0 0 0 i n,Wi n d o w s决定当前屏幕设备的多少
个像素等同于1 / 1 0 0 0 i n。在屏幕或打印页中,正的y值向上递增
MM_LOENGLISH 这X和y值相当于设备上的1 / 1 0 0 0 i n,并且y值向上递增
MM_HIMETRIC 这X和y值相当于设备上的1 / 1 0 0 m m,并且y值向上递增
MM_LOMETRIC 这X和y值相当于设备上的1 / 1 0 m m,并且y值向上递增
MM_TWIPS 这X和y值相当于设备上的1 / 1 4 4 0 i n,并且y值向上递增这通常在文本绘制中使用,一个缇( t w i p )单位相当于1 / 2 0点

CDC类还提供了两个从一个环境向另一个环境转换的函数
DPtoLP( ) 将设备单位转换为逻辑单位
LPtoDP( ) 将逻辑单位转换为设备单位


9.要设置窗口和视口矩形,使用下面这些C D C的成员函数:
SetWindowOrg( ) 设置表示逻辑环境的矩形的左上角值
SetWindowExt( ) 设置表示逻辑环境的矩形的大小
SetViewportOrg( ) 设置表示设备环境的矩形的左上角值
SetViewportExt( ) 设置表示设备环境的矩形的大小
可以区分下面的程序的不同:
1.
     pDC->SetWindowOrg(-20,-20);
     CDC *memDC = new CDC;
     memDC->CreateCompatibleDC(pDC);
     CBitmap bitmap;
     bitmap.CreateCompatibleBitmap(pDC,20,20);
     memDC->SelectObject(&bitmap);
     pDC->BitBlt(0,0,20,20,memDC,0,0,SRCCOPY);
     delete memDC;

Copyright © 2024 少林
Powered by .NET 9.0 on Kubernetes