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

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

?? bmpproc.cpp

?? 24點游戲,用c++實現
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	// 如果類中沒有圖像,直接返回
	if (!IsValid())
		return TRUE;

	CRect rect = *crArea;
	CRect tprc;

	// 矩形坐標規范化
	rect.NormalizeRect();

	if ((rect.Width()==0)||(rect.Height()==0))
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_hObject);

	// 因為下面的代碼將改變設備描述表中剪貼區域的設置,所以先將其保存
	int savedc = dc.SaveDC();

	CRgn newrgn;
	newrgn.CreateRectRgnIndirect(&rect);
	// 只顯示指定矩形中可見的部分(用AND操作)
	dc.SelectClipRgn(&newrgn, RGN_AND);

	for (int y=rect.top;y<rect.bottom;y+=Height())
	{
		for (int x=rect.left;x<rect.right;x+=Width())
		{
			// 以瓦片方式重復顯示圖像
			tprc.SetRect(x,y,x+Width(),y+Height());
			Draw(dc, &tprc);
		}
	}

	dc.RestoreDC(savedc);
	// 恢復設備描述表的內容之后,將區域的句柄顯示的刪除
	// (微軟在文檔中特意注明要用CGdiObject::DeleteObject()
	//   函數顯示的刪除區域句柄,不知是什么原因)
	newrgn.CGdiObject::DeleteObject();

	return TRUE;
}



/*************************************************************************
 *
 * DrawCenter()
 *
 * 參數說明:
 *
 * CDC& dc					- 顯示位圖的設備描述表
 * CRect* crArea			- 顯示范圍(矩形坐標)
 * 
 * 返回值:
 *
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 將類中圖像繪入目標設備描述表的指定區域(矩形)的中央,即圖像中點與矩
 * 形中點重合
 * 
 * 如果矩形的尺寸小于圖像尺寸,則圖像的四周部分會不可見
 * 如果入口參數crArea是NULL,函數將返回FALSE
 * 如果類中沒有圖像,它什么也不作,直接返回
 * 如果矩形坐標不符合規范(比如左邊的坐標大于右邊的坐標)則函數將自動將
 * 其規范化。如果矩形坐標的寬度或高度是0,則函數將返回FALSE
 * 
 ************************************************************************/


BOOL CBmpProc::DrawCenter(CDC& dc, CRect* crArea)
{
	if (!crArea)
		return FALSE;

	// 如果類中沒有圖像,直接返回
	if (!IsValid())
		return TRUE;

	CRect rect = *crArea;

	// 矩形坐標規范化
	rect.NormalizeRect();

	if ((rect.Width()==0)||(rect.Height()==0))
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_hObject);

	// 取指定矩形的中點坐標
	CPoint cpce = rect.CenterPoint();
	CRect  tprc(CPoint(cpce.x-Width()/2,cpce.y-Height()/2), Size());

	// 因為下面的代碼將改變設備描述表中剪貼區域的設置,所以先將其保存
	int savedc = dc.SaveDC();

	CRgn newrgn;
	newrgn.CreateRectRgnIndirect(&rect);
	// 只顯示指定矩形中可見的部分(用AND操作)
	dc.SelectClipRgn(&newrgn, RGN_AND);

	Draw(dc, &tprc);

	dc.RestoreDC(savedc);
	newrgn.CGdiObject::DeleteObject();

	return TRUE;
}



/*************************************************************************
 *
 * DrawTranCenter()
 *
 * 參數說明:
 *
 * CDC& dc					- 顯示位圖的設備描述表
 * CRect* crArea			- 顯示范圍(矩形坐標)
 * COLORREF crColour		- 要濾掉或保留的顏色(缺省值是白色)
 * int mode					- 如果是0則將不顯示指定的顏色,如果是1則保留指定
 *						      的顏色(缺省值為0)
 * 
 * 返回值:
 *
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 將類中圖像透明的繪入目標設備描述表的指定區域(矩形)的中央,即圖像中點
 * 與矩形中點重合
 * 
 * 如果矩形的尺寸小于圖像尺寸,則超出矩形的圖像部分會不可見
 * 如果入口參數crArea是NULL,函數將返回FALSE
 * 如果類中沒有圖像,它什么也不作,直接返回
 * 如果矩形坐標不符合規范(比如左邊的坐標大于右邊的坐標)則函數將自動將
 * 其規范化。如果矩形坐標的寬度或高度是0,則函數將返回FALSE
 * 
 ************************************************************************/


