吕鑫MFC学习系列二

第二个学习的是CString的类成员的使用,这个类是非常重要的,重点学习一下。

成员函数学习:

1、CString::GetLength()

2、CString::Format()

在vs2013编译中碰到的问题,汉字的字符长度获取是一个字节和两个字节,要设置为多字节字符集。其他可能出现的字符问题可参考下面:

Windows使用两种字符集ANSI和UNICODE,

前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。

而后者是双字节方式,方便处理双字节字符。

Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。

而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。

_T()和_L()的区别在于,_L不管你是以什么方式编译,一律以以 UNICODE方式保存。

Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。

如果将来你不打算升级到unicode,那么也不需要_T,

unicode,第个字符使用2个字节,包含了世界上几乎所有语言,每种语言的每一个字符在unicode里的值都是惟一的。

ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。不能适用于多语言平台。

按钮的代码实现:

void CstingMFCDlg::OnBnClickedGetlength()
{
	CString str;
	GetDlgItemText(IDC_LEFT, str);
	int nLen = str.GetLength();
	str.Format("长度 = %d", nLen);
	SetDlgItemText(IDC_Result, str);
}
3、CString::IsEmpty()
代码实现:

void CstingMFCDlg::OnBnClickedIsempty()
{
	CString str;
	GetDlgItemText(IDC_LEFT, str);
	BOOL b=str.IsEmpty();
	if (b)
		SetDlgItemText(IDC_Result, "是空字符串");
	else
		SetDlgItemText(IDC_Result, "不是空字符串");
}
4、CString::operator +
代码实现:

void CstingMFCDlg::OnBnClickedAdd()
{
	CString szLeft,szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	SetDlgItemText(IDC_Result, szLeft + szRight);
}
5、CString::operator ==

代码实现:

void CstingMFCDlg::OnBnClickedEqual()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	if (szLeft == szRight)
		SetDlgItemText(IDC_Result, "相等");
	else
		SetDlgItemText(IDC_Result, "不相等");
}
后面内容就没有了自己查资料学习实现按钮。

6、CString::Left()

CString Left( int nCount ) const;  //从左边1开始获取前 nCount 个字符

注:

     在函数后面加 const 的意思是:

     如果一个类声明了一个常量对象,这个对象只能使用后边带 const 这个的方法.

代码实现:

void CstingMFCDlg::OnBnClickedLefft()
{
	CString szLeft,szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	if (szLeft.GetLength() >=t)
	{
		szLeft = szLeft.Left(t);
		SetDlgItemText(IDC_Result, szLeft);
	}
	else
		AfxMessageBox("取出的个数超过了输入字符串的长度!");
}
7、CString::Mid()

CString Mid( int nCount) const;                      //从左边第 nCount+1 个字符开始,获取后面所有的字符

CString Mid( int nFirst, int nCount ) const;    //从左边第 nFirst+1 个字符开始,获取后面  nCount 个字符

代码实现:

void CstingMFCDlg::OnBnClickedMid()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	if (szLeft.GetLength() >= t)
	{
		szLeft = szLeft.Mid(t);
		SetDlgItemText(IDC_Result, szLeft);
	}
	else
		AfxMessageBox("取出的个数超过了截取的长度!");
}
8、CString::Right()
CString Right( int nCount ) const;                  //从右边1开始获取从右向左前 nCount 个字符
代码实现:

void CstingMFCDlg::OnBnClickedRight()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	if (szLeft.GetLength() >= t)
	{
		szLeft = szLeft.Right(t);
		SetDlgItemText(IDC_Result, szLeft);
	}
	else
		AfxMessageBox("取出的个数超过了输入字符串的长度!");
}
9、CString::LoadString

BOOL LoadString( UINT nID );

throw( CMemoryException );

返回值:如果加载资源成功则返回非零值;否则返回0。

nID  一个Windows字符串资源ID。

说明:此成员函数用来读取一个由nID标识的Windows字符串资源,并放入一个已有CString对象中。

代码实现:

