You are on page 1of 4

Chng 2

Bi 4 Device context Trong bi ny ti s gii thiu vi cc bn v Device context(vit tt l DC). Trc ht trong phm vi ca nhng bi tutorials ny ti s gii thiu v GDI (graphics device interface).Trong windows GDI cung cp cho bn nhng hm v ra vng ca s.DC c sch dch l thit b ng cnh nhng theo ti c l DC, chc cc bn s d nh hn.DC l mt cu trc d liu c duy tr bi GDI, n kt hp vi thit b c th nh mn hnh hay my in. Bi Minh Trng kosen01

Ni nh vy rt rc ri cho bn mi hc v th ti xin ni vn tt nh th ny, bn cn c mt handle ca DC v, v vy trc khi v bn phi ly c handle , trong windows handle c vit l HDC (handle to a device context). By gi chng ta s bt tay vo xy dng mt v d c th, nh vy s d hiu hn phi khng? Bn c th s dng ngay chng trnh helloworld m chng ta vit bi trc, ch thm vi dng m lnh.Bn ch l chng ta c th v bt c u , bt c lc no, v th nhng dng m lnh sp thm vo bn c th trong hm WinProc hoc trong WinMain v handle ca ca s trong tnh hung ny l nh nhau.Ti s nhng dng m lnh mi trong hm winmain. //filename: hdc.cpp #include <windows.h> #define WIN_WIDTH 320 //chiu rng ca ca s n v o pixels(im nh) #define WIN_HEIGHT 240 //chiu cao ca ca s n v o pixels(im nh) #define class_name "vcsj_HDC" // Tng t nh bi trc, ta phi c hm WinProc LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow) { HWND hwnd; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WinProc; wndclassex.hInstance = hinstance;

wndclassex.lpszClassName = class_name; wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); RegisterClassEx(&wndclassex); /*Di y l mt hm to ca s mi so vi bi trc.Bn c th dng hm CreateWindow nh bi trc, Hm ny nhiu hn hm trc hai tham s, l tham s u tin, n l kiu m rng ca ca s v tham s cui cng l thng tin thm gi cho WinProc.Hm ny hin nay c dng nhiu hn.Trong v d ny phn m rng chng ta cha xt n m hy NULL.*/ hwnd = CreateWindowEx(NULL, // Phn m rng, NULL c ngha l khng c g class_name, // Tn ca lp m chng ta t "http://vcsj.net -- HDC's", //Tiu ca ca s WS_OVERLAPPEDWINDOW, // Kiu ca ca s, xin hy tham kho trong MSDN CW_USEDEFAULT, //To x gc trn bn tri CW_USEDEFAULT, // To y gc trn bn tri WIN_WIDTH, // Chiu rng ca ca s nh ngha bn trn WIN_HEIGHT, // Chiu cao ca ca s c nh ngha bn trn NULL, // Handle ca ca s cha, chng ta khng c ca s cha trong v d ny NULL, // Handle ca menu, cng cha c hinstance, // Handle ca instance ca ca s NULL); // Thng tin thm cho WinProc, chng ta cha c if(!hwnd) //Kim tra li nu chng ta khng c handle return EXIT_FAILURE; //Bo vi windows l c li v thot ra khi chng trnh /*Di y l nhng hm lin quan n HDC, bn ch ghi nh phn ny, y mi thc s l trng tm ca bi ny*/ HDC hdc = GetDC(hwnd);//y l mt trong nhng phng php ly handle HDC t mt ca s c handle la hwnd if(!hdc) //Kim tra xem chng ta c ly c khng , nu khng th bo li v kt thc chng trnh return EXIT_FAILURE; //By gi chng ta hin th ca s, ging nh bi trc. ShowWindow(hwnd, ishow); UpdateWindow(hwnd); //Chng ta s thc s s dng HDC y RECT rect;//Khai bo mt bin kiu RECT( khung hnh ch nht), cha vng ca s ca chng trnh GetClientRect(hwnd,&rect); // y l mt hm ly khung ca s c handle l hwnd, bn hy ghi nh hm ny /*Nhn v mt khung hnh ch nht mu trng, v chng ta khai bo chi t mu trng cho ca s phn trn Chng ta s thay i khung hnh ch nht vi mu en.*/

FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH)); /*Bn ch cch s dng cc hm GDI, cc tham s trong cc hm hu ht bt u l tham s HDC Hm FillRect ny ly handle DC t y vo hnh ch nht rect bng chi t mu en Chng ta ngng v y v i thng ip n.*/ while(1) { /*Bn ch ta dng hm PeekMessage() y, hm ny khc hm GetMessage ch hm ny khng ly thng ip trong hng i m n ly tc th.*/ if(PeekMessage(&msg,hwnd,0,0,PM_REMOVE)) { if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { } } /*Mt iu rt quan trng m bn cn ch l khi s dng xong HDC bn phi gii phng n ngay khng nh hng n ti nguyn ca h thng.Mt thi quen tt khi bn vit hm gii phng ny ngay sau khi vit hm GetDC() ri ta vit cc hm v vo gia.*/ ReleaseDC(hwnd,hdc); // Gii phng b nh cho HDC /*Mt iu cng rt quan trng l ta phi gii phng b nh cho lp ca s m chng ta ng k trn Gii phng b nh v kim tra li l nhng vic rt quan trng.Bn nn ch ghi nh nhng cch lm ny.*/ UnregisterClass(class_name,hinstance); return msg.wParam; // Cui cng thot khi chng trnh. } /*Hm WinProc ny khng c g mi so vi bi trc, ch c thm WM_CLOSE, ti s gii thch r cc bi sau Hai thng ip ny gn ging nhau, tt nhin s c s so snh.*/ LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(message) { case WM_DESTROY: case WM_CLOSE: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wparam, lparam); } Nh vy bn bit cch ly handle Device context , bn c th ly ton b cc hm GetDC(), GetClientRect(),FillRect() ReleaseDC(), v a xung WM_PAINT, ta cng c kt qu tng t.Bn cng c th a vo WM_CREATE ta cng c mt nn mu en.By gi bn hy x dng cc hm GDI v nhng hnh bn mun hoc

bn cng c th vit dng ch "Hello World" ra mn hnh m khng phi l trn mt MessageBox na, l bi tp cho bn. Tip theo ti xin gii thiu mt cch ly handle Device context khc, bn c th dng ngay m ngun trn v sa li nh sau. Trc ht trong hm WinMain bn xo tt c cc hm lin quan n HDC: dng c lnh GetDC(), 2 dng khai bo v ly khung hnh ch nht :RECT rect,v GetClientRect(), bn xo c dng FillRect() v cui cng xo dng ReleaseDC(). Trong hm WinProc bn thm ba dng ny vo phn u ca hm: PAINTSTRUCT paintStruct; HDC hdc; RECT rect; Bn cng thm c thng ip WM_PAINT vo v trong thng ip WM_PAINT ta vit cc lnh nh sau: case WM_PAINT: hdc=BeginPaint(hwnd,&paintStruct); GetClientRect(hwnd,&rect); FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH)); EndPaint(hwnd,&paintStruct); DeleteDC(hdc); break; y l mt phng php khc, phng php ny thng dng khi bn v trong thng ip WM_PAINT, bn s s dng cc hm GDI gia hai dng lnh BeginPaint() v EndPaint().M ngun ca chng trnh ny nm trong file hdc2.cpp Chng ta tm thi dng ni v HDC ti y, hi vng bn nm bt c cch lm v hy t lm mt s v d quen vi nhng hm ca GDI.

You might also like