亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bmpproc.cpp

?? 在vc 6.0環境下的一個坦克小游戲
?? CPP
?? 第 1 頁 / 共 5 頁
字號:

	HBITMAP hBmp = (HBITMAP)CGdiObject::Detach();
	ASSERT(hBmp);
	if (!hBmp)
		return NULL;

	m_hObject = NULL;

	switch(m_type)
	{
	case	IT_NULL:
		ASSERT(FALSE);	// 此時m_type不應該是IT_NULL
		break;
	case	IT_DISKFILE:
		ASSERT(!m_cFileName.IsEmpty());	// 文件來源的位圖應該有文件名
	case	IT_RESOURCE:
	case	IT_MEMORY:
	case	IT_CLIP:
	case	IT_CREATE:
		m_cFileName.Empty();

		ASSERT(m_pInfo);
		::free((void*)m_pInfo);
		m_pInfo = NULL;

		m_addInfo = 0;
		m_type = IT_NULL;
		m_mark = FALSE;
		break;
	default:
		ASSERT(FALSE);
		break;
	}

	return hBmp;
}



/*************************************************************************
 *
 * Save()
 *
 * 參數說明:
 * 
 * LPCTSTR lpszNewFileName	- 指定的新文件名(可以是NULL)
 * WORD nBitsPerPixel		- 指定的新顏色格式(即每像素多少位,可以是0)
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 將本身類中的位圖以新的格式或新的名稱保存到文件中
 * 
 * 注:
 * 
 * # 如果沒有指定新的文件名(入口參數lpszNewFileName被指定為NULL),函數
 *   就使用類中原來的文件名,如果類中原來沒有文件名則函數失敗,返回FALSE
 * # 如果沒有指定新的位數(入口參數nBitsPerPixel被指定為0),函數就使用類
 *   中原來的位數值。如果新指定的位數值非法則函數失敗,返回FALSE。合法的
 *   位數值是1,4,8,16,24,32 其中之一
 * # 如果本身類中原來沒有位圖(空類),函數返回FALSE
 * # 如果文件沒有打開或是寫文件時出錯,函數返回FALSE
 * # 函數執行成功之后,本身類中的文件名或位數將改為新值
 * # 無論函數成功與否,本身類中的位圖不會改變
 * 
 ************************************************************************/


BOOL CBmpProc::Save(LPCTSTR lpszNewFileName, WORD nBitsPerPixel)
{
	// 如果本身類中原來沒有位圖,函數返回FALSE
	if (!IsValid())
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));

	LPBITMAPINFO pInfo;
	BOOL bRet;
	CString cOldFN;

	// 以原來的格式保存到原來的文件中
	if ((lpszNewFileName==NULL)&&(nBitsPerPixel==0))
	{
		// 應該有文件名
		if (m_cFileName.IsEmpty())
			return FALSE;

		return SaveBaseSpecifyFileName((LPCTSTR)m_cFileName);
	}

	// 以原來的格式保存到新的文件中
	if ((lpszNewFileName!=NULL)&&(nBitsPerPixel==0))
	{
		bRet = SaveBaseSpecifyFileName((LPCTSTR)lpszNewFileName);

		if (bRet)
			m_cFileName = lpszNewFileName;

		return bRet;
	}

	// 以新的格式保存到原來的文件中
	if ((lpszNewFileName==NULL)&&(nBitsPerPixel!=0))
	{
		// 檢測位數合法性
		if (!IsValidDibFormat(nBitsPerPixel))
			return FALSE;

		// 應該有文件名
		if (m_cFileName.IsEmpty())
			return FALSE;

		bRet = SaveBaseSpecifyFormat(nBitsPerPixel);

		if (bRet)
		{
			pInfo = GetSpecifyFormatInfo(nBitsPerPixel);
			if (!pInfo)
				return FALSE;
			::free((void*)m_pInfo);
			m_pInfo = pInfo;
		}
		return bRet;
	}

	// 以新的格式保存到新的文件中
	if ((lpszNewFileName!=NULL)&&(nBitsPerPixel!=0))
	{
		// 檢測位數合法性
		if (!IsValidDibFormat(nBitsPerPixel))
			return FALSE;

		cOldFN = m_cFileName;
		m_cFileName = lpszNewFileName;

		bRet = SaveBaseSpecifyFormat(nBitsPerPixel);

		if (bRet)
		{	// 獲取指定格式的信息塊
			pInfo = GetSpecifyFormatInfo(nBitsPerPixel);
			if (!pInfo)
			{
				m_cFileName = cOldFN;
				return FALSE;
			}
			::free((void*)m_pInfo);
			m_pInfo = pInfo;
		}
		else
			m_cFileName = cOldFN;

		return bRet;
	}

	return FALSE;
}