void CstingMFCDlg::OnBnClickedLoad()
{
	CString szLeft;
	if (!szLeft.LoadString(IDC_LEFT))
		SetDlgItemText(IDC_Result, "加载成功!");
	else
		SetDlgItemText(IDC_Result, "未加载成功!");
}
10、CString::MakeLower()

void MakeLower( );  //改变字符的小写

 代码实现:

void CstingMFCDlg::OnBnClickedLower()
{
	CString szLeft;
	GetDlgItemText(IDC_LEFT, szLeft);
	szLeft.MakeLower();
	SetDlgItemText(IDC_Result, szLeft);
}
11、CString::MakeReverse()

void MakeReverse( );  //字符倒置

 代码实现:

void CstingMFCDlg::OnBnClickedReverse()
{
	CString szLeft;
	GetDlgItemText(IDC_LEFT, szLeft);
	szLeft.MakeReverse();
	SetDlgItemText(IDC_Result, szLeft);
}
12、CString::MakeUpper()

void MakeUpper( );  //改变字符的大写

代码实现:

void CstingMFCDlg::OnBnClickedUpper()
{
	CString szLeft;
	GetDlgItemText(IDC_LEFT, szLeft);
	szLeft.MakeUpper();
	SetDlgItemText(IDC_Result, szLeft);
}
13、CString:Getbuffer()和Releasebuffer()

这两个函数比较难用,仔细阅读下面的区别:

CString::GetBuffer 

LPTSTR GetBuffer( int nMinBufLength ); 

throw( CMemoryException ); 

返回值:一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针。 
参数:nMinBufLength  字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。

说明: 
此成员函数返回一个指向CString对象的内部字符缓冲区的指针。返回的LPTSTR不是const,因此可以允许直接修改CString的内容。 
如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。 
在调用Release
Buffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。 
如果你没有改变此CString的长度,则缓冲区不会被重新分配。 
当此CString对象被销毁时,其缓冲区内存将被自动释放。 
注意:如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符,你应该给ReleaseBuffer的长度参数传递-1,ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。ReleaseBuffer的作用就是更新字符串的长度。 CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer.

代码实现:

void CstingMFCDlg::OnBnClickedRebuffer()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	LPSTR pf = szLeft.GetBuffer(100);
	strcpy(pf, szRight);
	int a = szLeft.GetLength();
	szLeft.ReleaseBuffer();
	int b = szLeft.GetLength();
	szLeft.Format("内容改变,缓存区未释放前的长度:%d", a);
	AfxMessageBox(szLeft);
	szLeft.Format("内容改变,缓存区释放后的长度:%d",b);
	AfxMessageBox(szLeft);
}

14、CString::Remove()

int CString::Remove ( TCHAR ch );

返回值:返回从字符串中移走的字符数。如果字符串没有改变则返回零。

参数:ch 要从一个字符串中移走的字符。

说明:此成员函数用来将ch实例从字符串中移走。与这个字符的比较是区分大小写的。

代码实现:
void CstingMFCDlg::OnBnClickedRemove()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	char *p = szRight.GetBuffer();
	szLeft.Remove(*p);
	SetDlgItemText(IDC_Result, szLeft);
}
15、CString::Replace()

int Replace( TCHAR chOld, TCHAR chNew );

int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );

返回值:返回被替换的字符数。如果这个字符串没有改变则返回零。

参数:chOld    要被chNew替换的字符。

chNew    要用来替换chOld的字符。

lpszOld   一个指向字符串的指针,该字符串包含了要被lpszNew替换的字符。

LpszNew  一个指向字符串的指针,该字符串包含了要用来替换lpszOld的字符。

说明:此成员函数用一个字符替换另一个字符。函数的第一个原形在字符串中用chNew

现场替换chOld。函数的第二个原形用lpszNew指定的字符串替换lpszOld指定

的子串。

在替换之后,该字符串有可能增长或缩短;那是因为lpszNew和lpszOld的长度

不需要是相等的。两种版本形式都进行区分大小写的匹配。

