P. 1
lap-trinh-c-tren-windows-1206341098985665-3

lap-trinh-c-tren-windows-1206341098985665-3

|Views: 43|Likes:
Published by duc152
goood
goood

More info:

Published by: duc152 on May 28, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/02/2012

pdf

text

original

Có hai cách n p nh bitmap :

N p t bitmap resource trong chương trình :

HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);

i s u tiên hInstance là handle th hi n c a module ch a bitmap resource, có th là
NULL n u bitmap mu n n p là m t bitmap h th ng. ó là các bitmap nh s d ng cho các
thành ph n giao di n chương trình như close box và các d u check, các nh danh b t u v i
ti p u ng OBM. i s th hai có th s d ng macro MAKEINTRESOURCE n u bitmap k t
h p v i m t nh danh ki u nguyên, ho c là chu i tên bitmap resource. Sau khi s d ng, dùng
hàm DeleteObject gi i phóng handle ang tham chi u n bitmap ó.

Ví d : N p bitmap resource, có s d ng MDC tránh gây ch p màn hình.

// L y v kích thư c vùng client c a c a s

RECT rect;

GetClientRect(hWnd, &rect);

// L y v handle device context c a c a s

HDC hdc;

hdc = GetDC(hWnd);

//T o MDC tương thích v i hDC c a c a s

HDC hMemDC;

hMemDC = CreateCompatibleDC(hdc);

HBITMAP hNewBmp,hOldBmp;

// N p bitmap resource có ID là IDB_CUB

hNewBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CUB));

if(hNewBmp)

{

//Gán bitmap m i cho MDC

hOldBmp = (HBITMAP)SelectObject(hMemDC,hNewBmp);

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 165

//Copy bitmap t MDC sang DC

BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);

}

//Ph c h i l i bitmap cũ cho MDC

SelectObject(hMemDC, hOldBmp);

//Gi i phóng bitmap v a t o và MDC, hdc

DeleteObject(hNewBmp);

DeleteDC(hMemDC);

ReleaseDC(hdc);

N p t file bitmap c a Windows(*.bmp) :

* B ng màu(Color Palette):

B ng màu trong Windows GDI là m t khái ni m gi ng như b ng màu th t s c a h a sĩ,
nó g m các ô màu(palette entry) v i thông tin c th v m t s c .

qu n lý vi c th hi n màu trên các c a s , Windows s d ng các b ng màu. Thông
thư ng các c a s dùng b ng màu h th ng th hi n thông tin. Tuy nhiên, trong nhi u trư ng
h p b ng màu h th ng không phù h p v i nhu c u, khi ó ta c n thay m t s màu trong b ng
màu h th ng b ng các màu phù h p hơn.

Trong th c t , Windows cho phép m i c a s dùng m t b ng màu khác nhau v i i u
ki n s lư ng màu trong b ng màu ó không ư c vư t quá s màu t i a cho phép c a thi t b
hi n th . Khi m t c a s nh n s quan tâm (focus), Windows s th hi n d li u trong c a s ó
v i s màu t i a cho phép c a b ng màu tương ng, nh ng màu còn l i trong palette s ư c
th hi n b ng nh ng màu g n gi ng nh t. i v i nh ng c a s không active, d li u s ư c
th hi n b ng nh ng màu g n gi ng nh t trong b ng màu h th ng.

Hình 6.2 Cách th hi n màu s d ng palette.

Ví d v cách th hi n màu s d ng palette:

o B ng màu h th ng có 12 giá tr màu.

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 166

o B ng màu 1 dùng cho c a s 1. C a s 1 ang active nên các màu c a b ng màu 1
ư c ánh x tr c ti p vào b ng màu h th ng.

o B ng màu 2 dùng cho c a s 2. C a s 2 không active nên các màu 0,2,4,5,6 ư c ánh
x vào các v trí còn tr ng trên b ng màu h th ng; các màu còn l i ư c ánh x vào nh ng màu
g n gi ng nh t c a b ng màu h th ng.

* C u trúc file bitmap :

File bitmap g m 2 ph n: ph n header và ph n d li u nh.

Hình 6.3 C u trúc file bitmap.

o C u trúc BITMAPFILEHEADER

Tên trư ng

Kích thư c

Ý nghĩa

bfType

2 bytes(WORD)

Lo i file(=BM)

bfSize

4 bytes(DWORD)

Kích thư c file(bytes)

bfReserved1 2 bytes(WORD)

Không dùng(=0)

bfReserved2 2 bytes(WORD)

Không dùng(=0)

bfOffBits

4 bytes(DWORD)

Kích thư c c a ph n
BitmapHeader (byte)

o C u trúc BITMAPINFO

Tên trư ng

Ki u

Ý nghĩa

bmiHeader BITMAPINFOHEADER Các thông s nh bitmap

bmiColors

RGBQUAD*

B ng màu c a nh.

o C u trúc BITMAPINFOHEADER

Tên trư ng

Ki u

Ý nghĩa

biSize