/*************************************************************************
 *
 * SaveToClipboard()
 *
 * 參數說明:無
 * 
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 保存本身類中的位圖到剪貼板
 * 
 * 注:
 * 
 * # 如果本身類中原來沒有位圖,函數返回FALSE
 * # 如果在打開或寫入剪貼板時出錯,函數返回FALSE
 * # 無論函數成功與否,本身類中的內容都不會改變
 * 
 ************************************************************************/


BOOL CBmpProc::SaveToClipboard()
{
	// 如果本身類中原來沒有位圖,函數返回FALSE
	if (!IsValid())
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));

	// 打開剪貼板
	if (::OpenClipboard(NULL))
	{
		// 清空剪貼板
		if (::EmptyClipboard())
		{
			DWORD DibSize = CalculateDIBSize((LPBITMAPINFOHEADER)m_pInfo);
			DWORD infosize =CalculateDIBInfoSize((LPBITMAPINFOHEADER)m_pInfo);

			// 分配DIB內部格式內存塊
			HANDLE hDib = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, DibSize);
			if (hDib)
			{
				LPSTR lpDib = (LPSTR)::GlobalLock(hDib);
				if (lpDib)
				{
					::memcpy((void*)lpDib, (const void*)m_pInfo, infosize);

					// 獲取DIB位數據
					HWND hWnd = ::GetDesktopWindow();
					ASSERT(hWnd);
					HDC hDC = ::GetDC(hWnd);
					if (!::GetDIBits(hDC,(HBITMAP)m_hObject,0,m_pInfo->bmiHeader.biHeight,\
							(LPVOID)((DWORD)lpDib+infosize),(LPBITMAPINFO)lpDib,DIB_RGB_COLORS))
					{
						::GlobalUnlock(hDib);
						::GlobalFree(hDib);
						::CloseClipboard();
						::ReleaseDC(hWnd, hDC);
						return FALSE;
					}
					::ReleaseDC(hWnd, hDC);

					::GlobalUnlock(hDib);

					// 將DIB數據貼入剪貼板
					if (::SetClipboardData(CF_DIB, hDib))
					{
						// 如果成功,DIB句柄不應釋放
						::CloseClipboard();
						return TRUE;		// 成功
					}
					else
					{
						::GlobalFree(hDib);
						::CloseClipboard();
						return FALSE;		// 失敗
					}
				}
				::GlobalFree(hDib);
			}
		}
		::CloseClipboard();
	}

	return FALSE;	// 失敗
}



/*************************************************************************
 *
 * SaveBaseSpecifyFileName()
 *
 * 參數說明:
 * 
 * LPCTSTR fn				- 指定的文件名稱
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 保存本身類中的位圖到指定的文件中
 * 
 * 注:
 * 
 * # 如果指定的文件已經存在,則函數將覆蓋該文件
 * # 如果本身類中原來沒有位圖,函數返回FALSE
 * # 如果文件沒有打開或是寫文件時出錯,函數返回FALSE
 * # 函數并不修改類中文件名
 * 
 ************************************************************************/