代码实现:

void CstingMFCDlg::OnBnClickedReplace()
{
	CString str,szLeft, szRight;
	GetDlgItemText(IDC_CHAR, str);
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	TCHAR *p = szRight.GetBuffer();
	TCHAR *q = szLeft.GetBuffer();
	str.Replace(*q, *p);
	SetDlgItemText(IDC_Result, str);
}

16、CString::ReverseFind()

int ReverseFind( TCHAR ch ) const;

返回值:返回此CString对象中与要求的字符匹配的最后一个字符的索引;如果没有找到需要的字符则返回-1。

参数: ch 要搜索的字符。

说明:此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。此函数类似于运行时函数strrchr。

代码实现:

void CstingMFCDlg::OnBnClickedReversefind()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	char *p = szRight.GetBuffer();
	int i = szLeft.ReverseFind(*p);
	szLeft.Format("找到的最后一个索引为:%d", i);
	SetDlgItemText(IDC_Result, szLeft);
}<span style="font-family:Microsoft YaHei;font-size:12px;">
</span>

17、CString:: SetAt()

void SetAt( int nIndex, TCHAR ch );

 说明:可以把字符串理解为一个数组,SetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。 Ch 更替字符,把nIndex位置上的字符变成ch。

代码实现:

void CstingMFCDlg::OnBnClickedSetat()
{
	CString str, szLeft, szRight;
	GetDlgItemText(IDC_CHAR, str);
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szLeft);
	char *p = szRight.GetBuffer();
	str.SetAt(t, *p);
	SetDlgItemText(IDC_Result, str);
}

18、CString::TrimLeft()

void TrimLeft( );

void CString::TrimLeft( TCHAR chTarget );

说明:TrimLeft方法的意义是:从字符串左边看起,遇到括号中出现的字符(参数)全部截去,直到出现第一个括号中未出现的字符时停止截除,即使后面又出现了参数中有的字符也不会截去了。

void CstingMFCDlg::OnBnClickedTrimleft()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	szLeft.TrimLeft(szRight);
	SetDlgItemText(IDC_Result, szLeft);
}
19、CString::TrimRight()

void TrimRight( );

void CString::TrimRight( TCHAR chTarget );

void CString::TrimRight( LPCTSTR lpszTargets );

说明:用法类似于上面。

void CstingMFCDlg::OnBnClickedTrimright()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	szLeft.TrimRight(szRight);
	SetDlgItemText(IDC_Result, szLeft);
}
20、CString::Compare()

int Compare( LPCTSTR lpsz ) const;

返回值:字符串一样返回0,小于lpsz 返回-1,大于lpsz 返回1,区分大小字符

void CstingMFCDlg::OnBnClickedCompare()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int a=szLeft.Compare(szRight);
	if (a == 0)
		AfxMessageBox("输入的两个字符串相同!");
	else if (a == -1)
		AfxMessageBox("输入第一个字符串小于第二个字符串!");
	else
		AfxMessageBox("输入第一个字符串大于第二个字符串!");
}
21、CString::CompareNoCase()

int CompareNoCase( LPCTSTR lpsz ) const;

返回值:字符串一样返回0,小于lpsz 返回-1,大于lpsz 返回1,不区分大小字符

代码实现:
void CstingMFCDlg::OnBnClickedComparenocase()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int a = szLeft.CompareNoCase(szRight);
	if (a == 0)
		AfxMessageBox("输入的两个字符串相同!");
	else if (a == -1)
		AfxMessageBox("输入第一个字符串小于第二个字符串!");
	else
		AfxMessageBox("输入第一个字符串大于第二个字符串!");
}
22、CString::Collate()

int Collate( LPCTSTR lpsz ) const;

同CString::Compare

代码实现:

void CstingMFCDlg::OnBnClickedCollate()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int a = szLeft.Collate(szRight);
	if (a == 0)
		AfxMessageBox("输入的两个字符串相同!");
	else if (a == -1)
		AfxMessageBox("输入第一个字符串小于第二个字符串!");
	else
		AfxMessageBox("输入第一个字符串大于第二个字符串!");
}
23、CString::Delete()