DWORD

Kích thư c ph n BITMAPINFO(=40 bytes)

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 167

biWidth

LONG

Chi u r ng bitmap(theo ơn v pixel)

biHeight

LONG

Chi u cao bitmap(theo ơn v pixel)

biPlanes

WORD

S plane. Luôn = 1.

biBitCount

WORD

S bit dùng lưu giá tr 1 i m nh.

= 1: nh tr ng en

= 4: nh 16 màu

= 8: nh 256 màu

=16: nh 16 bits

=24: nh 24 bits

Giá tr này cho bi t s màu có trong b ng màu
bmiColors.

biCompression DWORD

Hình th c nén c a d li u nh:

- BI_RGB: nh không nén

- BI_RLE8: nén theo hình th c RLE cho nh 8
bits/pixel

- BI_RLE4: nén theo hình th c RLE cho nh 4
bits/pixel

biSizeImage

DWORD

Kích thư c c a nh( ơn v byte). Trư ng h p
biCompression=BI_RGB thì giá tr này có th = 0.

biXPelsPerMeter

LONG

phân gi i (DPI/m) theo phương ngang. Dùng trong
trư ng h p nh quét t scanner.

biYPelsPerMeter

LONG

phân gi i (DPI/m) theo phương d c. Dùng trong
trư ng h p nh quét t scanner.

biClrUsed

DWORD

S màu th c s ư c dùng. N u = 0 thì có nghĩa là
dùng t t c màu trong b ng màu.

biClrImportant DWORD S lư ng màu quan tr ng dùng trong vi c hi n th nh.
N u = 0 htì dùng t t c màu trong b ng màu.

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 168

o C u trúc RGBQUAD

bmiColors là m t m ng ki u RGBQUAD, ch a các giá tr màu dùng cho nh, ây chính
là b ng màu c a nh. S lư ng ph n t c a bmiColors b ng s màu c a nh. bmiColors ch dùng
cho nh en tr ng, 16 màu và 256 màu; khi ó ph n d li u nh cho m i pixel ch là các index
n 1 v trí trong b ng màu này. i v i nh 16 bits và 24 bits màu, giá tr bmiColors=NULL,
b ng màu không ư c s d ng n a. Trong trư ng h p này, n u nh là 16 bits thì m i pixel s
ư c bi u di n b ng 1 WORD trong ph n d li u nh, 5 bits th p nh t s lưu giá tr màu Blue, 5
bits k s lưu giá tr màu Green, và 5 bits sau cùng lưu giá tr màu Red, bit cao nh t không ư c
s d ng (Lý do là nh dùng 16 bits bi u di n RGB, ta chia u cho 3 s c nên m i s c
R, G, B s có 5 bits bi u di n và dư ra 1 bit). nh 24 bits thì dùng 3 bytes bi u di n cho 3
s c RGB cho m i pixel trong ph n d li u nh.

Tên trư ng

Ki u

Ý nghĩa

rgbRed

BYTE Giá tr thành ph n RED

rgbGreen

BYTE Giá tr thành ph n GREEN

rgbBlue

BYTE Giá tr thành ph n BLUE

rgbReserved BYTE Không dùng

o C u trúc ph n d li u nh (BITMAPDATA):

Như ã trình bày trên, ph n d li u t p tin bitmap dùng lưu giá tr index c a màu
tương ng v i i m nh trong b ng màu i v i nh có s màu <=256. Các i m nh ư c lưu
tu n t t trái sang ph i theo t ng dòng quét(scanline) theo th t t dư i lên.

i v i nh <=256 màu, bi t giá tr màu (R,G,B) ng v i 1 i m nh (x,y), s d ng

công th c sau:

(R,G,B) c a i m nh i = bmiColors[i]

i v i nh 16 và 24 bits màu, ta không dùng palette và cách bi u di n c a ph n d li u

ã ư c trình bày trên.

Ph n d li u c a file bitmap có th ư c nén theo phương pháp RLE, tài li u này không
trình bày chi ti t vào m i lo i nh nén, n u c n các b n có th tham kh o trong các giáo trình v
x lý nh.

* Cách t o bitmap t file *.bmp:

o c header c a file, l y các thông tin v nh: r ng, cao, b ng màu…

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 169

o c d li u nh và gi i mã(n u c n thi t) vào b nh m.

o T o palette màu t b ng màu l y ư c t file b ng hàm CreatePalette.

o i palette màu cho thi t b xu t, s d ng các hàm SelectPalette, RealizePalette.

o T o l p bitmap handle b ng hàm CreateDIBitmap.

Hình 6.4 Sơ t ng quát quy trình n p nh bitmap

Ví d : N p nh bitmap t file.

void LoadBmp(char *bmpFN, HDC hdc, RECT rect)