BOOL CBmpProc::SaveBaseSpecifyFileName(LPCTSTR fn)
{
	// 如果本身類中原來沒有位圖,函數返回FALSE
	if (!IsValid())
		return FALSE;

	ASSERT(m_pInfo);

	// 如果沒有指定文件名,返回FALSE
	if (!fn)
		return FALSE;

	FILE *file;

	// 用創建方式打開文件(二進制)
	file = ::fopen(fn, "w+b");
	if (!file)
		return FALSE;
	
	::fseek(file, 0, SEEK_SET);

	BITMAPFILEHEADER	bmf;

	bmf.bfType = DIB_HEADER_MARKER;		//((WORD) ('M' << 8) | 'B')
    bmf.bfSize = CalculateDIBFileSize((LPBITMAPINFOHEADER)m_pInfo);
    bmf.bfReserved1 = 0; 
    bmf.bfReserved2 = 0; 
    bmf.bfOffBits   = CalculateDIBitsOff((LPBITMAPINFOHEADER)m_pInfo);

	// 寫入文件頭信息
	if (!::fwrite((const void *)&bmf, sizeof(BITMAPFILEHEADER), 1, file))
	{
		::fclose(file);
		return FALSE;
	}

	// 復制信息塊內容,之所以復制信息塊而不直接使用m_pInfo,是因為
	// GetDIBits()函數有可能改變信息塊顏色表的內容
	int infosize = CalculateDIBInfoSize((LPBITMAPINFOHEADER)m_pInfo);
	ASSERT(infosize == (int)::_msize((void*)m_pInfo));
	LPBITMAPINFO pInfo = (LPBITMAPINFO)CreateMemoryBlockFromAddress(
		(LPVOID)m_pInfo);
	if (!pInfo)
	{
		::fclose(file);
		return FALSE;
	}

	// 寫入信息塊內容
	if (!::fwrite((const void *)pInfo, infosize, 1, file))
	{
		::free((void*)pInfo);
		::fclose(file);
		return FALSE;
	}

	LPSTR pBits = (LPSTR)CreateMemoryBlockFromAddress((LPVOID)NULL, 
		CalculateDIBitsSize((LPBITMAPINFOHEADER)pInfo));
	if (!pBits)
	{
		::free((void*)pInfo);
		::fclose(file);
		return FALSE;
	}

	// 獲取DIB位數據
	HWND hWnd = ::GetDesktopWindow();
	ASSERT(hWnd);
	HDC hDC = ::GetDC(hWnd);
	if (!::GetDIBits(hDC,(HBITMAP)m_hObject,0,pInfo->bmiHeader.biHeight,\
			(LPVOID)pBits,pInfo,DIB_RGB_COLORS))
	{
		::free((void*)pInfo);
		::free((void*)pBits);
		::fclose(file);
		::ReleaseDC(hWnd, hDC);
		return FALSE;
	}
	::ReleaseDC(hWnd, hDC);

	// 信息塊已無用,釋放
	::free((void*)pInfo);

	DWORD dwA, dwB, dwC;

	LPSTR lp = pBits;

	// 以分段方式寫入位數據,每個段長度為32KB。
	dwA = CalculateDIBitsSize((LPBITMAPINFOHEADER)m_pInfo);	// 總長度
	dwB = dwA/32768;			// 段數(32768)
	dwC = dwA - (dwB*32768);	// 余數

	for (;dwB!=0;dwB--)
	{
		if (!::fwrite((const void *)lp, 32768, 1, file))
		{
			::free((void*)pBits);
			::fclose(file);
			return FALSE;
		}
		lp = (LPSTR)((DWORD)lp+32768UL);
	}

	// 寫入剩余的位數據
	if (!::fwrite((const void *)lp, dwC, 1, file))
	{
		::free((void*)pBits);
		::fclose(file);
		return FALSE;
	}

	// 位數據已無用,釋放
	::free((void*)pBits);

	// 關閉文件
	::fclose(file);

	return TRUE;
}



/*************************************************************************
 *
 * SaveBaseSpecifyFormat()
 *
 * 參數說明:
 * 
 * WORD nBitsPerPixel		- 指定的格式(即每像素占多少位)
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 以指定的顏色格式保存本身類中的位圖到原來的文件中
 * 
 * 注:
 * 
 * # 如果指定的文件已經存在,則函數將覆蓋該文件
 * # 如果本身類中原來沒有位圖,函數返回FALSE
 * # 如果文件沒有打開或是寫文件時出錯,函數返回FALSE
 * # 如果指定的位數是非法值(1,4,8,16,24,32是合法值),函數返回FALSE
 * # 函數并不修改類中信息塊的內容
 * 
 ************************************************************************/