int Delete( int nIndex, int nCount = 1); 

返回值:是被删除前的字符串的长度

nIndex是第一个被删除的字符,nCount是一次删除几个字符。根据我实验得出的结果:当nCount>要删除字符串的最大长度(GetCount() - nIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。

代码实现:
void CstingMFCDlg::OnBnClickedDelete()
{
	CString str, szLeft, szRight;
	GetDlgItemText(IDC_CHAR, str);
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szLeft);
	int p = _ttoi(szRight);
	str.Delete(t, p);
	SetDlgItemText(IDC_Result, str);
}
24、CString::Find()

int Find( TCHAR ch ) const;

int Find( LPCTSTR lpszSub ) const;

int Find( TCHAR ch, int nStart ) const;

int Find( LPCTSTR lpszSub, int nStart ) const;

返回值: 不匹配的话返回 -1; 索引以0开始; nStar代表以索引值nStart的字符开始搜索 ,

即为包含以索引nStart字符后的字符串.

代码实现:
void CstingMFCDlg::OnBnClickedFind()
{
	CString str, szLeft, szRight;
	GetDlgItemText(IDC_CHAR, str);
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	char *p = szLeft.GetBuffer();
	int n=str.Find(*p, t);
	str.Format("找出的索引:%d", n);
	SetDlgItemText(IDC_Result, str);
}
25、CString::FindOneOf()

int FindOneOf( LPCTSTR lpszCharSet ) const;

返回值: 不匹配的话返回 -1; 索引以0开始

注意::返回此字符串中第一个在lpszCharSet中也包括字符并且从零开始的索引值,查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置.

Find
用于查找某个字符或者字符串,返回的结果是匹配的第一个的位置
FindOneOf
就是指定多个字符串,然后查找匹配这些字符串其中一个的第一个的位置

代码实现:
void CstingMFCDlg::OnBnClickedFindoneof()
{
	CString szLeft, szRight;
	
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	
	LPCTSTR p = (LPCTSTR)szRight;
	int n = szLeft.FindOneOf(p);
	szLeft.Format("找出任意匹配的索引:%d", n);
	SetDlgItemText(IDC_Result, szLeft);
}
26、CString::GetAt()

TCHAR GetAt( int nIndex ) const;

返回值:返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。

代码实现:
void CstingMFCDlg::OnBnClickedGetat()
{
	CString szLeft, szRight;
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	char c = szLeft.GetAt(t);
	szLeft.Format("获取到的字符:%c",c);
	SetDlgItemText(IDC_Result, szLeft);
}
27、CString::Insert()

int Insert( int nIndex, TCHAR ch ); 

int Insert( int nIndex, LPCTSTR pstr );

返回值:返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子

代码实现:
void CstingMFCDlg::OnBnClickedInsert()
{
	CString str, szLeft, szRight;
	GetDlgItemText(IDC_CHAR, str);
	GetDlgItemText(IDC_LEFT, szLeft);
	GetDlgItemText(IDC_RIGTH, szRight);
	int t = _ttoi(szRight);
	szLeft.Insert(t, str);
	SetDlgItemText(IDC_Result, szLeft);
}

28、CString::FreeExtra()

void FreeExtra( );

释放CString对象之前声明的不在使用的多余的内存空间,

代码实现:

void CstingMFCDlg::OnBnClickedFreeextra()
{
	CString szLeft;
	GetDlgItemText(IDC_LEFT, szLeft);
	LPTSTR temp = szLeft.GetBuffer(50);
	strcpy(temp, "there are 22 character");
	szLeft.ReleaseBuffer();
	szLeft.FreeExtra();
	AfxMessageBox("该字符串指向的长度为22,分配长度为50。执行FreeExtra()时,它会释放所分配的多余的内存。(长度为22,分配长度为22)");
}

最后完成一个CString基本百分之八十的函数的调用实现,实现窗口如下图:


