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

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

?? dibapi.cpp

?? 深入學習VC++得很難得的一本好書 里面配有大量的源代碼 并有詳細的解釋
?? CPP
字號:
//  DIBAPI.cpp
//

#include "stdafx.h"
#include "dibapi.h"
#include <direct.h>
#include <math.h>
#include <io.h>
#include <errno.h>


BOOL  PaintDIB(HDC  hDC,
			   LPRECT  lpDCRect,
			   HDIB    hDIB,
			   LPRECT  lpDIBRect,
			   CPalette* pPal)
{
	LPSTR    lpDIBHdr;            // 指向BITMAPINFOHEADER的指針
	LPSTR    lpDIBBits;           // 指向一個DIB位
	BOOL     bSuccess=FALSE;      // 成功與失敗的標記
	HPALETTE hPal=NULL;           // DIB調色板
	HPALETTE hOldPal=NULL;        // 舊的調色板

	// 檢查DIB句柄是否有效
	if (hDIB == NULL)
		return FALSE;

	//鎖住DIB,取得一個起始指針
	lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
	lpDIBBits = ::FindDIBBits(lpDIBHdr);

	// 取得DIB的調色板,并將其選進設備
	if (pPal != NULL)
	{
		hPal = (HPALETTE) pPal->m_hObject;

		// 選取背景 
		hOldPal = ::SelectPalette(hDC, hPal, TRUE);
	}

	// 確定使用模式
	::SetStretchBltMode(hDC, COLORONCOLOR);

	// 決定調用StretchDIBits()或SetDIBitsToDevice()函數
	if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
	   (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
		bSuccess = ::SetDIBitsToDevice(hDC,			 // 顯示設備上下文句柄
				   lpDCRect->left,           // 目的區左上x坐標
				   lpDCRect->top,            // 目的區左上y坐標
				   RECTWIDTH(lpDCRect),      // 原矩形寬度
				   RECTHEIGHT(lpDCRect),     // 原矩形高度
				   lpDIBRect->left,          // 原矩形左下角x坐標
				   (int)DIBHeight(lpDIBHdr) -
					  lpDIBRect->top -
					  RECTHEIGHT(lpDIBRect), // 原矩形左下角y坐標
				   0,                        // 第一掃描線位置
				   (WORD)DIBHeight(lpDIBHdr),// 掃描線數
				   lpDIBBits,                // DIB像素數據指針
				   (LPBITMAPINFO)lpDIBHdr,   // BITMAPINFO結構指針
				   DIB_RGB_COLORS);          // 使用顏色的方式
   else
	  bSuccess = ::StretchDIBits(hDC,        // 顯示設備上下文句柄
				   lpDCRect->left,           // 目的區左上x坐標
				   lpDCRect->top,            // 目的區左上y坐標
				   RECTWIDTH(lpDCRect),      // 目的矩形寬度
				   RECTHEIGHT(lpDCRect),     // 目的矩形高度
				   lpDIBRect->left,          // 原矩形左下角x坐標
				   lpDIBRect->top,           // 原矩形左下角y坐標
				   RECTWIDTH(lpDIBRect),     // 原矩形寬度
				   RECTHEIGHT(lpDIBRect),    // 原矩形高度
				   lpDIBBits,                // DIB像素數據指針
				   (LPBITMAPINFO)lpDIBHdr,   // BITMAPINFO結構指針
				   DIB_RGB_COLORS,           // 使用顏色的方式
				   SRCCOPY);                 //光柵操作碼
  ::GlobalUnlock((HGLOBAL) hDIB);

	// 重選舊的調色板 
	if (hOldPal != NULL)
	{
		::SelectPalette(hDC, hOldPal, TRUE);
	}

   return bSuccess;
}

BOOL  CreateDIBPalette(HDIB hDIB, CPalette* pPal)
{
	LPLOGPALETTE lpPal;      // 指向邏輯調色板的指針
	HANDLE hLogPal;          // 邏輯調色板句柄
	HPALETTE hPal = NULL;    // 調色板句柄
	int i;                   // 索引
	WORD wNumColors;         // 顏色表中的顏色數
	LPSTR lpbi;              // 指向一個DIB的指針
	LPBITMAPINFO lpbmi;      // 指向BITMAPINFO結構的指針
	LPBITMAPCOREINFO lpbmc;  // 指向BITMAPCOREINFO結構的指針
	BOOL bWinStyleDIB;       // 區分是否為Win3.0 DIB的一個標記 
	BOOL bResult = FALSE;

	// 如果DIB句柄無效, 返回FALSE

	if (hDIB == NULL)
	  return FALSE;

   lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

   // 得到BITMAPINFO (Win 3.0)指針 
   lpbmi = (LPBITMAPINFO)lpbi;

   // 得到BITMAPCOREINFO (old 1.x)指針 
   lpbmc = (LPBITMAPCOREINFO)lpbi;

   // 得到DIB的顏色數
   wNumColors = ::DIBNumColors(lpbi);

   if (wNumColors != 0)
   {
		// 為邏輯調色板分配內存
		hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
									+ sizeof(PALETTEENTRY)
									* wNumColors);

		// 如果沒有足夠得空間清除并返回 NULL
		if (hLogPal == 0)
		{
			::GlobalUnlock((HGLOBAL) hDIB);
			return FALSE;
		}

		lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);

		// 設置版本號和調色板口數目 
		lpPal->palVersion = PALVERSION;
		lpPal->palNumEntries = (WORD)wNumColors;

		// 是否為Win 3.0 DIB
		bWinStyleDIB = IS_WIN30_DIB(lpbi);
		for (i = 0; i < (int)wNumColors; i++)
		{
			if (bWinStyleDIB)
			{
				lpPal->palPalEntry[i].peRed = 
					lpbmi->bmiColors[i].rgbRed;
				lpPal->palPalEntry[i].peGreen = 
					lpbmi->bmiColors[i].rgbGreen;
				lpPal->palPalEntry[i].peBlue = 
					lpbmi->bmiColors[i].rgbBlue;
				lpPal->palPalEntry[i].peFlags = 0;
			}
			else
			{
				lpPal->palPalEntry[i].peRed = 
					lpbmc->bmciColors[i].rgbtRed;
				lpPal->palPalEntry[i].peGreen = 
					lpbmc->bmciColors[i].rgbtGreen;
				lpPal->palPalEntry[i].peBlue = 
					lpbmc->bmciColors[i].rgbtBlue;
				lpPal->palPalEntry[i].peFlags = 0;
			}
		}

		// 創建調色板并得到句柄 
		bResult = pPal->CreatePalette(lpPal);
		::GlobalUnlock((HGLOBAL) hLogPal);
		::GlobalFree((HGLOBAL) hLogPal);
	}

	::GlobalUnlock((HGLOBAL) hDIB);

	return bResult;
}