BOOL CBmpProc::SaveBaseSpecifyFormat(WORD nBitsPerPixel)
{
	// 如果本身類中原來沒有位圖,函數返回FALSE
	if (!IsValid())
		return FALSE;

	ASSERT(m_pInfo);

	// 應該有文件名
	if (m_cFileName.IsEmpty())
		return FALSE;

	// 檢測位數合法性
	if (!IsValidDibFormat(nBitsPerPixel))
		return FALSE;

	LPBITMAPINFO pTempInfo;
	BOOL bRet;

	// 獲取指定格式DIB的信息塊
	LPBITMAPINFO pInfo = GetSpecifyFormatInfo(nBitsPerPixel);
	if (!pInfo)
		return FALSE;

	// 保存原始信息塊
	pTempInfo = m_pInfo;

	m_pInfo = pInfo;			   // 以原文件名存儲
	bRet = SaveBaseSpecifyFileName((LPCTSTR)m_cFileName);
	m_pInfo = pTempInfo;

	::free((void*)pInfo);

	return bRet;
}



/*************************************************************************
 *
 * Create()
 *
 * 參數說明:
 * 
 * int width				- 創建位圖的寬度
 * int height				- 創建位圖的高度
 * WORD nBitCount			- 創建位圖中每個像素所占的位數
 * const void *lpBits		- 新位圖的初始化位數據(可以是NULL)
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 根據指定的數據創建一個位圖,并貼入本身類中
 * 
 * 注:
 * 
 * # 入口參數width和height不能是0,如果指定了0,函數返回FALSE
 * # 入口參數nBitCount的有效值可以是1,4,8,16,24,32,其它的值將視為非法
 * # 如果本身類中原來存在圖像,則調用函數成功之后,原來的圖像將被刪除
 * # 如果入口參數lpBits是NULL,則新創建的位不被初始化
 * 
 ************************************************************************/


