當前位置:吉日网官网 - 傳統節日 - 如何用VC的onpaint功能在位圖上畫點和線?就是畫完之後改變位圖。VC中有這樣的函數嗎?送分!

如何用VC的onpaint功能在位圖上畫點和線?就是畫完之後改變位圖。VC中有這樣的函數嗎?送分!

以下代碼轉自MSDN《存儲壹幅圖像》。

//獲取HBITMAP的位圖信息

PBITMAPINFO CreateBitmapInfoStruct(HWND HWND,HBITMAP hBmp)

{

位圖bmp

PBITMAPINFO pbmi

WORD cClrBits

//檢索位圖顏色格式、寬度和高度。

如果(!GetObject(hBmp,sizeof(BITMAP),(LPSTR)& amp;bmp))

errhandler("GetObject ",hwnd);

//將顏色格式轉換為位數。

cClrBits =(WORD)(BMP . BMP planes * BMP . bmbitspixel);

if (cClrBits == 1)

cClrBits = 1;

else if(cClrBits & lt;= 4)

cClrBits = 4;

else if(cClrBits & lt;= 8)

cClrBits = 8;

else if(cClrBits & lt;= 16)

cClrBits = 16;

else if(cClrBits & lt;= 24)

cClrBits = 24

else cClrBits = 32

//為BITMAPINFO結構分配內存。(這個結構

//包含BITMAPINFOHEADER結構和RGBQUAD數組

//數據結構。)

if (cClrBits!= 24)

pbmi =(PBITMAPINFO)local alloc(LPTR,

sizeof(BITMAPINFOHEADER) +

sizeof(RGBQUAD)*(1 & lt;& ltcClrBits));

//沒有適用於每像素24位格式的RGBQUAD數組。

其他

pbmi =(PBITMAPINFO)local alloc(LPTR,

sizeof(BITMAPINFOHEADER));

//初始化BITMAPINFO結構中的字段。

pbmi->;BMI header . bisize = sizeof(BITMAPINFOHEADER);

pbmi->;BMI header . bi width = BMP . BM width;

pbmi->;BMI header . BIH height = BMP . BM height;

pbmi->;BMI header . bi planes = BMP . BM planes;

pbmi->;BMI header . bibitcount = BMP . bmbitspixel;

if(cClrBits & lt;24)

pbmi->;BMI header . biclrused =(1 & lt;& ltcClrBits);

//如果位圖沒有壓縮,設置BI_RGB標誌。

pbmi->;BMI header . BI compression = BI _ RGB;

//計算顏色數組中的字節數

//索引並將結果存儲在biSizeImage中。

//對於Windows NT,寬度必須與DWORD對齊,除非

//位圖是RLE壓縮的。這個例子說明了這壹點。

//對於Windows 95/98/Me,寬度必須是字對齊的,除非

//位圖是RLE壓縮的。

pbmi->;BMI header . bisize image =((pbmi-& gt;BMI header . bi width * cClrBits+31)& amp;~31) /8

* pbmi->;BMI header . BIH height;

//將biClrImportant設置為0,指示所有

//設備顏色很重要。

pbmi->;BMI header . biclr important = 0;

返回pbmi

}

//將HBITMAP保存到文件中

void CreateBMPFile(HWND hwnd,LPTSTR pszFile,PBITMAPINFO pbi,

HBITMAP hBMP,HDC hDC)