LPSTR  FindDIBBits(LPSTR lpbi)
{
	return (lpbi + *(LPDWORD)lpbi + ::PaletteSize(lpbi));
}

DWORD  DIBWidth(LPSTR lpDIB)
{
	LPBITMAPINFOHEADER lpbmi;  // 指向Win 3.0 DIB
	LPBITMAPCOREHEADER lpbmc;  // 指向其它格式 DIB

	lpbmi = (LPBITMAPINFOHEADER)lpDIB;
	lpbmc = (LPBITMAPCOREHEADER)lpDIB;

	// 如果為Win 3.0 DIB,則返回其寬度 
	if (IS_WIN30_DIB(lpDIB))
	{
		return lpbmi->biWidth;
	}
	else // 如果為其它格式的DIB, 也返回其寬度
	{ 
		return (DWORD)lpbmc->bcWidth;
	}
}

DWORD  DIBHeight(LPSTR lpDIB)
{
	LPBITMAPINFOHEADER lpbmi;  // 指向Win 3.0格式的DIB
	LPBITMAPCOREHEADER lpbmc;  // 指向其它格式的DIB

	lpbmi = (LPBITMAPINFOHEADER)lpDIB;
	lpbmc = (LPBITMAPCOREHEADER)lpDIB;

	// 如果為Win 3.0 DIB,則返回其高度
	if (IS_WIN30_DIB(lpDIB))
	{
		return lpbmi->biHeight;
	}
	else // i如果為其它格式DIB, 也返回其高度
	{ 
		return (DWORD)lpbmc->bcHeight;
	}
}