{

try

{

int FHandle;

BITMAPFILEHEADER bmpfh;

HANDLE hBmp, hBuff;

BITMAPINFO *BmpInfo;

unsigned char *Buff;

int Count,NumColor;

long n, BytesPerLine;

Count=0;

SetCursor(LoadCursor(NULL, IDC_WAIT));

// M file bitmap c

if ((FHandle=open(bmpFN, O_BINARY|O_RDONLY))==-1)

throw "Cannot open the file.";

// c header file bitmap

read(FHandle, &bmpfh, sizeof(BITMAPFILEHEADER));

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 170

hBmp=GlobalAlloc(LMEM_MOVEABLE, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));

BmpInfo=(BITMAPINFO*)GlobalLock(hBmp);

// c ph n bitmap info và palette màu

read(FHandle, BmpInfo, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));

if (BmpInfo->bmiHeader.biCompression != BI_RGB)

throw "Program don't support compressed bitmap file.";

// Xác nh s màu c a palette

NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount);

if(NumColor>256)

throw "The program supports 256 colors bitmap file only.";

// Xác nh s byte cho 1 scanline

BytesPerLine=(bmpfh.bfSize-bmpfh.bfOffBits)/

BmpInfo->bmiHeader.biHeight;

/* C p nh t thông tin kích thư c nh trên BITMAPINFO (hi n t i = 0 n u nh không nén) */

BmpInfo->bmiHeader.biSizeImage=bmpfh.bfSize-bmpfh.bfOffBits;

// c n i dung file bitmap

hBuff=GlobalAlloc(GMEM_MOVEABLE,

BmpInfo->bmiHeader.biSizeImage);

Buff=(unsigned char *)GlobalLock(hBuff);

If (!Buff) throw "Cannot read the bitmap data.";

// c t ng dòng trên file

do

{

n = read(FHandle,Buff,BytesPerLine);

Buff+=n;

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 171

Count++;

}while (CountbmiHeader.biHeight);

close(FHandle);

GlobalUnlock(hBuff);

GlobalUnlock(hBmp);

SetCursor(LoadCursor(NULL, IDC_ARROW));

/*-----------------T o palette màu cho nh Bitmap---------------------*/

HANDLE hMemPal;

LOGPALETTE far *logPal;

HPALETTE hPal;

int i;

hMemPal=GlobalAlloc(LMEM_MOVEABLE,
sizeof(LOGPALETTE)+NumColor*sizeof(PALETTEENTRY));

logPal=(LOGPALETTE far *)GlobalLock(hMemPal);

// S m c trong Palette

logPal->palNumEntries=NumColor;

logPal->palVersion=0x300;

//Gán các giá tr màu RGB cho nh ng Entry trong Palette

for (i=0;i//Error here

{

logPal->palPalEntry[i].peRed=BmpInfo->bmiColors[i].rgbRed;

logPal->palPalEntry[i].peGreen =

BmpInfo->bmiColors[i].rgbGreen;

logPal->palPalEntry[i].peBlue =

BmpInfo->bmiColors[i].rgbBlue;

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 172

logPal->palPalEntry[i].peFlags = PC_RESERVED;

}

// T o handle cho Palette

hPal=CreatePalette(logPal);

GlobalUnlock(hMemPal);

GlobalFree(hMemPal);

If (!hPal) throw "Cannot create palette.";

/*------------------------Tao handle bmp file ------------------------------*/

SetCursor(LoadCursor(NULL, IDC_WAIT));

// Map palette vào hdc

SelectPalette(hdc,hPal,FALSE);

RealizePalette(hdc);

BmpInfo=(BITMAPINFO *)LocalLock(hBmp);

Buff=(unsigned char *)GlobalLock(hBuff);

//T o bitmap

hBmp=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)BmpInfo, CBM_INIT, Buff, (BITMAPINFO

*)BmpInfo,DIB_RGB_COLORS);

GlobalUnlock(hBuff);

GlobalUnlock(hBmp);

GlobalFree(hBuff);

GlobalFree(hBmp);

SetCursor(LoadCursor(NULL, IDC_ARROW));

if(!hBmp) throw "Cannot create bitmap.";

/*-----------------------Hi n th bitmap lên c a s ---------------------------*/

HDC hMemDC;

NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS

Created pdf by Nam Nguyeãn
Nam Nguyeãn
Nam Nguyeãn

Nam Nguyeãn http://360.yahoo.com/fptnam

____________________________________________________________________________________

Trang 173

HANDLE OldBmp;

// T o MDC

hMemDC=CreateCompatibleDC(hdc);

SelectPalette(hMemDC, hPal, FALSE);

// Tr v palette h th ng

UnrealizeObject(hPal);

// Map l i palette

RealizePalette(hdc);

SelectPalette(hMemDC, hPal, FALSE);

// Liên k t hMemDC v i nh bitmap

OldBmp=SelectObject(hMemDC, hBmp);

// Copy bitmap lên window

BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0,SRCCOPY);

// H y MDC

SelectObject(hMemDC,OldBmp);

DeleteDC(hMemDC);

}

catch(char *e)

{

MessageBox(NULL, e, "Error", MB_OK|MB_ICONERROR);

}

}

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->