{

處理HF;//文件句柄

BITMAPFILEHEADER hdr//位圖文件頭

PBITMAPINFOHEADER pbih//位圖信息頭

LPBYTE lpBits//內存指針

DWORD dwTotal//字節總數

DWORD cb//字節的增量計數

字節* hp//字節指針

DWORD dwTmp

pbih =(PBITMAPINFOHEADER)pbi;

LP bits =(LP byte)global alloc(GMEM _ FIXED,pbih-& gt;bisize image);

如果(!lpBits)

errhandler("GlobalAlloc ",hwnd);

//檢索顏色表(RGBQUAD數組)和位

//(調色板索引數組)。

如果(!GetDIBits(hDC,hBMP,0,(WORD)pbih-& gt;biHeight,lpBits,pbi,

DIB_RGB_COLORS))

{

errhandler("GetDIBits ",hwnd);

}

//創建。BMP文件。

hf = CreateFile(pszFile,

泛型_READ |泛型_WRITE,

(DWORD) 0,

空,

創建_總是,

文件_屬性_正常,

(句柄)NULL);

if (hf ==無效句柄值)

errhandler("CreateFile ",hwnd);

HDR . BF type = 0x4d 42;// 0x42 = "B" 0x4d = "M "

//計算整個文件的大小。

HDR . bfsize =(DWORD)(sizeof(bitmapfile header)+

pbih->;biSize+pbih->;雙色的

* sizeof(RGBQUAD)+pbih-& gt;bisize image);

HDR . bfreserved 1 = 0;

HDR . bfreserved 2 = 0;

//計算顏色索引數組的偏移量。

HDR . bfoff bits =(DWORD)sizeof(bitmapfile header)+

pbih->;biSize+pbih->;雙色的

* sizeof(RGBQUAD);

//將BITMAPFILEHEADER復制到。BMP文件。

如果(!WriteFile(hf,(LPVOID)和amphdr,sizeof(BITMAPFILEHEADER),

(lpd word)& amp;dwTmp,NULL))

{

errhandler("WriteFile ",hwnd);

}

//將BITMAPINFOHEADER和RGBQUAD數組復制到文件中。

如果(!WriteFile(hf,(LPVOID) pbih,sizeof(BITMAPINFOHEADER)

+pbih->;biClrUsed * sizeof (RGBQUAD),

(lpd word)& amp;dwTmp,(空)))

errhandler("WriteFile ",hwnd);

//將顏色索引數組復制到。BMP文件。

dw total = CB = pbih-& gt;biSizeImage

hp = lpBits

如果(!WriteFile(hf,(LPSTR) hp,(int) cb,(lpd word)amp;dwTmp,NULL))

errhandler("WriteFile ",hwnd);

//關閉。BMP文件。

如果(!關閉手柄(高頻))

errhandler("CloseHandle ",hwnd);

//釋放內存。

global free((h global)LP bits);

}

-

更改位圖意味著將位圖加載到設備中,繪制位圖,最後再次保存設備位圖。

LZ想怎麽改位圖?

-

修改位圖補充:

在應用程序的OnPaint中添加以下代碼來繪制位圖。

void cxxxx::OnPaint()

{

CBitmap bmp

如果(bmp。attach((hbit map)::LoadImage(AfxGetApp()-& gt;M _ hinstance,_ t("。\ \ bmptest.bmp "),image _ bitmap,0,0,lr _ Load from file))//從文件中加載位圖。這個要放到程序初始化中,bmp作為成員變量避免重復加載,不過我懶得寫那麽多了。

{

CPaintDC dc(這個);

CDC memDC

memDC。CreateCompatibleDC(& amp;DC);//創建內存DC

CBitmap *pOldbmp = memDC。選擇對象(& ampBMP);//將位圖加載到內存DC

CRect rc

GetClientRect(RC);//獲取客戶區大小。如果需要繪制整個位圖,可以根據需要進行修改。

華盛頓。BitBlt(0,0,rc。寬度(),rc。Height(),& ampmemDC,0,0,SRCCOPY);//在窗口上繪制位圖。

華盛頓。SetPixel(10,10,RGB(0,0,255));//在指定位置畫壹個藍點。

memDC。select object(pol dbmp);//釋放

}

}

在任壹命令中編寫以下操作碼來保存位圖。

void cxxxx::on command xxxx()

{

CClientDC dc(這個);

CRect rcClient

GetClientRect(RC client);//取客戶區大小

CDC memDC

memDC。CreateCompatibleDC(& amp;DC);//創建內存DC

CBitmap bmp

bmp。CreateCompatibleBitmap(& amp;dc,rcClient。Width(),rcClient。height());//創建壹個內存位圖,大小剛好能放下客戶區的內容,在這裏按需修改。

CBitmap *pOldBmp = memDC。選擇對象(& ampBMP);

memDC。BitBlt(0,0,rcClient。Width(),rcClient。Height(),& ampdc,0,0,SRCCOPY);//將窗口內容繪制到內存位圖上。

//在這裏,上面給出的兩個函數用於將位圖保存到壹個文件中。

PBITMAPINFO pbmi = CreateBitmapInfoStruct(GetSafeHwnd(),BMP);//建立位圖信息

CreateBMPFile(GetSafeHwnd(),_T("。\\bmptest.bmp ")、pbmi、bmp、memDC);//將位圖保存到文件中

local free(pbmi);//因為pbmi是創建函數分配的,所以需要調用者釋放。

memDC。select object(pol dbmp);//釋放內存位圖

}

  • 上一篇:心臟外科手術室護士工作總結
  • 下一篇:惠州十大推薦景點
  • copyright 2024吉日网官网