设计不是很完善,如有新增的按钮或者按钮的修改新想法,请留言非常感谢!


发布了347 篇原创文章 · 获赞 607 · 访问量 260万+
展开阅读全文

吕鑫老师的MFC透明动画技术为什么我实现不了

12-06

这是吕鑫老师CMemDC的封装类,可以用来实现图片的背景透明,但是我却实现不了,请大神看看因为什么,我用的是vs2010版本。 ``` #pragma once #include <afxwin.h> class CGMemDC :public CDC { CSize m_size; public: CGMemDC(void) { m_size.cx = m_size.cy = 0; } BOOL LoadBitmap(UINT nBitmapID, CDC * pDC=NULL) { CBitmap bitmap; bitmap.LoadBitmapW(nBitmapID); BITMAP bm; bitmap.GetBitmap(&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(bitmap); return true; } CGMemDC(UINT nBitmapID, CDC * pDC=NULL) { LoadBitmap(nBitmapID,pDC); } BOOL LoadBitmap(LPCWSTR szBitmapFile, CDC * pDC=NULL) { HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),szBitmapFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); BITMAP bm; GetObject(hBitmap,sizeof(bm),&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(hBitmap); return true; } CGMemDC(LPCWSTR szBitmapFile, CDC* pDC=NULL) { LoadBitmap(szBitmapFile,pDC); } BOOL Create(int cx, int cy, CDC* pDC=NULL) { CBitmap bitmap; bitmap.CreateCompatibleBitmap(pDC,cx,cy); m_size.cx = cx; m_size.cy = cy; CreateCompatibleDC(pDC); SelectObject(bitmap); return true; } CGMemDC(int cx, int cy, CDC* pDC=NULL) { Create(cx,cy,pDC); } BOOL DeleteDC(void) { if(!GetSafeHdc()) return true; CBitmap *pBitmap = GetCurrentBitmap(); pBitmap->DeleteObject(); return CDC::DeleteDC(); } ~CGMemDC(void) { DeleteDC(); } inline int Width() { return m_size.cx; } inline int Height() { return m_size.cy; } /////增加显示透明位图的代码 void BitTrans( int nXDest, int nYDest, int nWidthDest, int nHeightDest, CDC * pDC, int nXSrc, int nYSrc, COLORREF crTrans) { CGMemDC dcImage(nWidthDest,nHeightDest,pDC); CBitmap bmpMask; bmpMask.CreateBitmap(nWidthDest,nHeightDest,1,1,NULL); CDC dcMask; dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); dcImage.BitBlt(0,0,nWidthDest,nHeightDest,this,nXSrc,nYSrc,SRCCOPY); dcImage.SetBkColor(crTrans); dcMask.BitBlt(0,0,nWidthDest,nHeightDest,&dcImage,0,0,SRCCOPY); dcImage.SetBkColor(RGB(0,0,0)); dcImage.SetTextColor(RGB(255,255,255)); dcImage.BitBlt(0,0,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND); pDC->SetBkColor(RGB(255,255,255)); pDC->SetTextColor(RGB(0,0,0)); pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcMask,0,0,SRCAND); pDC->BitBlt(nXDest,nYDest,nWidthDest,nHeightDest,&dcImage,0,0,SRCPAINT); } }; ``` ``` #include "GMemDC.h" // CTrans 对话框 class CTrans : public CDialogEx { CGMemDC m_dc; ``` dc.BitBlt函数是将原图输出,dc.BitTrans是透明输出,敲得代码跟书上一样,但是我的却没有实现,是因为版本不一样吗? ``` void CTrans::OnPaint() { CPaintDC dc(this); // device context for painting if(!m_dc) m_dc.LoadBitmapW(IDB_BITMAP3); dc.BitBlt(0,0,m_dc.Width(),m_dc.Height(),&m_dc,0,0,SRCCOPY); m_dc.BitTrans(m_dc.Width(),0,m_dc.Width(),m_dc.Height(),&dc,0,0,RGB(255,0,255)); } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览