You are on page 1of 7

Ý NGHĨA 1 SỐ HÀM

1. BeginPaint chỉ sử dụng đối với WM_PAINT message. Hàm này chỉ đơn giản là thiết
lập region và Device Context (DC).
2. GetDC :đơn giản là lấy Handle của Device Context từ Handle của Window chỉ định.
3. Biến static là biến mà khi hàm kết thúc nó cũng không bị xoá, tức là khi WndProc được
gọi bao nhiêu lần nó cũng không phải khởi tạo lại giá trị cho biến này
4. hwnd = CreateWindowEx(NULL, // Phần mở rộng, NULL có nghĩa là không có gì
class_name, // Tên của lớp mà chúng ta đã đặt
"http://vcsj.net -- HDC's", //Tiêu đề của cửa sổ
WS_OVERLAPPEDWINDOW, // Kiểu của cửa sổ, xin hãy tham khảo trong MSDN
CW_USEDEFAULT, //Toạ độ x góc trên bên trái
CW_USEDEFAULT, // Toạ độ y góc trên bên trái
WIN_WIDTH, // Chiều rộng của cửa sổ đã định nghĩa bên trên
WIN_HEIGHT, // Chiều cao của cửa sổ đã được định nghĩa bên trên
NULL, // Handle của cửa sổ cha, chúng ta không có cửa sổ cha trong ví dụ này
NULL, // Handle của menu, cũng chưa có
hinstance, // Handle của instance của cửa sổ
NULL); // Thông tin thêm cho WinProc, chúng ta chưa có

if(!hwnd) //Kiểm tra lỗi nếu chúng ta không có handle
return EXIT_FAILURE; //Báo với windows là có lỗi và thoát ra khỏi chương trình
/*Dưới đây là những hàm liên quan đến HDC, bạn chú ý ghi nhớ phần này, đây mới thực
sự là trọng tâm của bài này*/