BOOL CBmpProc::DrawTranCenter(CDC& dc, 
							  CRect* crArea, 
							  COLORREF crColour, 
							  int mode)
{
	if (!crArea)
		return FALSE;

	// 如果類中沒有圖像,直接返回
	if (!IsValid())
		return TRUE;

	CRect rect = *crArea;

	// 矩形坐標規范化
	rect.NormalizeRect();

	if ((rect.Width()==0)||(rect.Height()==0))
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_hObject);

	// 取指定矩形的中點坐標
	CPoint cpce = rect.CenterPoint();
	CRect  tprc(CPoint(cpce.x-Width()/2,cpce.y-Height()/2), Size());

	// 因為下面的代碼將改變設備描述表中剪貼區域的設置,所以先將其保存
	int savedc = dc.SaveDC();

	CRgn newrgn;
	newrgn.CreateRectRgnIndirect(&rect);
	// 只顯示指定矩形中可見的部分(用AND操作)
	dc.SelectClipRgn(&newrgn, RGN_AND);

	DrawTransparentInRect(dc, crColour, &tprc, NULL, mode);	// 顯示透明圖像

	dc.RestoreDC(savedc);
	newrgn.CGdiObject::DeleteObject();

	return TRUE;
}



/*************************************************************************
 *
 * DrawTranTile()
 *
 * 參數說明:
 *
 * CDC& dc					- 顯示位圖的設備描述表
 * CRect* crArea			- 顯示范圍(矩形坐標)
 * COLORREF crColour		- 要濾掉或保留的顏色(缺省值是白色)
 * int mode					- 如果是0則將不顯示指定的顏色,如果是1則保留指定
 *						      的顏色(缺省值為0)
 * 
 * 返回值:
 *
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 將類中的圖像以平鋪并且是透明的方式排滿指定區域
 * 
 * 如果入口參數crArea是NULL,則函數返回FALSE,如果矩形坐標不符合規范(比如
 * 左邊的坐標大于右邊的坐標)則函數將自動將其規范化。如果矩形坐標的寬度
 * 或高度是0,則函數將返回FALSE
 * 
 * 如果類中沒有圖像,它什么也不作,直接返回
 * 
 ************************************************************************/


BOOL CBmpProc::DrawTranTile(CDC& dc, 
							CRect* crArea, 
							COLORREF crColour, 
							int mode)
{
	if (!crArea)
		return FALSE;

	// 如果類中沒有圖像,直接返回
	if (!IsValid())
		return TRUE;

	CRect rect = *crArea;
	CRect tprc;

	// 矩形坐標規范化
	rect.NormalizeRect();

	if ((rect.Width()==0)||(rect.Height()==0))
		return FALSE;

	ASSERT(m_pInfo);
	ASSERT(m_hObject);

	// 因為下面的代碼將改變設備描述表中剪貼區域的設置,所以先將其保存
	int savedc = dc.SaveDC();

	CRgn newrgn;
	newrgn.CreateRectRgnIndirect(&rect);
	// 只顯示指定矩形中可見的部分(用AND操作)
	dc.SelectClipRgn(&newrgn, RGN_AND);

	for (int y=rect.top;y<rect.bottom;y+=Height())
	{
		for (int x=rect.left;x<rect.right;x+=Width())
		{
			// 以瓦片方式重復顯示圖像
			tprc.SetRect(x,y,x+Width(),y+Height());
			// 顯示透明圖像
			DrawTransparentInRect(dc, crColour, &tprc, NULL, mode);
		}
	}

	dc.RestoreDC(savedc);
	newrgn.CGdiObject::DeleteObject();

	return TRUE;
}



/*************************************************************************
 *
 * Clear()
 *
 * 參數說明:無
 *
 *
 * 返回值:無
 *
 *
 * 描述:
 *
 * 清除類中的圖像
 * 
 * 這個函數將刪除類中的位圖句柄,并清除類中的描述變量
 * 
 * 如果類中沒有圖像,它什么也不作,直接返回
 * 
 ************************************************************************/