BOOL CBmpProc::Create(CSize size, 
					  WORD nBitCount, 
					  const void *lpBits)
{ 
	return Create(size.cx, size.cy, nBitCount, lpBits); 
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丨porny丨户外露出| 国内成+人亚洲+欧美+综合在线| 日韩欧美中文字幕精品| www.在线成人| 久久丁香综合五月国产三级网站| 亚洲老司机在线| 欧美国产精品一区二区三区| 欧洲亚洲精品在线| 午夜在线电影亚洲一区| 色综合久久久久网| 亚洲欧洲日韩一区二区三区| 国产成人鲁色资源国产91色综 | 欧美四级电影网| 国产亚洲欧美日韩在线一区| 美女一区二区三区在线观看| 26uuu亚洲综合色| 亚洲第一在线综合网站| 国产日韩欧美a| 欧美大片在线观看一区二区| 欧美日韩免费高清一区色橹橹| 菠萝蜜视频在线观看一区| 国产在线日韩欧美| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲蜜臀av乱码久久精品| 国产欧美日韩久久| 国产欧美精品国产国产专区| 精品国产区一区| 91精品在线免费| 欧美日韩国产综合一区二区三区 | 337p亚洲精品色噜噜噜| 91精品福利视频| 91美女蜜桃在线| 91免费版在线看| 99国产精品久久久久久久久久久| 国产精品88888| 国产曰批免费观看久久久| 精品综合免费视频观看| 麻豆精品视频在线观看| 人人超碰91尤物精品国产| 午夜亚洲福利老司机| 亚洲综合免费观看高清完整版 | 午夜精品久久一牛影视| 午夜伊人狠狠久久| 天天操天天色综合| 秋霞午夜av一区二区三区| 日韩二区三区四区| 久久精品国产秦先生| 久久精品国产成人一区二区三区| 激情av综合网| 懂色av一区二区在线播放| 国产不卡视频一区二区三区| 国产不卡在线播放| 色婷婷综合久久久中文字幕| 色婷婷亚洲精品| 欧美精品亚洲二区| 日本不卡在线视频| 亚洲制服丝袜在线| 看片的网站亚洲| 亚洲精品乱码久久久久久黑人 | 午夜精品久久久久久久99樱桃| 国产欧美日韩亚州综合 | 麻豆精品在线看| 三级在线观看一区二区| 中国av一区二区三区| 欧美精品一区二区久久久| 久久久久9999亚洲精品| 国产精品成人网| 午夜av区久久| 国产成人亚洲精品狼色在线| 成人国产精品免费网站| 欧美日韩一本到| 2017欧美狠狠色| 亚洲免费在线观看视频| 五月天激情综合网| 国产精品一区2区| 色成人在线视频| 日韩区在线观看| 日韩久久一区二区| 麻豆精品一区二区三区| 99riav一区二区三区| 69堂精品视频| 中文字幕中文在线不卡住| 午夜精品爽啪视频| 国产精品18久久久久久久久| 91福利在线看| 久久综合成人精品亚洲另类欧美| 亚洲视频综合在线| 麻豆一区二区99久久久久| 丰满岳乱妇一区二区三区| 欧美中文字幕不卡| 国产无一区二区| 亚洲va国产va欧美va观看| 国产精品亚洲成人| 欧美美女一区二区| 国产精品美女久久久久久2018| 亚洲bt欧美bt精品| 成人18精品视频| 精品三级在线看| 亚洲一区二区三区在线播放| 国产麻豆成人传媒免费观看| 在线观看亚洲成人| 欧美国产激情二区三区| 蜜桃传媒麻豆第一区在线观看| 91日韩一区二区三区| 国产无一区二区| 激情综合一区二区三区| 欧美日韩综合在线免费观看| 国产精品嫩草99a| 韩国成人福利片在线播放| 欧美三级在线看| 一区二区三区久久| av在线播放一区二区三区| 精品日产卡一卡二卡麻豆| 日韩av一级电影| 欧美系列一区二区| 亚洲精品视频免费观看| 欧美亚洲国产一区在线观看网站| 国产亚洲精品久| 国产主播一区二区| 日韩免费视频一区二区| 日韩电影一区二区三区四区| 色欲综合视频天天天| 国产精品久久久久久亚洲毛片 | 2020国产精品自拍| 青青青爽久久午夜综合久久午夜 | 国产女同性恋一区二区| 麻豆精品新av中文字幕| 欧美一区二区三区在线电影| 亚洲成人资源在线| 在线看国产一区二区| 亚洲免费色视频| 色爱区综合激月婷婷| 一区二区视频在线看| 色综合激情五月| 亚洲一区视频在线| 欧美性淫爽ww久久久久无| 亚洲人成小说网站色在线| 91成人在线免费观看| 亚洲尤物在线视频观看| 在线免费观看一区| 亚洲成av人片在线观看无码| 欧美丝袜自拍制服另类| 视频一区免费在线观看| 91精品久久久久久蜜臀| 欧美96一区二区免费视频| 精品国产亚洲一区二区三区在线观看| 青草国产精品久久久久久| 2020国产精品自拍| 成人动漫在线一区| 亚洲精品视频在线观看免费| 欧美日韩一区二区不卡| 成人免费看黄yyy456| 91亚洲国产成人精品一区二三| 粉嫩13p一区二区三区| 久久精品一区四区| 成人一道本在线| 亚洲视频免费在线| 91久久精品一区二区| 亚洲国产裸拍裸体视频在线观看乱了 | 久久一区二区三区国产精品| 国产成人免费视频精品含羞草妖精| 久久人人爽人人爽| 不卡av电影在线播放| 亚洲va在线va天堂| 精品国产露脸精彩对白 | 99久久er热在这里只有精品66| 日韩国产欧美在线观看| 日韩精品一区二区三区在线观看| 国产在线不卡视频| 亚洲精品一二三| 日韩一级精品视频在线观看| 国产精品一区二区91| 伊人开心综合网| 精品乱码亚洲一区二区不卡| 成人免费观看av| 日日夜夜精品免费视频| 久久久影视传媒| 在线区一区二视频| 韩国av一区二区三区四区| 亚洲柠檬福利资源导航| 精品国产百合女同互慰| 欧美午夜一区二区三区免费大片| 99热国产精品| 久久夜色精品一区| 国产精品久久久久久亚洲毛片| 成人欧美一区二区三区在线播放| 亚洲视频 欧洲视频| 亚洲成人动漫在线免费观看| 午夜精品在线视频一区| 国产自产视频一区二区三区| 成人免费的视频| 欧美人与z0zoxxxx视频| 亚洲精品在线免费观看视频| 精品成a人在线观看| 日本女优在线视频一区二区| 国产一区二区不卡老阿姨| 亚洲欧洲av一区二区三区久久| 制服丝袜日韩国产| caoporn国产一区二区| 久久se这里有精品|