HDC hdc = GetDC(hwnd);//Đây là một trong những phương pháp lấy handle HDC từ một
cửa sổ có handle la hwnd
if(!hdc) //Kiểm tra xem chúng ta có lấy được không , nếu không thì báo lỗi và kết thúc
chương trình
return EXIT_FAILURE;
//Bây giờ chúng ta hiển thị cửa sổ, giống như bài trước.
ShowWindow(hwnd, ishow);
UpdateWindow(hwnd);
//Chúng ta sẽ thực sự sử dụng HDC ở đây
RECT rect;//Khai báo một biến kiểu RECT( khung hình chữ nhật), để chứa vùng cửa sổ
của chương trình
GetClientRect(hwnd,&rect); // Đây là một hàm lấy khung cửa sổ có handle là hwnd, bạn
hãy ghi nhớ hàm này
/*Nhận về một khung hình chữ nhật màu trắng, vì chúng ta đã khai báo chổi tô màu trắng
cho cửa sổ ở phần trên Chúng ta sẽ thay đổi khung hình chữ nhật đó với màu đen.*/
FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
/*Bạn chú ý cách sử dụng các hàm GDI, các tham số trong các hàm hầu hết bắt đầu là
tham số HDC Hàm FillRect này lấy handle DC tô đầy vào hình chữ nhật rect bằng chổi tô

0.0. LPARAM lparam) { switch(message) { case WM_DESTROY: case WM_CLOSE: PostQuitMessage(0). chỉ có thêm WM_CLOSE. tôi sẽ giải thích rõ ở các bài sau Hai thông điệp này gần giống nhau. return msg.*/ if(PeekMessage(&msg. } return DefWindowProc(hwnd.*/ while(1) { /*Bạn chú ý ta dùng hàm PeekMessage() ở đây.message == WM_QUIT) break. wparam. lparam).*/ LRESULT CALLBACK WinProc(HWND hwnd. DispatchMessage(&msg). hàm này khác hàm GetMessage ở chỗ hàm này không lấy thông điệp trong hàng đợi mà nó lấy tức thì.hinstance). return 0.PM_REMOVE)) { if(msg.Bạn nên chú ý ghi nhớ những cách làm này.*/ UnregisterClass(class_name. màu đen Chúng ta ngừng vẽ ở đây và đợi thông điệp đến.Một thói quen tốt khi bạn viết hàm giải phóng này ngay sau khi viết hàm GetDC() rồi ta viết các hàm vẽ vào giữa.*/ ReleaseDC(hwnd.hdc). } else { } } /*Một điều rất quan trọng mà bạn cần chú ý là khi sử dụng xong HDC bạn phải giải phóng nó ngay để không ảnh hưởng đến tài nguyên của hệ thống. WNDCLASS wndclass.wParam. // biến để định nghĩa một cửa sổ Thuộc tính của cấu trúc WndClass đc mô tả Thuộc tính Ý nghĩa Ghi chú style Kiểu lớp Kết hợp nhiều kiểu giá trị khác nhau bằng toán tử OR . // Giải phóng bộ nhớ cho HDC /*Một điều cũng rất quan trọng là ta phải giải phóng bộ nhớ cho lớp cửa sổ mà chúng ta đã đăng ký ở trên Giải phóng bộ nhớ và kiểm tra lỗi là những việc rất quan trọng. tất nhiên sẽ có sự so sánh. WPARAM wparam. TranslateMessage(&msg). message. } /*Hàm WinProc này không có gì mới so với bài trước.hwnd. UINT message. } 5. // Cuối cùng thoát khỏi chương trình.

lpfnWndProc Con trỏ đến thủ tục window cbClsExtra Số byte được cấp phát thêm Mặc định sau cấu trúc window-class cbWndExtra Số byte được cấp phát thêm Mặc định sau một instance của window hInstance Định danh chứa thủ tục cửa sổ của lớp window hIcon Định danh của biểu tượng Dùng hàm LoadIcon hCursor Dùng hàm LoadCursor Định danh của con trỏ chuột hbrBackground Định danh của chổi tô nền Dùng hàm GetStockObject lpszMenuName Tên thực đơn Tên thực đơn gắn với cửa sổ. // Độ cao ban đầu HWND hWndParent. // Định danh của cửa sổ cha MENU hMenu. Một số trạng thái của tham số nCmdShow: SW_HIDE : Ẩn cửa sổ. • Ý nghĩa của các trường trong cấu trúc MSG hwnd : Định danh của cửa sỗ mà thông điệp phát sinh. // Vị trí ngang ban đầu int y. • SW_MAXIMIZE : Phóng cửa sổ ra toàn bộ màn hình. // Định danh của cửa sổ cần thể hiện int nCmdShow // Trạng thái hiển thị ). ví dụ như thông điệp phát sinh khi bấm nút chuột trái là . Khai báo hàm tạo cửa sổ : HWND CreateWindow( LPCSTR lpClassName. thực dơn này được khai báo trong tập tin tài nguyên. • SW_MINIMIZE : thu nhỏ thành biểu tượng trên màn hình. // Kiểu của cửa sổ int x. Hàm ShowWindow có khai báo như sau: BOOL ShowWindow( HWND hWnd. // Tên lớp cửa sổ đã đăng ký LPCSTR lpwindowName. // Định dang của thực đơn INSTANCE hInstance. // Định danh thể hiện ứng dụng PVOID lpParam // Các tham số ban đầu ). • SW_RESTORE : Hiển thị dưới dạng chuẩn. • message : Định danh của thông điệp. // Độ rộng ban đầu int nHeight. // Tên của cửa sổ DWORD dwStyle. // Vị trí dọc ban đầu int nWidth.

sz : chuỗi kết thúc bởi kí tự 0 h handle p pointer Lpsz con trỏ dài chuỗi ký tự kết thúc kí tự 0 . kiểu dữ liệu nguyên thường được khai báo dạng tiến tố là chữ i. MessageBox Hiển thị một thông điệp. szCmdLine là một biến lưu chuỗi nhập từ dòng lệnh. PostQuitMessage Đưa thông điệp thoát vào hàng đợi thông điệp. CreateWindow Tạo một cửa sổ dựa trên một lớp cửa sổ.WM_LBUTTONDOWN có giá trị 0x0201. DispatchMessage Gởi thông điệp đến hàm xứ lý cửa sổ. trong trường hợp của chương trình thì lấy một chổi tô để tô lại nền của cửa sổ. TranslateMessage Dịch thông điệp bàn phím. EndPaint Kết thúc việc vẽ cửa sổ. GetClientRect Lấy hình chữ nhật lưu vùng làm việc. sz là thể hiện cho biến kiểu chuỗi kết thúc ký tự 0. GetStockObject Nhận một đối tượng đồ họa. • time : Thời gian đặt thông điệp trong hàng đợi.C. UpdateWindow Yêu cầu cửa sổ vẽ lại chính bản thân nó. RegisterClass Đăng ký một lớp cửa sổ cho cửa sổ ứng dụng trong chương trình. GetMesssage Nhận một thông điệp từ hàng đợi thông điệp. Tên hàm Ý nghĩa LoadIcon Nạp một biểu tượng để sử dụng trong chương trình. DrawText Hiển thị một chuỗi văn bản. • lParam : Tham số 32-bit phụ thuộc vào thông điệp. BeginPaint Khởi tạo chức năng vẽ của cửa sổ. LoadCursor Nap một con trỏ chuột cho chương trình. ngoài ra ta hay thấy hInstance và hPrevInstance. DefWindowProc Thực hiện việc xử lý mặc định các thông điệp. ShowWindow Hiển thị cửa sổ lên màn hình. • pt : Tọa độ của chuột khi đặt thông điệp vào hàng đợi • Bảng dưới đây liệt kê ý nghĩa của các hàm được sử dụng trong 2 hàm WinMain và WndProc của chương trình HELLOWORLD. trong đó h viết tắt cho kiểu handle. • wParam : Tham số 32-bit chứa các thông tin phụ thuộc vào từng thông điệp cụ thể.

Đăng ký lớp ATOM RegisterClass (CONST WNDCLASSEX *lpWClass) ATOM --> kiểu WORD *lpWClass --> con trỏ tới cấu trúc cửa sổ --> hàm trả về chỉ số lớp cửa sổ trong danh sách cửa sổ đã đăng ký. . tên lớp cửa sổ. } Định nghĩa lớp (done) --> đăng ký lớp 3. --> các tham số của hàm Main do HDH truyền vào --> default Quy trình hoạt động: Cửu sổ được tạo lập --> WD chờ ứng dụng gửi thông điệp --> thông điệp sau khi xử lý trả lại ứng dụng qua lời gọi hàm --> nhận được thông điệp ứng dụng gọi API và hàm của chúng để thực hiện việc. Đăng ký thất bại : +Trùng tên ứng dụng +Không đủ bộ nhớ. địa chỉ hàm xử lý thông điệp cửa sổ. màu nền. icon. Quy ước đặt tên: . kèm kiểu dữ liệu.//------------. Hàm main Đầu tiên phải có hàm WinMain --> thực hiện đầu tiên(điểm vào của chương trình) --> có 4 tham số + hInst --> chỉ số của chương trình + hPrevinst --> chỉ số của chương trình trước đó có thể đây là danh sách liên kết các ứng dụng để quản lý ??? + lpszCmdLine --> chứa địa chỉ đầu của xâu các đối số dòng lệnh +nCmdShow --> cách thức hiển thị cửa sổ chương trình.tên biến viết thường.Đi vào tạo ứng dụng------------------// 1. định nghĩa hình dạng trỏ chuột. iTong --> biến Tong kiểu int Phân loại lớp: lớp cửa sổ hệ thống --> được định nghĩa bởi hdh lớp cửa sổ do ứng dụng định nghĩa 2.tên hằng viết hoa . kiểu. Định nghĩa lớp Cấu trúc dữ liệu đăng ký lớp với cửa sổ typedef struc WNDCLASSEX{ kích thước.

bởi 2 hàm: TranslateMessage DispatchMessage: phân phối thông điệp đến hàm xử lý tương ứng. MB_ICONINFORMATION | MB_OK).4. DWORD dwStyle. vẽ lại cửa sổ UpdateWindow() 7. LRESULT CALLBACK WndProc(HWND hwnd. break. LPARAM lParam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd). HWND . break. tham số này nhận giá trị lần đầu từ hàm winmain 6. HWND hParent. msg. wParam.int nShow) hwnd --> chỉ số cửa sổ cần hiển thị nShow --> cách thức hiển thị cửa sổ. WPARAM wParam. HMENU hMenu. "Mouse Click!". LPVOID lpszAdditional). LPCSTR lpWinName. 5.1 kiểu dữ liệu nào đó HWND CreateWindow ( LPCSTR lpClassName. int X. } Sửa lại LRESULT CALLBACK WndProc(HWND hwnd. HINSTANCE hInst. . tạo cửa sổ làm việc. UINT msg. Gọi ShowWindow() để hiển thị cửa sổ BOOL ShowWindow(HWND hwnd. WPARAM wParam. default: return DefWindowProc(hwnd. UINT msg. } return 0. lParam). int Height. Vòng lặp thông điệp --> Window liên tục nhận sự kiện và dịch nó để đưa vào hàng đợi xử lý. "Left button click!". case WM_DESTROY: PostQuitMessage(0). int Y. int Width. LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: MessageBox(NULL.

Hàm API GetModuleHandle() với tham số là NULL thì kết quả trả về sẽ là handle trỏ tới file được sử dụng để tạo ra tiến trình đã gọi hàm. break. MB_ICONINFORMATION | MB_OK). GetModuleFileName(hInstance. MessageBox(hwnd.h định nghĩa độ dài tối đa của một xâu để chứa độ dài đường dẫn tới một file trên windows. } break. Và do đó chúng ta có câu lệnh: HINSTANCE hInstance = GetModuleHandle(NULL). "Mouse Click!". szFileName. HINSTANCE hInstance = GetModuleHandle("firefox"). } Tại sao sai? MAX_PATH là một macro (kiểu như hằng define) thuộc windows. Hàm API GetModuleFileName() trả về đường dẫn tới chương trình tham chiếu bởi tham số thứ nhất khi gọi hàm. case WM_RBUTTONDOWN: { char szFileName[MAX_PATH]. break. wParam. đường dẫn đó được chứa ở tham số thứ hai (một xâu). } return 0. szFileName. "This program is:". MAX_PATH). case WM_MBUTTONDOWN: MessageBox(NULL. . break. msg. break. MB_OK | MB_ICONINFORMATION). lParam). default: return DefWindowProc(hwnd. case WM_CLOSE: DestroyWindow(hwnd). case WM_DESTROY: PostQuitMessage(0). "Middle button click!". đó chính xác là cái mà chúng ta cần để gọi hàm GetModuleFileName().