void CBmpProc::Clear()
{
	// 如果本類中沒有有效的BMP,則直接返回
	if (m_mark == FALSE)
	{
		ASSERT(m_type == IT_NULL);
		ASSERT(m_pInfo == NULL);
		ASSERT(m_hObject == NULL);
		return;
	}

	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;

		// 先分離出原來的BMP句柄,然后刪除
		ASSERT((HBITMAP)m_hObject);
		::DeleteObject(CGdiObject::Detach());
		m_hObject = NULL;

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



/*************************************************************************
 *
 * Attach()
 *
 * 參數說明:
 * 
 * HBITMAP hBmp				- 待粘貼的位圖句柄
 * 
 * 返回值:
 * 
 * BOOL						- 如果成功返回TRUE,否則返回FALSE
 * 
 * 描述:
 *
 * 將指定的位圖貼入本身類中。
 * 
 * 注:
 * 
 * # 如果hBmp是一個無效的句柄或是NULL,函數返回FALSE
 * # 如果本身類中原來存在圖像,則調用函數成功之后,原來的圖像將被刪除
 * # hBmp必須是一個兼容于當前顯示器顏色格式的DDB位圖句柄
 * # 如果函數執行成功后,調用它的程序不應再使用hBmp句柄,因為它已被貼入類中
 * # 如果函數失敗,調用它的程序仍可以正常使用hBmp句柄
 * 
 ************************************************************************/


BOOL CBmpProc::Attach(HBITMAP hBmp)
{
	ASSERT(hBmp);
	// 如果hBmp是NULL,則立即返回
	if (!hBmp)
		return FALSE;

	HWND hWnd = ::GetDesktopWindow();
	ASSERT(hWnd);
	HDC hDC;
	BITMAP	bmp;

	// 獲取給定位圖的寬度、高度及顏色格式信息
	if (::GetObject(hBmp, sizeof(BITMAP), (LPVOID)&bmp) != sizeof(BITMAP))
		return FALSE;

	// 創建臨時位圖信息塊(不帶顏色表)
	LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)CreateMemoryBlockFromAddress(
		(LPVOID)NULL, sizeof(BITMAPINFOHEADER));
	if (!lpbi)
		return FALSE;

	// 設置DIB信息塊內容
	lpbi->biSize = sizeof(BITMAPINFOHEADER);
	lpbi->biWidth = bmp.bmWidth;
	lpbi->biHeight = bmp.bmHeight;
	lpbi->biPlanes = 1;
	// 在16色系統中,平面數是4,而位數是1,但這在DIB中是不允許的
	lpbi->biBitCount = max(bmp.bmPlanes, bmp.bmBitsPixel);
	if ((lpbi->biBitCount==16)||(lpbi->biBitCount==32))
		lpbi->biCompression = BI_BITFIELDS;
	else
		lpbi->biCompression = BI_RGB;

	// 計算設備分辯率
	hDC = ::GetDC(hWnd);
	lpbi->biXPelsPerMeter = \
		(GetDeviceCaps(hDC,HORZRES)*1000)/GetDeviceCaps(hDC,HORZSIZE);
	lpbi->biYPelsPerMeter = \
		(GetDeviceCaps(hDC,VERTRES)*1000)/GetDeviceCaps(hDC,VERTSIZE);
	::ReleaseDC(hWnd, hDC);

	lpbi->biClrUsed = 0;
	lpbi->biClrImportant = 0;
	lpbi->biSizeImage = CalculateDIBitsSize(lpbi);

	// 計算顏色表的尺寸
	WORD wPalSize = PaletteSize(lpbi);

	// 創建帶顏色表的信息塊,并復制lpbi信息塊中的內容
	LPBITMAPINFO pInfo = (LPBITMAPINFO)CreateMemoryBlockFromAddress(
		(LPVOID)lpbi, sizeof(BITMAPINFOHEADER)+wPalSize);
	if (!pInfo)
	{
		::free((void*)lpbi);
		return FALSE;
	}

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

	// 此時該結構已經無用,釋放
	::free((void*)lpbi);

	// 創建存放DIB位數據的緩沖區
	LPSTR pBits = (LPSTR)CreateMemoryBlockFromAddress((LPVOID)NULL, 
		pInfo->bmiHeader.biSizeImage);
	if (!pBits)
	{
		::free((void*)pInfo);
		return FALSE;
	}

	// 下面的代碼并不是要獲取位圖的DIB位數據,而是要取得位圖的顏色表
	// 顏色表數據在函數(GetDIBits())調用成功后被填寫在pInfo結構中
	hDC = ::GetDC(hWnd);
	if (!::GetDIBits(hDC,hBmp,0,pInfo->bmiHeader.biHeight, \
			(LPVOID)pBits,pInfo,DIB_RGB_COLORS))
	{
		::free((void*)pBits);
		::free((void*)pInfo);
		::ReleaseDC(hWnd, hDC);
		return FALSE;
	}
	::ReleaseDC(hWnd, hDC);

	// 此時并不需要DIB位數據,釋放
	::free((void*)pBits);

	// 刪除原來的圖像,并且設置新的位圖
	if (!ClearAndSetData(IT_MEMORY,0,(LPCTSTR)"",pInfo,hBmp))
	{
		::free((void*)pInfo);
		// hBmp指定的位圖并不刪除
		return FALSE;
	}

	return TRUE;
}