WORD  PaletteSize(LPSTR lpbi)
{
   //計算必須的尺寸
   if (IS_WIN30_DIB (lpbi))
	  return (WORD)(::DIBNumColors(lpbi) * sizeof(RGBQUAD));
   else
	  return (WORD)(::DIBNumColors(lpbi) * sizeof(RGBTRIPLE));
}

WORD  DIBNumColors(LPSTR lpbi)
{
	WORD wBitCount;  // DIB bit count

	//如果為Windows格式的DIB,顏色數少于像素位數.
	 //  如果是這種情況,返回合適的值 。
	 
	if (IS_WIN30_DIB(lpbi))
	{
		DWORD dwClrUsed;

		dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
		if (dwClrUsed != 0)
			return (WORD)dwClrUsed;
	}

	// 計算基于像素的顏色數 
	if (IS_WIN30_DIB(lpbi))
		wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
	else
		wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;

	// 返回基于像素的顏色數
	if(wBitCount == 1 || wBitCount == 4 || wBitCount == 4)
		return 2^wBitCount;//返回的是2的倍數
	else
		return 0;
}

HGLOBAL  CopyHandle (HGLOBAL h)
{
	if (h == NULL)
		return NULL;

	DWORD dwLen = ::GlobalSize((HGLOBAL) h);
	HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen);

	if (hCopy != NULL)
	{
		void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
		void* lp     = ::GlobalLock((HGLOBAL) h);
		memcpy(lpCopy, lp, dwLen);
		::GlobalUnlock(hCopy);
		::GlobalUnlock(h);
	}

	return hCopy;
}

BOOL  SaveDIB(HDIB hDib, CFile& file)
{
	BITMAPFILEHEADER bmfHdr; // 文件頭
	LPBITMAPINFOHEADER lpBI;   // 指向DIB信息結構的指針
	DWORD dwDIBSize;

	if (hDib == NULL)
		return FALSE;

	//得到指向DIB內存的指針, 包括一個BITMAPINFO結構
	
	lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
	if (lpBI == NULL)
		return FALSE;

	if (!IS_WIN30_DIB(lpBI))
	{
		::GlobalUnlock((HGLOBAL) hDib);
		return FALSE;       // 其它格式的DIB不支持 
	}

	// 填寫文件頭區域
	 
	// 填寫文件類型 
	bmfHdr.bfType = DIB_HEADER_MARKER;  // "BM"

	// 計算DIB的大小。最簡單的方法是調用GlobalSize()函數
	// 一般手工計算。
	// 先計算頭和顏色表之和
	dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI); 

	// 計算圖像大小

	if ((lpBI->biCompression == BI_RLE8)
		|| (lpBI->biCompression == BI_RLE4))
	{
		// 為RLE位圖, 不能計算尺寸。 

		dwDIBSize += lpBI->biSizeImage;
	}
	else
	{
		DWORD dwBmBitsSize;  // 位圖位的大小
		// 非RLE, 大小為 寬度*高度

		dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*
			((DWORD)lpBI->biBitCount)) * lpBI->biHeight;

		dwDIBSize += dwBmBitsSize;

		lpBI->biSizeImage = dwBmBitsSize;
	}


	// 計算文件大小

	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;

	// 計算真實的位圖位的偏移量,其等于文件頭+DIB頭+顏色表尺寸
	 
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
		lpBI->biSize + PaletteSize((LPSTR)lpBI);
	TRY
	{
		// 寫文件頭
		file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
	
		// 寫DIB頭內容和大小
	
		file.WriteHuge(lpBI, dwDIBSize);
	}
	CATCH (CFileException, e)
	{
		::GlobalUnlock((HGLOBAL) hDib);
		THROW_LAST();
	}
	END_CATCH

	::GlobalUnlock((HGLOBAL) hDib);
	return TRUE;
}