/*************************************************************************
 *
 * Detach()
 *
 * 參數說明:無
 * 
 * 
 * 返回值:
 * 
 * HBITMAP					- 如果成功,返回分離出的位圖句柄,否則返回NULL
 * 
 * 描述:
 *
 * 將本身類中的位圖分離出來。
 * 
 * 注:
 * 
 * # 如果本身類中原來存在位圖,函數成功調用之后,本身類將被清空
 * # 如果本身類中原來沒有位圖,函數返回NULL
 * 
 ************************************************************************/


HBITMAP CBmpProc::Detach()
{
	if (!IsValid())
		return NULL;

	ASSERT(m_pInfo);
	ASSERT(m_hObject);

	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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品成人免费观看| 51精品久久久久久久蜜臀| 日韩av不卡一区二区| 国产精品视频九色porn| 欧美精品一区二区三区在线| 欧美三日本三级三级在线播放| youjizz国产精品| 国产91丝袜在线18| 成人avav影音| 日本高清不卡在线观看| 色先锋aa成人| 欧美视频在线不卡| 欧美xingq一区二区| 精品粉嫩aⅴ一区二区三区四区| 久久综合久久久久88| 国产日韩精品一区二区浪潮av | 在线观看日韩国产| 日本久久一区二区| 欧美吻胸吃奶大尺度电影| 欧美视频中文一区二区三区在线观看| 欧美色国产精品| 26uuu欧美日本| 1000精品久久久久久久久| 亚洲影视在线观看| 狠狠久久亚洲欧美| 91麻豆国产福利精品| 欧美日韩一区二区在线视频| 日韩欧美一级在线播放| 欧美国产欧美综合| 一区二区久久久| 韩国av一区二区三区| 99久久伊人网影院| 欧美精品色一区二区三区| 久久综合丝袜日本网| 国产精品日韩成人| 三级在线观看一区二区| 国产精品12区| 欧美日韩高清影院| 国产精品三级视频| 国内精品久久久久影院薰衣草| 成人av网址在线| 91精品欧美久久久久久动漫 | 三级不卡在线观看| 国产一区二区三区在线观看免费视频 | 欧美日韩国产首页在线观看| 久久久久一区二区三区四区| 夜夜嗨av一区二区三区| 国产在线一区观看| 欧美日韩国产经典色站一区二区三区 | 日韩一区二区三区在线观看| 亚洲欧美日韩中文播放 | 日韩高清一级片| 91麻豆123| 国产日韩欧美a| 久久国产福利国产秒拍| 欧美日产在线观看| 亚洲综合男人的天堂| 成人va在线观看| 久久久久久久电影| 久久精品99国产国产精| 91精品欧美一区二区三区综合在| 樱桃国产成人精品视频| 99久久精品费精品国产一区二区| 精品免费国产二区三区| 免费在线看一区| 欧美顶级少妇做爰| 亚洲综合av网| 欧美日韩一级大片网址| 亚洲成av人片在线观看| 欧美三区在线视频| 午夜精品久久久久久久久| 日本韩国欧美一区| 国产精品影音先锋| 欧美成人a∨高清免费观看| 日韩av在线免费观看不卡| 欧美日韩久久一区二区| 亚洲中国最大av网站| 色综合久久中文字幕| 亚洲人成亚洲人成在线观看图片| 99riav久久精品riav| 中文字幕一区二区在线播放| 99视频一区二区| 国产精品高潮久久久久无| 91亚洲精品一区二区乱码| 亚洲人成网站精品片在线观看| 日本福利一区二区| 婷婷丁香激情综合| 欧美精品一区二区在线播放| 国产成人夜色高潮福利影视| 国产精品久久免费看| 91精品办公室少妇高潮对白| 亚洲一区二区视频| 日韩一区二区电影网| 精品一区二区三区在线播放视频| 久久久久久99久久久精品网站| 国产激情偷乱视频一区二区三区| 国产精品免费看片| 欧美色图12p| 精品中文字幕一区二区小辣椒| 欧美成人性福生活免费看| 国产二区国产一区在线观看| 最近日韩中文字幕| 91精品国产一区二区三区| 韩国三级中文字幕hd久久精品| 国产精品久久久久国产精品日日| 欧美在线视频全部完| 久久99国内精品| 日韩美女视频一区二区| 欧美一级搡bbbb搡bbbb| 成人深夜视频在线观看| 午夜视频在线观看一区二区三区| 日韩欧美高清dvd碟片| 99精品视频在线观看| 视频一区二区欧美| 国产精品视频一二三区| 91精品黄色片免费大全| a级高清视频欧美日韩| 老司机精品视频在线| 亚洲精品国久久99热| 337p粉嫩大胆色噜噜噜噜亚洲| 91啦中文在线观看| 国产精品一二三在| 三级影片在线观看欧美日韩一区二区| 国产午夜精品理论片a级大结局| 欧美日韩dvd在线观看| hitomi一区二区三区精品| 久久成人av少妇免费| 一区二区视频在线看| 国产网红主播福利一区二区| 欧美精品自拍偷拍| 91麻豆福利精品推荐| 不卡一区二区中文字幕| 激情文学综合网| 香蕉成人伊视频在线观看| 亚洲色图19p| 国产欧美日韩在线| 日韩欧美在线一区二区三区| 91美女蜜桃在线| 国产a级毛片一区| 国产乱子轮精品视频| 免费xxxx性欧美18vr| 五月婷婷综合网| 亚洲国产三级在线| 亚洲午夜久久久久| 亚洲一区二区三区激情| 亚洲伦理在线精品| 亚洲人成影院在线观看| 中文字幕一区二区三区不卡| 中文av一区二区| 国产精品无码永久免费888| 久久人人爽爽爽人久久久| 精品久久一区二区| 欧美成人艳星乳罩| 久久久久久久国产精品影院| 精品国产乱码久久久久久影片| 日韩一级成人av| 日韩片之四级片| 久久久午夜精品| 国产午夜精品福利| 欧美国产视频在线| 中文字幕永久在线不卡| 亚洲欧美电影一区二区| 一区二区三区 在线观看视频| 一区二区成人在线观看| 婷婷国产在线综合| 久久丁香综合五月国产三级网站| 极品少妇xxxx偷拍精品少妇| 国产精品伊人色| 91视频免费观看| 欧美日韩极品在线观看一区| 91精品一区二区三区在线观看| 91精品国产高清一区二区三区| 日韩欧美第一区| 久久精品无码一区二区三区| 中文字幕在线观看一区| 亚洲无人区一区| 蜜臀精品久久久久久蜜臀| 国产一区二区免费在线| 91小视频在线免费看| 91精品免费在线观看| 欧美国产日本韩| 亚洲影视在线观看| 国产麻豆成人传媒免费观看| 97se亚洲国产综合在线| 69久久夜色精品国产69蝌蚪网| 精品免费日韩av| 一区二区三区精品久久久| 捆绑调教美女网站视频一区| 播五月开心婷婷综合| 欧美久久一区二区| 国产精品久久久久久久久免费相片| 亚洲影视在线观看| 国产大陆亚洲精品国产| 在线精品亚洲一区二区不卡| 久久综合国产精品| 性欧美大战久久久久久久久| 国产99精品视频| 日韩欧美在线网站| 亚洲国产视频网站| av高清久久久|