HDIB  ReadDIBFile(CFile& file)
{
	BITMAPFILEHEADER bmfHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR pDIB;

	// 取得DIB的長度
	 
	dwBitsSize = file.GetLength();

	// 讀DIB文件頭,檢查是否有效。
	
	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return NULL;

	if (bmfHeader.bfType != DIB_HEADER_MARKER)
		return NULL;

	//為DIB分配內存
	
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
	if (hDIB == 0)
	{
		return NULL;
	}
	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	// 讀位數
	
	if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
		dwBitsSize - sizeof(BITMAPFILEHEADER) )
	{
		::GlobalUnlock((HGLOBAL) hDIB);
		::GlobalFree((HGLOBAL) hDIB);
		return NULL;
	}
	::GlobalUnlock((HGLOBAL) hDIB);
	return hDIB;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男男成人高潮片免费网站| 亚洲欧洲日韩在线| 不卡免费追剧大全电视剧网站| 亚洲gay无套男同| 又紧又大又爽精品一区二区| 国产精品成人在线观看| 国产欧美一区二区精品忘忧草| 亚洲精品一区在线观看| 欧美一区二区久久| 欧美不卡在线视频| 久久久www成人免费毛片麻豆 | 精品伦理精品一区| 亚洲精品成人悠悠色影视| 国产综合久久久久影院| 国产精品99久| 91香蕉视频在线| 欧美色倩网站大全免费| 欧美性三三影院| 91精品欧美综合在线观看最新| 日韩欧美一区二区免费| 国产精品美女久久久久久久| 亚洲欧洲综合另类| 亚洲va韩国va欧美va| 色综合天天综合网天天狠天天| 欧美日韩一区三区| 亚洲精品日韩综合观看成人91| 亚洲v中文字幕| 亚洲国产欧美在线| 成人欧美一区二区三区黑人麻豆 | 9191成人精品久久| 国内精品国产成人| 夜夜嗨av一区二区三区网页| 日韩一区日韩二区| 国产一区二区免费看| 五月激情综合婷婷| 亚洲丰满少妇videoshd| 夜夜精品浪潮av一区二区三区| 亚洲欧洲综合另类| 国产一区二区三区在线观看免费视频| 午夜欧美大尺度福利影院在线看| 精品成人一区二区三区| 成人午夜视频在线| 懂色av中文字幕一区二区三区| 韩国v欧美v日本v亚洲v| 欧美一区三区四区| 日韩av不卡在线观看| 国产麻豆9l精品三级站| 精品成a人在线观看| 蜜桃av一区二区三区| 99国产精品久久| 欧美一区二区三区免费| 久久99九九99精品| 日本韩国一区二区三区| 日韩欧美久久一区| 国产乱人伦精品一区二区在线观看| 久久这里只有精品6| 亚洲自拍偷拍网站| 成人一区二区视频| 18欧美亚洲精品| 精品视频资源站| 精品在线观看视频| 国产精品蜜臀在线观看| 欧美午夜一区二区| 美女视频免费一区| 国产精品久久综合| 在线电影一区二区三区| 一区二区三区波多野结衣在线观看| 欧美伊人久久久久久午夜久久久久| 午夜久久久久久电影| 精品成a人在线观看| 91在线观看下载| 亚洲第一av色| 亚洲国产高清在线观看视频| 香蕉av福利精品导航| 欧美电视剧免费全集观看| 不卡视频在线看| 午夜精品久久久久久久| 国产日韩欧美一区二区三区乱码 | 在线观看日韩毛片| 国产精品麻豆网站| 5566中文字幕一区二区电影| 国产激情偷乱视频一区二区三区| 亚洲精品一区二区在线观看| 91蜜桃网址入口| 国内精品国产三级国产a久久| 一片黄亚洲嫩模| 久久久国产精品麻豆| 欧美猛男gaygay网站| 亚洲精品日韩专区silk| 久久久精品tv| 欧美大片在线观看| 欧美猛男男办公室激情| 99riav一区二区三区| 国产综合色在线| 免费精品99久久国产综合精品| √…a在线天堂一区| 久久久久久亚洲综合影院红桃 | 国产精品资源网站| 日韩av二区在线播放| 亚洲综合自拍偷拍| 国产精品久久久久久久裸模 | 国产精品久久久久久久久久免费看 | 亚洲成人免费看| 亚洲欧美另类久久久精品| 国产日韩成人精品| 亚洲精品一区二区三区影院| 欧美一区日本一区韩国一区| 欧美日韩一卡二卡三卡| 欧美在线免费观看视频| 99re成人精品视频| 99re热视频这里只精品| 波多野结衣精品在线| 亚洲国产精品自拍| 一区二区三区丝袜| 有坂深雪av一区二区精品| 成人欧美一区二区三区| 国产精品久久久久久一区二区三区 | 蜜桃视频一区二区| 日韩av一级电影| 日本va欧美va精品| 久久99久久精品| 国产成人精品免费视频网站| 国产成人精品www牛牛影视| 国产不卡高清在线观看视频| 国产精品自产自拍| 波波电影院一区二区三区| av福利精品导航| 91一区二区在线观看| 欧美中文字幕亚洲一区二区va在线| 91福利视频网站| 欧美日韩国产在线播放网站| 91蝌蚪porny九色| 日韩女优电影在线观看| 亚洲精品国产无天堂网2021| 国产在线不卡视频| 色香蕉久久蜜桃| 国产精品久久久久久福利一牛影视 | 色94色欧美sute亚洲线路一久 | 日韩精品一区二区三区蜜臀| 91精品国产91综合久久蜜臀| 日韩午夜av电影| 国产精品影音先锋| 成人天堂资源www在线| 成人精品国产福利| 日本国产一区二区| 欧美精品第一页| 精品国产免费久久| 中文字幕的久久| 亚洲综合小说图片| 日韩福利视频导航| 国产盗摄一区二区| 色婷婷久久综合| 日韩一级大片在线观看| 欧美极品aⅴ影院| 亚洲自拍偷拍网站| 麻豆成人免费电影| 99在线精品观看| 666欧美在线视频| 中文字幕欧美三区| 午夜精品福利在线| 国产成人精品三级| 欧美中文字幕一区二区三区亚洲 | 国产美女主播视频一区| 色综合天天性综合| 日韩欧美久久久| 亚洲欧美另类图片小说| 另类的小说在线视频另类成人小视频在线| 亚洲男人的天堂在线aⅴ视频| 亚洲一区二区视频| 国产成人精品亚洲日本在线桃色| 在线观看国产一区二区| 2022国产精品视频| 一区二区三区自拍| 高清成人在线观看| 欧美一区国产二区| 一区二区三区不卡视频| 高清国产一区二区| 精品国精品国产尤物美女| 亚洲精品伦理在线| 国产91对白在线观看九色| 欧美一级黄色录像| 亚洲国产精品一区二区久久| 成人天堂资源www在线| 精品福利一区二区三区免费视频| 亚洲一区在线观看视频| 成人美女视频在线观看18| 欧美成人三级在线| 日韩精品成人一区二区三区| 久久国产精品一区二区| 色999日韩国产欧美一区二区| 国产欧美精品一区二区色综合 | 亚洲精品中文字幕乱码三区| 国产一区亚洲一区| 日韩精品一区二| 亚洲第一在线综合网站| 日本韩国欧美在线| 最新高清无码专区| 视频一区二区国产| 欧美日韩亚洲综合一区二区三区 | 国产性做久久久久久|