Bài giảng Lập trình C trên Windows - Nguyễn Đạt Thông
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C trên Windows - Nguyễn Đạt Thông", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_c_tren_windows_nguyen_dat_thong.pdf
Nội dung text: Bài giảng Lập trình C trên Windows - Nguyễn Đạt Thông
- Lập trình C trên Windows Nguyễn Đạt Thông www.ndthong.info
- Gi ới thi ệu ■ Lập trình C trên Windows ■ Nội dung ■ Lý thuy ết: 45 ti ết ■ Th ực hành: 30 ti ết ■ Môn học tiên quyết ■ Kỹ thu ật lập trình ■ Cấu trúc dữ li ệu ■ Gi ảng viên ■ Nguy ễn Đạ t Thông, ndthong@math.hcmus.edu.vn Nguy ễn Đạ t Thông 2 Lập trình C trên Windows - 2013
- Mục tiêu ■ Ki ến thức ■ các kỹ thu ật lập trình trên Windows, ■ các thành ph ần giao di ện (GUI) trên Windows, ■ các th ư vi ện sẵn có của Windows, ■ Kỹ năng ■ xây dựng các ứng dụng giao di ện Windows, ■ xây dựng các ứng dụng tương tác với hệ th ống Windows, Nguy ễn Đạ t Thông 3 Lập trình C trên Windows - 2013
- Yêu cầu ■ Yêu cầu đối với sinh viên ■ Đọ c tr ước tài li ệu bài gi ảng, ■ Tham dự các bu ổi lý thuy ết, bài tập và minh họa, ■ Tự th ực hi ện các bài minh họa, ■ Tự nghiên cứu các kỹ thu ật lập trình cao hơn trên Windows. ■ Ngoài ra, sinh viên cần ■ Tìm hi ểu thêm về các khái ni ệm quan tr ọng của ngôn ng ữ C: con tr ỏ và bộ nh ớ, con tr ỏ hàm, Nguy ễn Đạ t Thông 4 Lập trình C trên Windows - 2013
- Nội dung Windows và Messages Nh ập li ệu (User Inputs) Lập trình C trên Các thành ph ần giao di ện Windows Các ti ện ích trên Windows Các ch ủ đề nâng cao ■ Tham khảo ■ Charles Petzold, Programming Windows , 5 th Ed., Microsoft Press, 1998. Nguy ễn Đạ t Thông 5 Lập trình C trên Windows - 2013
- Tài li ệu tham khảo ■ Tài li ệu chính ■ Charles Petzold, Programming Windows , 5 th Edition, Microsoft Press, 1998. ■ Tham khảo ■ Tr ần Đan Th ư, Lập trình C trên Microsoft Windows , Hà Nội, 1996. ■ Lập trình C trên Windows, Th ư vi ện điện tử khoa học công ngh ệ, Vĩnh Long. ( Link ) Nguy ễn Đạ t Thông 6 Lập trình C trên Windows - 2013
- Đánh giá ■ Quá trình ■ Điểm danh: 10% ■ Thực hành ■ Thi trên máy: 40% ■ Đánh giá ■ Thi tự lu ận: 50% ■ Được sử dụng tài li ệu Nguy ễn Đạ t Thông 7 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 8 Lập trình C trên Windows - 2013
- Ph ần 1 Windows và Mesages Nguyễn Đạt Thông www.ndthong.info
- Nội dung ■ Windows và Messages ■ Ch ương trình Windows ■ Lập trình Windows ■ Windows và Messages ■ Drawing và Device Context ■ Region và Clipping Nguy ễn Đạ t Thông 10 Lập trình C trên Windows - 2013
- Chương trình Windows ■ “Hello World” ■ Tập tin header của Windows ■ Program Entry Point ■ Biên dịch và liên kết ■ Gi ới thi ệu MS Visual Studio 2008 ■ Windows và Unicode Nguy ễn Đạ t Thông 11 Lập trình C trên Windows - 2013
- Chương trình C ■ Chương trình C/C++ – hàm main() #include void main() { printf("hello, world\n"); } #include int main() { printf("hello, world\n"); return 0; } Nguy ễn Đạ t Thông 12 Lập trình C trên Windows - 2013
- Chương trình Windows C ■ Chương trình Windows C – hàm WinMain() #include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, "Hello World!", "HelloMsg", MB_OK); return 0; } ■ windows.h : tập tin header của Windows. Nguy ễn Đạ t Thông 13 Lập trình C trên Windows - 2013
- Tập tin header của Windows ■ Tập tin header của Windows ■ các macro và các bi ến môi tr ường, ■ các ki ểu dữ li ệu và cấu trúc dữ li ệu, ■ các hằng số, ■ prototype của các hàm lập trình Windows. ■ WINDOWS.H là tập tin header cơ bản ■ WINDEF.H : đị nh ngh ĩa các ki ểu dữ li ệu cơ bản. ■ WINNT.H : đị nh ngh ĩa các ki ểu dữ li ệu Unicode. ■ WINBASE.H : các hàm cơ bản của Windows ■ WINUSER.H : các hàm lập trình Windows ■ WINGDI.H : các hàm vẽ giao di ện Nguy ễn Đạ t Thông 14 Lập trình C trên Windows - 2013
- Program Entry Point ■ Hàm WinMain() int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) ■ Trong đó ■ WINAPI – stdcall ■ HINSTANCE – instance handle ■ PSTR – pointer to character string Nguy ễn Đạ t Thông 15 Lập trình C trên Windows - 2013
- Message Box ■ Hàm MessageBox int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); ■ Trong đó ■ HWND – window handle ■ LPCTSTR – long pointer to constant character string ■ Yêu cầu ■ winuser.h (đượ c include trong windows.h ) ■ User32.lib và User32.dll MessageBox: Nguy ễn Đạ t Thông 16 Lập trình C trên Windows - 2013
- Tùy chỉnh Message Box ■ Tham số uType #define MB_OK 0x00000000L #define MB_OKCANCEL 0x00000001L #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_YESNOCANCEL 0x00000003L #define MB_YESNO 0x00000004L #define MB_RETRYCANCEL 0x00000005L #define MB_CANCELTRYCONTINUE 0x00000006L #define MB_ICONHAND 0x00000010L #define MB_ICONQUESTION 0x00000020L #define MB_ICONEXCLAMATION 0x00000030L #define MB_ICONASTERISK 0x00000040L Nguy ễn Đạ t Thông 17 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 18 Lập trình C trên Windows - 2013
- Biên dịch và liên kết ■ Command line ■ Visual Studio projects ■ Tạo solution và project ■ Thêm tập tin mã ngu ồn vào project ■ Biên dịch và liên kết Nguy ễn Đạ t Thông 19 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Tạo solution và project Nguy ễn Đạ t Thông 20 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Tạo solution và project Nguy ễn Đạ t Thông 21 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Tạo solution và project Nguy ễn Đạ t Thông 22 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Thêm tập tin mã nguồn vào project Nguy ễn Đạ t Thông 23 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Biên dịch và liên kết ■ Ch ọn menu “ Build → Build Solution ” ■ Debug chương trình ■ Trong Solution Explorer , ch ọn project “HelloMsg” ■ Ch ọn menu “ Debug → Start Debugging ” ■ Đặt Breakpoint ■ Mở tập tin mã ngu ồn “HelloMsg.c” ■ Ch ọn menu “Debug → Toggle Breakpoint ” Nguy ễn Đạ t Thông 24 Lập trình C trên Windows - 2013
- MS Visual Studio 2008 ■ Debug chương trình “Step-by-Step” ■ Step Over (F10) ■ Step Into (F11) ■ Step Out (Shift + F11) ■ Run to line (Ctrl + F10) ■ Continue (F5) ■ Dừng debug (Shift + F5) Nguy ễn Đạ t Thông 25 Lập trình C trên Windows - 2013
- MessageBox trong Studio ■ Chạy chương trình HelloMsg từ VS2008 ■ Tại sao? Nguy ễn Đạ t Thông 26 Lập trình C trên Windows - 2013
- Windows và Unicode ■ Unicode là mở rộng của mã ASCII ■ Ký tự ASCII được bi ểu di ễn bởi 1 byte dữ li ệu ■ Ký tự Unicode (còn gọi là “wide char”) được bi ểu di ễn bởi 2 byte dữ li ệu. ■ Windows hỗ tr ợ Unicode ■ Lập trình Windows cũng hỗ tr ợ Unicode Nguy ễn Đạ t Thông 27 Lập trình C trên Windows - 2013
- Char và Wide char ■ Ki ểu dữ li ệu char char c = 'A'; char *p = "Hello!"; char a[10]; char a[] = "Hello!"; ■ Ki ểu dữ li ệu wchar_t typedef unsigned short wchar_t; wchar_t c = 'A'; wchar_t *p = L"Hello!"; wchar_t a[] = L"Hello!"; wchar_t c2 = L'A'; Nguy ễn Đạ t Thông 28 Lập trình C trên Windows - 2013
- Hàm xử lý chuỗi ■ Ki ểu dữ li ệu char char *pc = "Hello!"; int iLength = strlen(pc); ■ Ki ểu dữ li ệu wchar_t wchar_t *pw = L"Hello!"; int iLength = wcslen(pw); Nguy ễn Đạ t Thông 29 Lập trình C trên Windows - 2013
- Vi ết code cho Unicode ■ “Define” một macro chung typedef char TCHAR; #define _tcslen strlen #define __T(x) x typedef wchar_t TCHAR; #define _tcslen wcslen #define __T(x) L##x ■ Sử dụng macro TCHAR *p = __T("Hello”); int iLength = _tcslen(p); Nguy ễn Đạ t Thông 30 Lập trình C trên Windows - 2013
- UNICODE ■ Đị nh danh UNICODE #ifdef UNICODE typedef char TCHAR; #define _tcslen strlen #define __T(x) x #else typedef wchar_t TCHAR; #define _tcslen wcslen #define __T(x) L##x #endif #define TEXT(x) __T(x) ■ Đã được khai báo trong WINNT.H Nguy ễn Đạ t Thông 31 Lập trình C trên Windows - 2013
- Visual Studio và UNICODE ■ Mặc đị nh MS Visual Studio khai báo đị nh danh UNICODE Nguy ễn Đạ t Thông 32 Lập trình C trên Windows - 2013
- HelloMsg hỗ trợ UNICODE ■ Mã nguồn của HelloMsg.c #include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT ("Cannot finish operation. Try again?"), TEXT ("Details"), MB_ICONWARNING | MB_CANCELTRYCONTINUE); return 0; } Nguy ễn Đạ t Thông 33 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 34 Lập trình C trên Windows - 2013
- Lập trình Windows ■ Synchronous và Asynchronous ■ Callbacks ■ Lập trình Windows Nguy ễn Đạ t Thông 35 Lập trình C trên Windows - 2013
- Synchronous và Asynchronous ■ Vấn đề ■ 7:00, ăn sáng, sau đó xem tr ước bài gi ảng ■ 8:00, vào lớp học ■ 9:15, gi ải lao ■ 9:30, ti ếp tục học ■ 11:00, kết thúc ■ Synchronous? ■ Asynchronous? Nguy ễn Đạ t Thông 36 Lập trình C trên Windows - 2013
- Synchronous và Asynchronous ■ Synchronous ■ Gọi hàm ■ Ch ờ cho đế n khi hàm th ực hi ện xong ■ Gọi hàm khác ■ Asynchronous ■ Gọi hàm và đă ng ký “số điện tho ại” ■ Gọi hàm khác Nguy ễn Đạ t Thông 37 Lập trình C trên Windows - 2013
- Số điện thoại ■ Đị nh dạng? ■ 10 số? ■ 11 số? ■ Vùng phủ sóng? ■ Vi ệt Nam? ■ Qu ốc tế? Nguy ễn Đạ t Thông 38 Lập trình C trên Windows - 2013
- Don't Call Me, I'll Call You ■ Program gọi một hàm của Windows ■ Di chuy ển window tới tọa độ (200, 200) , ■ Disable nút “Back” và enable nút “Next ”, ■ Tạo th ư mục “test” trong th ư mục gốc “D:\” ■ ■ Windows gọi hàm của Program? ■ Khi nào? Nguy ễn Đạ t Thông 39 Lập trình C trên Windows - 2013
- Windows call you ■ Windows sẽ gọi Program, yêu cầu Program xử lý khi: ■ Ng ười dùng click lên button “ Ok ”, ■ Ng ười dùng ch ọn radio button “ Female ”, ■ Ng ười dùng thu nh ỏ và phóng to window, ■ Ng ười dùng đóng Program, ■ Windows chu ẩn bị shutdown, ■ Nguy ễn Đạ t Thông 40 Lập trình C trên Windows - 2013
- Callbacks ■ Callback là hàm của Program ■ Được đă ng ký tr ước trên Windows, ■ Tuân theo đúng prototype quy ước của Windows ■ Windows sẽ gọi Program thông qua các hàm Callback ■ WndProc() ■ Windows cần gọi Program xử lý, nhưng không có Callback tương ứng? Nguy ễn Đạ t Thông 41 Lập trình C trên Windows - 2013
- Queue ■ Tại mỗi thời điểm, Program chỉ xử lý một yêu cầu. ■ Windows yêu cầu Program xử lý ■ Program đang xử lý một yêu cầu tr ước đó? ■ Program đang th ực hi ện một tính toán riêng? ■ Windows chờ Program? Nguy ễn Đạ t Thông 42 Lập trình C trên Windows - 2013
- Message Queue ■ Yêu cầu của Windows được hi ện thực dưới dạng một “message”. ■ Các yêu cầu (message) của Windows được đặt vào trong “Message Queue” của Program. ■ Program lần lượt xử lý các message trong queue. Nguy ễn Đạ t Thông 43 Lập trình C trên Windows - 2013
- Send và Post ■ Send ■ Windows “send” một message vào “queue” của Program ■ Windows ch ờ cho Program xử lý message ■ Windows ti ếp tục send các message khác ■ Post ■ Windows “post” một message vào “queue” của Program ■ Windows ti ếp tục post các message khác Nguy ễn Đạ t Thông 44 Lập trình C trên Windows - 2013
- Get in and out fast ■ Windows có thể “send” hoặc “post” các message cho Program. ■ Các message sẽ được xử lý tuần tự. ■ Program bị “Not Responding”? ■ Th ời gian xử lý một message ph ải ng ắn. ■ Nếu không th ể ng ắn? Nguy ễn Đạ t Thông 45 Lập trình C trên Windows - 2013
- Cửa sổ window Nguy ễn Đạ t Thông 46 Lập trình C trên Windows - 2013
- Lập trình Windows ■ Hi ển thị window và các child window ■ Program hay Windows? ■ Phát hi ện thao tác của người sử dụng ■ Program hay Windows? ■ Xử lý tương tác của người sử dụng ■ Program hay Windows? Nguy ễn Đạ t Thông 47 Lập trình C trên Windows - 2013
- Lập trình Windows ■ Với mỗi window ■ Vi ết hàm callback để vẽ window ■ Vi ết hàm callback để xử lý các thao tác ■ Đă ng ký các hàm callback này cho Windows ■ Nếu có 100 loại thao tác? ■ Nếu có 1000 window? Nguy ễn Đạ t Thông 48 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 49 Lập trình C trên Windows - 2013
- Windows và Messages ■ “Hello World 2” ■ Làm vi ệc với window ■ Message Loop ■ Window Procedure Nguy ễn Đạ t Thông 50 Lập trình C trên Windows - 2013
- “Hello World 2” ■ Chương trình “Hello World 2” ■ Tạo và vẽ nên một window ■ Vẽ chu ỗi “Hello World” tại vị trí chính gi ữa window ■ Xử lý (handle) một số thao tác cơ bản Nguy ễn Đạ t Thông 51 Lập trình C trên Windows - 2013
- “Hello World 2” – Step-by-Step Bướ c 4 •Tạo một window Bướ c 3 • Hi ển th ị window • Vi ết hàm Bướ c 2 • Xác đị nh các thu ộc tính của window • Đă ng ký một “class” mới Bướ c 1 •Tạo Entry Point •Xử lý các Message Nguy ễn Đạ t Thông 52 Lập trình C trên Windows - 2013
- Bước 1: entry point #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWorld2") ; MSG msg; // step 2: register window class // pre-process messages while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } Nguy ễn Đạ t Thông 53 Lập trình C trên Windows - 2013
- Bước 2: window class WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WinProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (! RegisterClass (&wndclass)) { MessageBox(0, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } Nguy ễn Đạ t Thông 54 Lập trình C trên Windows - 2013
- Bước 3a: WinProc() LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: return 0; case WM_PAINT: // TODO: draw text "Hello World!" return 0; case WM_DESTROY: return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } Nguy ễn Đạ t Thông 55 Lập trình C trên Windows - 2013
- Bước 3b: Vẽ chuỗi LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // case WM_PAINT: // draw text "Hello World!" hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText(hdc, TEXT("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; // } Nguy ễn Đạ t Thông 56 Lập trình C trên Windows - 2013
- Bước 4: tạo window int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // HWND hwnd; hwnd = CreateWindow (szAppName,// window class name TEXT("Hello World 2"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position 600, // initial x size 300, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow (hwnd, iCmdShow); UpdateWindow(hwnd); // } Nguy ễn Đạ t Thông 57 Lập trình C trên Windows - 2013
- “Hello World 2”: Run ■ “Hello World 2” ( source) ■ Chạy chương trình ■ Minimize rồi restore window ■ Thay đổ i kích th ước window Nguy ễn Đạ t Thông 58 Lập trình C trên Windows - 2013
- Code Style ■ Ki ểu dữ li ệu ■ Vi ết hoa tất cả, không “underscope” ■ Nếu là structure hỗ tr ợ Unicode, kết thúc bằng A (ASCII) ho ặc W (Unicode) ■ UINT , WNDCLASSA , MOUSEINPUT , MENUITEMINFOW , ■ Hàm ■ Vi ết hoa các ký tự đầ u, không “underscope” ■ Nếu là hàm hỗ tr ợ Unicode, kết thúc bằng A (ASCII) ho ặc W (Unicode) ■ RegisterClassW , TranslateMessage , Nguy ễn Đạ t Thông 59 Lập trình C trên Windows - 2013
- Code Style ■ Hằng số ■ Vi ết hoa tất cả, có “underscope” ■ Gồm 2 ph ần: nhóm hằng số và tên hằng số ■ WM_PAINT , LB_GETTEXT , WS_OVERLAPPED , BS_RADIOBUTTON , ■ Bi ến ■ Bắt đầ u bằng “prefix” ■ Vi ết hoa các ch ữ đầ u, không kho ảng cách ■ szCmdLine , hPrevInstance , wParam , Nguy ễn Đạ t Thông 60 Lập trình C trên Windows - 2013
- Ti ền tố Ti ền tố Ý ngh ĩa c char – ký tự by byte – số nguyên không âm có độ dài 8 bit n short – số nguyên có độ dài 16 bit i int – số nguyên có độ dài 32 bit x, y int – tọa độ Descartes cx, cy int – tọa độ Descartes (hằng số) b ho ặc f BOOL – cờ, có giá tr ị đúng/sai w WORD – số nguyên không âm có độ dài 16 bit l LONG – số nguyên có độ dài 32 bit dw DWORD – số nguyên không âm có độ dài 32 bit fn Hàm, ph ươ ng th ức sz Chu ỗi ký tự h handle Nguy ễn Đạ t Thông 61 Lập trình C trên Windows - 2013
- Ki ểu dữ li ệu cơ bản Ki ểu dữ li ệu Ýngh ĩa HANDLE Số nguyên 32 – bit, đị nh danh HWND Số nguyên 32 – bit, đị nh danh BYTE Giá tr ị 8 – bit không dấu WORD Số nguyên 16 – bit không dấu DWORD Số nguyên 32 – bit không dấu UINT Số nguyên 32 – bit không dấu LONG Long 32 – bit BOOL Bool LPSTR Con tr ỏ chu ỗi LPCSTR Hằng con tr ỏ chu ỗi WPARAM 32 – bit LPARAM 32 – bit LPVOID Con tr ỏ 32 – bit đế n một ki ểu không xác đị nh Nguy ễn Đạ t Thông 62 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 63 Lập trình C trên Windows - 2013
- Làm vi ệc với window ■ window ■ Tạo – CreateWindow ■ Hi ển th ị – ShowWindow ■ Cập nh ật – UpdateWindow ■ Truy vấn window cha – GetParent ■ Truy vấn kích th ước window – a ■ Di chuy ển – MoveWindow ■ Hủy – DestroyWindow ■ Yêu cầu ■ WINUSER.H ■ User32.lib / User32.dll Nguy ễn Đạ t Thông 64 Lập trình C trên Windows - 2013
- Tạo window ■ CreateWindow / CreateWindowEx HWND WINAPI CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); CreateWindow: CreateWindowEx: Nguy ễn Đạ t Thông 65 Lập trình C trên Windows - 2013
- Hi ển thị window ■ ShowWindow BOOL WINAPI ShowWindow( HWND hWnd, int nCmdShow ); ■ nCmdShow ■ SW_SHOW ■ SW_HIDE ■ SW_MAXIMIZE ■ SW_MINIMIZE ■ SW_RESTORE ShowWindow: Nguy ễn Đạ t Thông 66 Lập trình C trên Windows - 2013
- Cập nhật window ■ UpdateWindow BOOL UpdateWindow( HWND hWnd ); UpdateWindow: ■ InvalidateRect BOOL InvalidateRect( HWND hWnd, const RECT *lpRect, BOOL bErase ); InvalidateRect: Nguy ễn Đạ t Thông 67 Lập trình C trên Windows - 2013
- Truy vấn window cha ■ GetParent HWND WINAPI GetParent( HWND hWnd ); GetParent: ■ GetDesktopWindow HWND WINAPI GetDesktopWindow(void); GetWindowDesktop: Nguy ễn Đạ t Thông 68 Lập trình C trên Windows - 2013
- Truy vấn kích thước window ■ GetWindowRect BOOL WINAPI GetWindowRect( HWND hWnd, LPRECT lpRect ); GetWindowRect: ■ GetClientRect BOOL WINAPI GetClientRect( HWND hWnd, LPRECT lpRect ); GetClientRect: Nguy ễn Đạ t Thông 69 Lập trình C trên Windows - 2013
- Di chuyển window ■ MoveWindow BOOL WINAPI MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint ); ■ (X, Y) là vị trí tương đố i so với window cha. MoveWindow: Nguy ễn Đạ t Thông 70 Lập trình C trên Windows - 2013
- Hủy window ■ DestroyWindow BOOL WINAPI DestroyWindow( HWND hWnd ); DestroyWindow: ■ PostQuitMessage VOID WINAPI PostQuitMessage( int nExitCode ); PostQuitMessage: Nguy ễn Đạ t Thông 71 Lập trình C trên Windows - 2013
- Message Loop ■ Message Loop ■ Vòng lặp xử lý thông điệp (message) ■ Mỗi window sẽ xử lý các message riêng ■ Mỗi window có một message loop riêng Nguy ễn Đạ t Thông 72 Lập trình C trên Windows - 2013
- Messages ■ Message được Windows đị nh nghĩa. ■ Bi ểu di ễn một loại thao tác cần xử lý. ■ Cấu trúc thông điệp typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, * PMSG ; Nguy ễn Đạ t Thông 73 Lập trình C trên Windows - 2013
- Một số message thông dụng ■ WM_CREATE ■ Được gửi khi window cần kh ởi tạo. ■ WM_DESTROY ■ Được gửi khi window cần hủy. ■ WM_PAINT ■ Được gửi khi window cần vẽ lại ■ WM_MOVE ■ Được gửi sau khi window di chuy ển Nguy ễn Đạ t Thông 74 Lập trình C trên Windows - 2013
- Một số message thông dụng ■ WM_SHOWWINDOW ■ Được gửi khi window cần hi ển th ị ho ặc ẩn đi. ■ WM_SIZE ■ Được gửi sau khi window thay đổ i kích th ước. ■ WM_WINDOWPOSCHANGED ■ Được gửi sau khi window thay đổ i vị trí ho ặc kích th ước. ■ WM_QUIT ■ Được gửi khi ch ương trình chu ẩn bị thoát. Nguy ễn Đạ t Thông 75 Lập trình C trên Windows - 2013
- Translate Message ■ Xử lý message while (GetMessage(&msg, NULL, 0,0)) { TranslateMessage (&msg); DispatchMessage(&msg); } ■ GetMessage : nh ận message từ Windows ■ TranslateMessage : chuy ển đổ i các message từ bàn phím. ■ DispatchMessage : chuy ển message đế n window tương ứng. Nguy ễn Đạ t Thông 76 Lập trình C trên Windows - 2013
- Mô hình xử lý message Nguy ễn Đạ t Thông 77 Lập trình C trên Windows - 2013
- Window Procedure ■ Mỗi khi có message cần xử lý, Windows sẽ gọi “Window Procedure” của window. ■ Prototype của “Window Procedure” được Windows qui đị nh tr ước. ■ “Window Procedure” của một window là hàm WinProc(). Nguy ễn Đạ t Thông 78 Lập trình C trên Windows - 2013
- Hàm WinProc() ■ Hàm WinProc() là một Callback LRESULT CALLBACK WinProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); ■ Được gọi khi có message cần xử lý. ■ Message gửi đế n window nào thì WinProc của window đó xử lý. WinProc: Nguy ễn Đạ t Thông 79 Lập trình C trên Windows - 2013
- Hàm WinProc() Window handle: cho bi ết Message: cho bi ết lo ại thao tác window nào cần xử lý. cần xử lý HWND hwnd UINT message WPARAM wParam LPARAM lParam WORD parameter: tham số cần LONG parameter: tham số cần thi ết cho vi ệc xử lý thi ết cho vi ệc xử lý Các tham số của hàm WinProc() Nguy ễn Đạ t Thông 80 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 81 Lập trình C trên Windows - 2013
- Drawing và Device Context ■ Vẽ (Painting) và vẽ lại (repainting) ■ Device Context ■ Hệ tọa độ ■ Vẽ chữ ■ Vẽ hình và tô màu ■ Path và Region Nguy ễn Đạ t Thông 82 Lập trình C trên Windows - 2013
- Vẽ và vẽ lại ■ Vẽ window ■ Mỗi window được vẽ dựa vào các thu ộc tính nội tại của chính window đó. ■ Vẽ lại window ■ Mỗi window được vẽ lại khi ph ần hi ển th ị của nó “không còn hợp lệ nữa” ■ Bị xóa ho ặc bị di chuy ển đế n vị trí khác, ■ Bị window khác che lấp, ■ Thông tin nội tại của window bị thay đổ i, When to Draw in a Window: Nguy ễn Đạ t Thông 83 Lập trình C trên Windows - 2013
- Cập nhật window ■ Program muốn thay đổi của sự hi ển thị của window? ■ Làm sao để vẽ thêm? ■ Làm sao để vi ệc vẽ thêm xuất hi ện khi vẽ lại? Nguy ễn Đạ t Thông 84 Lập trình C trên Windows - 2013
- Mô hình cập nhật window Cập nh ật thông tin Yêu cầu vẽ lại Cập nh ật thông tin nội tại Gửi message WM_PAINT ph ục vụ cho vi ệc vẽ yêu cầu window vẽ lại. window. Cập nhật window Vẽ window Xử lý message WM_PAINT : Vẽ window dựa vào các thông tin nội tại của window đó. Nguy ễn Đạ t Thông 85 Lập trình C trên Windows - 2013
- Trở lại “Hello World 2” ■ Thay đổi kích thước window: ■ Window có được yêu cầu vẽ lại không? ■ Thông tin nội tại nào bị thay đổ i? ■ Vi ệc vẽ lại có áp dụng thông tin mới không? Nguy ễn Đạ t Thông 86 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 87 Lập trình C trên Windows - 2013
- GDI ■ Graphics Device Interface (GDI) ■ Th ư vi ệc hàm của Windows ■ Bao gồm các hàm “vẽ” ■ Để vẽ các thành phần của window ■ Truy vấn “device context” của window ■ Sử dụng các hàm th ư vi ện GDI ■ Yêu cầu ■ WINGDI.H (đã được include trong WINDOWS.H ) ■ Gdi32.lib / Gdi32.dll Windows GDI: Nguy ễn Đạ t Thông 88 Lập trình C trên Windows - 2013
- Device Context ■ Device Context (DC) ■ Cấu trúc dữ li ệu ■ Lưu gi ữ các thông tin cần thi ết cho các hàm GDI ■ Device context đại di ện cho một thi ết bị “hi ển thị” ■ Màn hình (các window) ■ Máy in ■ Ảnh bitmap Device Context: Nguy ễn Đạ t Thông 89 Lập trình C trên Windows - 2013
- Truy vấn HDC ■ Truy vấn HDC của một window PAINTSTRUCT ps; HDC hdc; // handle to DC case WM_PAINT: hdc = BeginPaint(hwnd, &ps); // [use GDI functions] EndPaint(hwnd, &ps); return 0; ■ BeginPaint : “validate” tất cả các vùng bị “invalidate”. ■ Khi xử lý WM_PAINT : ■ Có th ể không gọi hàm GDI, ■ Bắt bu ộc ph ải gọi BeginPaint() và EndPaint() . WM_PAINT Message: Nguy ễn Đạ t Thông 90 Lập trình C trên Windows - 2013
- PAINTSTRUCT ■ Cấu trúc PAINTSTRUCT typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT; ■ hdc : Device Context Handle ■ fErase : cho bi ết Program có cần xóa tr ước khi vẽ ■ rcPaint : cho bi ết vùng cần vẽ (không hợp lệ) PAINTSTRUCT : Nguy ễn Đạ t Thông 91 Lập trình C trên Windows - 2013
- rcPaint ■ rcPaint trong PAINTSTRUCT Nguy ễn Đạ t Thông 92 Lập trình C trên Windows - 2013
- GetDC và ReleaseDC ■ Hàm GetDC() và ReleaseDC() HWND hwnd; HDC hdc; hdc = GetDC(hwnd); [use GDI functions] ReleaseDC(hwnd, hdc); ■ GetDC() và ReleaseDC() ■ ph ải đi chung với nhau ■ có th ể sử dụng khi xử lý các message khác nhau ■ đượ c dùng để vẽ tr ực ti ếp lên window GetDC : ReleaseDC : Nguy ễn Đạ t Thông 93 Lập trình C trên Windows - 2013
- Client Area ■ Program có thể tự do vẽ ■ trên vùng “client” của window. ■ Non-client area của window ■ Title bar, menu bar, scrollbar, và border. Nguy ễn Đạ t Thông 94 Lập trình C trên Windows - 2013
- GetWindowDC ■ Truy vấn DC ứng với toàn bộ window HDC GetWindowDC( HWND hWnd // handle to window ); ■ Sau khi vẽ xong, ph ải gọi hàm ReleaseDC . ■ Nếu tham số hWnd là NULL , GetWindowDC sẽ tr ả về DC ứng với toàn màn hình. GetWindowDC : Nguy ễn Đạ t Thông 95 Lập trình C trên Windows - 2013
- WM_NCPAINT ■ Message WM_NCPAINT được gửi khi Windows yêu cầu Program vẽ “Non- Client Area” của window. PAINTSTRUCT ps; HDC hdc; // handle to DC case WM_NCPAINT: hdc = GetWindowDC(hwnd); // [use GDI functions] ReleaseDC(hwnd, hdc); return 0; WM_NCPAINT Message: Nguy ễn Đạ t Thông 96 Lập trình C trên Windows - 2013
- Thuộc tính của DC ■ Hàm GetDeviceCaps int GetDeviceCaps( HDC hdc, int nIndex ); ■ Các thu ộc tính ■ LOGPIXELSX , LOGPIXELSY ■ PHYSICALWIDTH , PHYSICALHEIGHT ■ HORZSIZE , VERTSIZE GetDeviceCaps : Nguy ễn Đạ t Thông 97 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 98 Lập trình C trên Windows - 2013
- Hệ tọa độ ■ Hệ tọa độ trong DC ■ X: từ trái qua ph ải ■ Y: từ trên xu ống dưới ■ O: góc trên bên trái Nguy ễn Đạ t Thông 99 Lập trình C trên Windows - 2013
- Tọa độ tương đối ■ Relative position là tọa độ vị trí của window so với window cha. Nguy ễn Đạ t Thông 100 Lập trình C trên Windows - 2013
- Chuyển đổi tọa độ ■ ClientToScreen() – ScreenToClient() ClientToScreen : ScreenToClient : Nguy ễn Đạ t Thông 101 Lập trình C trên Windows - 2013
- Chuyển đổi tọa độ ■ Chuyển đổi tọa độ tương đối gi ữa các window ■ Chuy ển đổ i từ (x,y) sang (x,y) và ng ược lại? Nguy ễn Đạ t Thông 102 Lập trình C trên Windows - 2013
- Vẽ chữ ■ Hàm TextOut BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString // length in characters ); ■ Vẽ chu ỗi ký tự trên DC ■ Là dạng kết hợp của TextOutA và TextOutW TextOut : Nguy ễn Đạ t Thông 103 Lập trình C trên Windows - 2013
- Vẽ chữ ■ Hàm DrawText int DrawText( HDC hDC, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat ); ■ uFormat ■ DT_NOCLIP ■ DT_SINGLELINE , DT_CENTER , DT_VCENTER DrawText : DrawTextEx : Nguy ễn Đạ t Thông 104 Lập trình C trên Windows - 2013
- Màu chữ ■ Hàm SetTextColor COLORREF SetTextColor( HDC hdc, COLORREF crColor ); ■ Hàm GetTextColor COLORREF GetTextColor( HDC hdc ); ■ Sử dụng macro RGB để tạo giá tr ị COLORREF ■ RGB(255, 255, 255) – màu tr ắng ■ RGB(255, 0, 0) – màu đỏ SetTextColor : GetTextColor : Nguy ễn Đạ t Thông 105 Lập trình C trên Windows - 2013
- Màu nền ■ Hàm SetBkColor COLORREF SetBkColor( HDC hdc, COLORREF crColor ); ■ Hàm SetBkMode int SetBkMode( HDC hdc, int iBkMode ); ■ iBkMode ■ OPAQUE ho ặc TRANSPARENT SetBkColor : SetBkMode : Nguy ễn Đạ t Thông 106 Lập trình C trên Windows - 2013
- Font chữ ■ Hàm CreateFont HFONT CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace // font name ); CreateFont : Nguy ễn Đạ t Thông 107 Lập trình C trên Windows - 2013
- Font chữ ■ Hàm CreateFont yêu cầu Windows ■ tạo một cấu trúc LOGFONT ■ lưu tr ữ các thu ộc tính font ch ữ vào LOGFONT ■ tr ả về một “handle to LOGFONT ” - HFONT ■ Hàm CreateFontIndirect HFONT CreateFontIndirect( const LOGFONT *lplf ); LOGFONT : CreateFontIndirect : Nguy ễn Đạ t Thông 108 Lập trình C trên Windows - 2013
- Thay đổi font chữ ■ Hàm (macro) SelectFont HFONT SelectFont( HDC hdc, HFONT hFont ); ■ Sử dụng hàm SelectFont ■ thay đổ i font ch ữ cho DC ■ truy vấn font ch ữ hi ện tại của DC SelectFont Nguy ễn Đạ t Thông 109 Lập trình C trên Windows - 2013
- Xóa font chữ ■ Hàm (macro) DeleteFont BOOL DeleteFont( HFONT hfont ); ■ Sử dụng hàm DeleteFont ■ xóa cấu trúc LOGFONT đã tạo ra tr ướ c đó ■ Ch ỉ được xóa font ch ữ khi nó không ph ải là font ch ữ hi ện tại của DC. DeleteFont : Nguy ễn Đạ t Thông 110 Lập trình C trên Windows - 2013
- Đọc thêm ■ Text Metrics ■ Text Alignment Nguy ễn Đạ t Thông 111 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 112 Lập trình C trên Windows - 2013
- Vẽ điểm ■ Hàm SetPixel COLORREF SetPixel( HDC hdc, int X, int Y, COLORREF crColor ); SetPixel : Nguy ễn Đạ t Thông 113 Lập trình C trên Windows - 2013
- Vẽ đường thẳng ■ Hàm MoveToEx và LineTo BOOL MoveToEx( HDC hdc, int X, int Y, LPPOINT lpPoint ); BOOL LineTo( HDC hdc, int nXEnd, int nYEnd ); MoveToEx : LineTo : Nguy ễn Đạ t Thông 114 Lập trình C trên Windows - 2013
- Hình dạng của đường Nguy ễn Đạ t Thông 115 Lập trình C trên Windows - 2013
- Bút vẽ – Pen ■ Hàm CreatePen() HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor ); ■ Các lo ại bút vẽ ■ PS_SOLID ■ PS_DASH ■ PS_DOT ■ PS_DASHDOT ■ PS_DASHDOTDOT CreatePen : Nguy ễn Đạ t Thông 116 Lập trình C trên Windows - 2013
- Bút vẽ – Pen ■ Hàm CreatePen yêu cầu Windows ■ tạo một cấu trúc LOGPEN ■ lưu tr ữ các thu ộc tính bút vẽ vào LOGPEN ■ tr ả về một “handle to LOGPEN ” - HPEN ■ Hàm CreatePenIndirect HPEN CreatePenIndirect( const LOGPEN *lplgpn ); LOGPEN : CreatePenIndirect : Nguy ễn Đạ t Thông 117 Lập trình C trên Windows - 2013
- Thay đổi bút vẽ ■ Hàm SelectObject HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj ); ■ Sử dụng hàm SelectObject với tham số là HPEN ■ thay đổ i bút vẽ cho DC ■ truy vấn bút vẽ hi ện tại của DC (kết qu ả tr ả về là HPEN ) SelectObject Nguy ễn Đạ t Thông 118 Lập trình C trên Windows - 2013
- Xóa bút vẽ ■ Hàm DeleteObject BOOL DeleteObject( HGDIOBJ hObject ); ■ Sử dụng hàm DeleteObject với tham số là HPEN ■ xóa cấu trúc LOGPEN đã tạo ra tr ướ c đó ■ Ch ỉ được xóa bút vẽ khi nó không ph ải là bút vẽ hi ện tại của DC. DeleteObject : Nguy ễn Đạ t Thông 119 Lập trình C trên Windows - 2013
- Vẽ hình ■ Vẽ hình chữ nhật BOOL Rectangle( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect ); ■ Hình ch ữ nh ật được vẽ bằng bút vẽ hi ện tại của DC. ■ Hình ch ữ nh ật được tô màu gì? Rectanlge : Nguy ễn Đạ t Thông 120 Lập trình C trên Windows - 2013
- Bút tô – Brush ■ Hàm CreateSolidBrush() HBRUSH CreateSolidBrush( COLORREF crColor ); CreateSolidBrush : Nguy ễn Đạ t Thông 121 Lập trình C trên Windows - 2013
- Bút tô – Brush ■ Hàm CreateHatchBrush() HBRUSH CreateHatchBrush( int fnStyle, COLORREF clrref ); ■ Các lo ại bút tô Hatch ■ HS_BDIAGONAL ■ HS_FDIAGONAL ■ HS_CROSS ■ HS_DIAGCROSS ■ HS_HORIZONTAL ■ HS_VERTICAL CreateHatchBrush : Nguy ễn Đạ t Thông 122 Lập trình C trên Windows - 2013
- Bút tô – Brush ■ Hàm CreateXxxxxBrush yêu cầu Windows ■ tạo một cấu trúc LOGBRUSH ■ lưu tr ữ các thu ộc tính bút tô vào LOGBRUSH ■ tr ả về một “handle to LOGBRUSH ” - HBRUSH ■ Hàm CreateBrushIndirect HBRUSH CreateBrushIndirect( const LOGBRUSH *lplb ); LOGBRUSH : CreateBrushIndirect : Nguy ễn Đạ t Thông 123 Lập trình C trên Windows - 2013
- Thay đổi và xóa bút tô ■ Thay đổi bút tô ■ Sử dụng hàm SelectObject với tham số là HBRUSH ■ Xóa bút tô ■ Sử dụng hàm DeleteObject với tham số là HBRUSH ■ xóa cấu trúc LOGBRUSH đã tạo ra tr ướ c đó ■ Ch ỉ được xóa bút tô khi nó không ph ải là bút tô hi ện tại của DC. Nguy ễn Đạ t Thông 124 Lập trình C trên Windows - 2013
- Vẽ hình ■ Hình tròn – ellipse Ellipse : Chord : Pie : Nguy ễn Đạ t Thông 125 Lập trình C trên Windows - 2013
- Đọc thêm ■ Vẽ đa giác PolyLine : PolyLineTo : ■ Vẽ đường cong Arc : ArcTo : AngleArc : ■ Vẽ đường Bezier PolyBezier : PolyBezierTo : Nguy ễn Đạ t Thông 126 Lập trình C trên Windows - 2013
- Ví dụ ■ Vẽ đường và hình (exe) /* LINEDEMO.C Line-Drawing Demonstration Program (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("LineDemo") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; Nguy ễn Đạ t Thông 127 Lập trình C trên Windows - 2013
- Ví dụ ■ Vẽ đường cong Bezier ( exe) /* BEZIER.C Bezier Splines Demo (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Bezier") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; Nguy ễn Đạ t Thông 128 Lập trình C trên Windows - 2013
- Ví dụ ■ Vẽ đường Sin ( exe) /* SINEWAVE.C Sine Wave Using Polyline (c) Charles Petzold, 1998 */ #include #include #define NUM 1000 #define TWOPI (2 * 3.14159) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("SineWave") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; Nguy ễn Đạ t Thông 129 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 130 Lập trình C trên Windows - 2013
- Path ■ Path ■ Một tập hợp nhi ều hình vẽ ■ Được vẽ đường biên ■ Được tô ■ Được vẽ và tô Nguy ễn Đạ t Thông 131 Lập trình C trên Windows - 2013
- Tạo Path ■ Hàm BeginPath() và EndPath() PAINTSTRUCT ps; HDC hdc; // handle to DC case WM_PAINT: hdc = BeginPaint(hwnd, &ps); BeginPath(hdc); // [use GDI functions to draw path] EndPath(hdc); EndPaint(hwnd, &ps); return 0; BeginPath : EndPath : Nguy ễn Đạ t Thông 132 Lập trình C trên Windows - 2013
- Vẽ Path ■ Vẽ đường vi ền BOOL StrokePath( HDC hdc ); ■ Tô màu BOOL FillPath( HDC hdc ); ■ Vẽ đường vi ền và tô BOOL StrokeAndFillPath( HDC hdc ); Nguy ễn Đạ t Thông 133 Lập trình C trên Windows - 2013
- Region ■ Region ■ Một tập hợp nhi ều vùng hi ển th ị trên DC ■ Region tương tự như Path ■ Vẽ biên và tô màu ■ Kết hợp nhi ều vùng hi ển th ị ■ Hit – test Nguy ễn Đạ t Thông 134 Lập trình C trên Windows - 2013
- Tạo Region ■ Tạo một region hình chữ nhật HRGN CreateRectRgn( int nLeftRect, int nTopRect, int nRightRect, int nBottomRect ); ■ Khi không còn sử dụng region ■ Sử dụng hàm DeleteObject để gi ải phóng region CreateRectRgn : Nguy ễn Đạ t Thông 135 Lập trình C trên Windows - 2013
- Tạo Region ■ Tạo Region hình ellipse CreateEllipticRgn : ■ Tạo Region hình đa giác CreatePolygonRgn : Nguy ễn Đạ t Thông 136 Lập trình C trên Windows - 2013
- Vẽ và tô màu Region ■ Hàm PaintRgn BOOL PaintRgn( HDC hdc, HRGN hrgn ); ■ Hàm FillRgn BOOL FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbr ); PaintRgn : FillRgn : Nguy ễn Đạ t Thông 137 Lập trình C trên Windows - 2013
- Kết hợp các Region ■ Hàm CombineRgn int CombineRgn( HRGN hrgnDest, HRGN hrgnSrc1, HRGN hrgnSrc2, int fnCombineMode ); ■ fnCombineMode CombineRgn : Nguy ễn Đạ t Thông 138 Lập trình C trên Windows - 2013
- Hit Test Region ■ Hit Test ■ Ki ểm tra vị trí chu ột ■ Hit Test Region : ki ểm tra vị trí chu ột có nằm trong Region không. ■ Hàm PtInRgn BOOL PtInRegion( HRGN hrgn, int X, int Y ); PtInRgn : Nguy ễn Đạ t Thông 139 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 140 Lập trình C trên Windows - 2013
- View Port ■ Các hệ tọa độ ■ Clipping Nguy ễn Đạ t Thông 141 Lập trình C trên Windows - 2013
- Các hệ tọa độ ■ GDI có 2 hệ tọa độ ■ Hệ tọa độ Logical (hay tọa độ th ực – world) ■ Hệ tọa độ Viewport (hay hệ tọa độ hi ển th ị trên window). ■ Các hàm vẽ của GDI ■ sử dụng hệ tọa độ Logic. Nguy ễn Đạ t Thông 142 Lập trình C trên Windows - 2013
- Các hệ tọa độ Nguy ễn Đạ t Thông 143 Lập trình C trên Windows - 2013
- Di chuyển gốc tọa độ ViewPort Nguy ễn Đạ t Thông 144 Lập trình C trên Windows - 2013
- Di chuyển gốc tọa độ Viewport ■ Hàm SetViewportOrgEx BOOL SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint ); ■ Thi ết lập gốc tọa độ O của viewport tương ứng với điểm (X, Y) trong hệ tọa độ “world”. SetViewportOrgEx : Nguy ễn Đạ t Thông 145 Lập trình C trên Windows - 2013
- Clipping ■ Clipping ■ Hạn ch ế vùng hi ển th ị ■ Clipping Region ■ Gi ới hạn vùng hi ển th ị trong một region ■ Clipping Path ■ Gi ới hạn vùng hi ển th ị trong một path Nguy ễn Đạ t Thông 146 Lập trình C trên Windows - 2013
- Clipping Nguy ễn Đạ t Thông 147 Lập trình C trên Windows - 2013
- Region Clipping ■ Hàm SelectClipRgn int SelectClipRgn( HDC hdc, HRGN hrgn ); ■ Region hrgn sẽ được copy ■ Có th ể sử dụng lại cho các DC khác ■ Có th ể gi ải phóng bằng DeleteObject SelectClipRgn : Nguy ễn Đạ t Thông 148 Lập trình C trên Windows - 2013
- Thay đổi Clipping Region ■ GetClipRgn ■ Truy vấn clipping region hi ện tại ■ ExcludeClipRect ■ “exclude” clipping region với một rectangle ■ IntersectClipRect ■ “intersect” clipping region với một retangle ■ OffsetClipRgn ■ Di chuy ển clipping region Nguy ễn Đạ t Thông 149 Lập trình C trên Windows - 2013
- Đọc thêm ■ GDI Mapping Mode SetWindowExtEx : SetViewportExtEx : ■ Transforming: xoay và zoom ScaleViewportExtEx : ScaleWindowExtEx : SetWorldTransform : CombineTransform : Nguy ễn Đạ t Thông 150 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 151 Lập trình C trên Windows - 2013
- Ph ần 2 Nhập liệu (User Inputs) Nguyễn Đạt Thông www.ndthong.info
- Nội dung ■ Nhập li ệu ■ Keyboard ■ Mouse ■ Timer Nguy ễn Đạ t Thông 153 Lập trình C trên Windows - 2013
- Keyboard ■ Bàn phím và ký tự ■ Message về bàn phím ■ Message về ký tự ■ Caret Nguy ễn Đạ t Thông 154 Lập trình C trên Windows - 2013
- Bàn phím ■ Thao tác từ bàn phím ■ Nh ấn phím ký tự ■ Nh ấn phím ch ức năng (F1, F2, Esc, Home, ) ■ Nh ấn phím điều khi ển (Ctrl, Alt, Shift) ■ Windows xử lý các thao tác bàn phím ■ Thông qua hàm “TranslateMsg ” ■ Gửi message “keystroke” ho ặc message “command” đế n window Nguy ễn Đạ t Thông 155 Lập trình C trên Windows - 2013
- Window Focus ■ Windows sẽ gửi các message “keystroke” đến window đang “focus” ■ Focus ■ Khi được focus, window sẽ nh ận được message WM_SETFOCUS ■ Khi mất focus, window sẽ nh ận được message WM_KILLFOCUS Nguy ễn Đạ t Thông 156 Lập trình C trên Windows - 2013
- Keystroke queue ■ Người sử dụng gõ bàn phím ■ Program lần lượt xử lý các keystroke ■ Người sử dụng gõ quá nhanh? ■ Các keystroke được đặ t trong message queue của “focus” window? Nguy ễn Đạ t Thông 157 Lập trình C trên Windows - 2013
- Keystroke queue ■ Focus window xử lý keystroke message ■ Vi ệc xử lý làm cho window mất focus? ■ Vi ệc xử lý làm cho window đóng lại? ■ Những keystroke message còn trong queue sẽ được xử lý như thế nào? ■ Các keystroke sẽ được đặ t trong message queue của Windows Nguy ễn Đạ t Thông 158 Lập trình C trên Windows - 2013
- Keystroke và ký tự ■ Keystroke là thao tác nhấn phím ■ Ch ẳng hạn nh ấn phím ‘A’ ■ Ch ẳng hạn nh ấn phím ‘1’ ■ Ch ẳng hạn nh ấn phím ‘Del’ ■ Ký tự là kết quả của thao tác nhấn phím ■ Ch ẳng hạn ‘a’, ‘A’, ho ặc ‘Ctrl-A’? ■ Ch ẳng hạn ‘1’, ‘!’, ‘Ctrl-1’, ho ặc ‘Ctrl-Shift-1’? ■ Ch ẳng hạn ‘Del’? Nguy ễn Đạ t Thông 159 Lập trình C trên Windows - 2013
- Message keystroke ■ Đối với mỗi keystroke ■ Windows sẽ gửi message keystroke. ■ Nếu keystroke tương ứng với một ký tự ■ Windows sẽ gửi thêm message ký tự. Nguy ễn Đạ t Thông 160 Lập trình C trên Windows - 2013
- Message keystroke ■ Windows gửi các cặp message ■ WM_KEYDOWN và WM_KEYUP ■ WM_SYSKEYDOWN và WM_SYSKEYUP ■ Program thường không xử lý “SysKey” ■ Gọi hàm DefWindowProc để Windows xử lý WM_KEYDOWN : WM_KEYUP : WM_SYSKEYDOWN : WM_SYSKEYUP : Nguy ễn Đạ t Thông 161 Lập trình C trên Windows - 2013
- Xử lý các message keystroke ■ Trong hàm WinProc LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_SYSKEYDOWN: case WM_SYSKEYUP: break; case WM_KEYDOWN: // TODO: process keydown return 0; case WM_KEYUP: // TODO: process keyup return 0; } return DefWindowProc (hwnd, msg, wParam, lParam); } Nguy ễn Đạ t Thông 162 Lập trình C trên Windows - 2013
- Tham số wParam ■ Tham số wParam của message keystroke ■ Cho bi ết mã ảo (virtual keycode) của phím được nh ấn. ■ Mã ảo của phím ■ Đạ i di ện cho từng phím ■ Độ c lập với lo ại bàn phím (keyboard layout) Nguy ễn Đạ t Thông 163 Lập trình C trên Windows - 2013
- Virtual Keycode Code Mô tả 0x41 – 0x5A Phím ‘A’ – ‘Z’ 0x30 – 0x39 Phím ‘0’ – ‘9’ VK_RETURN (0x0D) Phím Enter VK_SHIFT (0x10) Phím Shift VK_CTRL (0x11) Phím Ctrl VK_MENU (0x12) Phím Alt VK_PAUSE (0x13) Phím Pause VK_CAPITAL (0x14) Phím CAPS LOCK VK_TAB (0x09) Phím Tab VK_BACK (0x08) Phím Backspace VK_ESCAPE (0x1B) Phím ESC VK_SPACE (0x20) Phím Spacebar Virtual Keycodes: Nguy ễn Đạ t Thông 164 Lập trình C trên Windows - 2013
- Tham số lParam ■ Tham số lParam chứa các thông tin ■ Repeat Count ■ OEM Scan Code : mã phím ph ụ thu ộc bàn phím ■ Extended Key Flag : cho bi ết lo ại bàn phím ■ Context Code : cho bi ết tr ạng thái phím Alt Nguy ễn Đạ t Thông 165 Lập trình C trên Windows - 2013
- Các phím chức năng ■ Các phím chức năng ■ Alt, Ctrl, Shift ■ Caps Lock, Num Lock, Scroll Lock ■ Khi nhận được message keystroke ■ Program cần bi ết tr ạng thái hi ện tại của các phím ch ức năng. Nguy ễn Đạ t Thông 166 Lập trình C trên Windows - 2013
- Các phím chức năng ■ Hàm GetKeyState SHORT WINAPI GetKeyState( int nVirtKey ); ■ Cho bi ết tr ạng thái của các phím ch ức năng ■ Không ph ải tại th ời điểm gọi hàm, ■ Mà tại th ời điểm xảy ra keystroke ■ Kết qu ả tr ả về ■ Bit th ấp nh ất (0x0001) cho bi ết tr ạng thái “toggled” ■ Bit cao nh ất (0x0008) cho bi ết tr ạng thái “pressed” GetKeyState : GetAsynKeyState : Nguy ễn Đạ t Thông 167 Lập trình C trên Windows - 2013
- Xử lý message keystroke ■ Không xử lý WM_SYSKEYDOWN và WM_SYS_KEYUP ■ Có thể xử lý một, hoặc cả hai message WM_KEYDOWN và WM_KEYUP ■ Không xử lý message keystroke như message ký tự ■ Keystroke là ‘3’, tr ạng thái Shift là “Press”? Nguy ễn Đạ t Thông 168 Lập trình C trên Windows - 2013
- Message ký tự ■ Windows gửi message WM_CHAR ■ Nếu keystroke tương ứng tạo ra một ký tự. ■ Windows “translate” message keystroke thành message ký tự ■ TranslateMsg WM_CHAR : Nguy ễn Đạ t Thông 169 Lập trình C trên Windows - 2013
- Tham số wParam ■ wParam cho bi ết ký tự được nhấn TCHAR c; case WM_KEYDOWN: c = (TCHAR)wParam; // TODO: process character c here return 0; ■ Ký tự được nh ấn ■ Là ký tự Unicode nếu Program hỗ tr ợ Unicode ■ Là ký tự ANSI nếu Program không hỗ tr ợ Unicode Nguy ễn Đạ t Thông 170 Lập trình C trên Windows - 2013
- Tham số lParam ■ Tham số lParam chứa các thông tin ■ Repeat Count ■ OEM Scan Code : mã phím ph ụ thu ộc bàn phím ■ Extended Key Flag : cho bi ết lo ại bàn phím ■ Context Code : cho bi ết tr ạng thái phím Alt Nguy ễn Đạ t Thông 171 Lập trình C trên Windows - 2013
- Thứ tự message ■ Khi nhấn phím ‘A’ WM_KEYDOWN Virtual key code for 'A' (0x41) WM_CHAR Character code for 'a' (0x61) WM_KEYUP Virtual key code for 'A' (0x41) ■ Khi nhấn Shift + ‘A’ WM_KEYDOWN Virtual key code VK_SHIFT (0x10) WM_KEYDOWN Virtual key code for 'A' (0x41) WM_CHAR Character code for 'A' (0x41) WM_KEYUP Virtual key code for 'A' (0x41) WM_KEYUP Virtual key code VK_SHIFT (0x10) Nguy ễn Đạ t Thông 172 Lập trình C trên Windows - 2013
- Thứ tự message ■ Khi nhấn và gi ữ phím ‘A’ WM_KEYDOWN Virtual key code for 'A' (0x41) WM_CHAR Character code for 'a' (0x61) WM_KEYDOWN Virtual key code for 'A' (0x41) WM_CHAR Character code for 'a' (0x61) WM_KEYDOWN Virtual key code for 'A' (0x41) WM_CHAR Character code for 'a' (0x61) WM_KEYUP Virtual key code for 'A' (0x41) ■ Trong các cặp WM_KEYDOWN và WM_CHAR ■ Có th ể có “Repeat Count” lớn hơn 1. Nguy ễn Đạ t Thông 173 Lập trình C trên Windows - 2013
- Xử lý message WM_CHAR case WM_CHAR: [other program lines] switch (wParam) { case '\b': // backspace [other program line] break; case '\t': // tab [other program lines] break; case '\n': // linefeed [other program lines] break; default: // character codes [other program lines] break; } return 0; Nguy ễn Đạ t Thông 174 Lập trình C trên Windows - 2013
- Caret ■ Caret trong một Program ■ Cho bi ết vị trí ký tự kế ti ếp sẽ xu ất hi ện ■ Có dạng | ho ặc ▌ ■ Caret trong một Windows program ■ Xu ất hi ện khi nh ận message WM_SETFOCUS ■ Bi ến mất khi nh ận message WM_KILLFOCUS Nguy ễn Đạ t Thông 175 Lập trình C trên Windows - 2013
- Tạo một Caret ■ Hàm CreateCaret BOOL WINAPI CreateCaret( HWND hWnd, HBITMAP hBitmap, int nWidth, int nHeight ); ■ Caret mặc đị nh của Windows ■ hBitmap là NULL ho ặc (HBITMAP)1 ■ Có th ể tạo caret từ một hình bitmap CreateCaret : Nguy ễn Đạ t Thông 176 Lập trình C trên Windows - 2013
- Hi ển thị Caret ■ Hàm ShowCaret BOOL WINAPI ShowCaret( HWND hWnd ); ShowCaret : ■ Hàm HideCaret BOOL WINAPI HideCaret( HWND hWnd ); HideCaret : Nguy ễn Đạ t Thông 177 Lập trình C trên Windows - 2013
- Thay đổi vị trí Caret ■ Hàm SetCaretPos BOOL WINAPI SetCaretPos( int X, int Y ); SetCaretPos : ■ Hàm GetCaretPos BOOL WINAPI GetCaretPos( LPPOINT lpPoint ); GetCaretPos : Nguy ễn Đạ t Thông 178 Lập trình C trên Windows - 2013
- Blinking ■ Hàm SetCaretBlinkTime BOOL WINAPI SetCaretBlinkTime( UINT uMSeconds ); SetCaretBlickTime : ■ Hàm GetCaretBlinkTime UINT WINAPI GetCaretBlinkTime(void); GetCaretBlinkTime : Nguy ễn Đạ t Thông 179 Lập trình C trên Windows - 2013
- Ví dụ ■ Chương trình “key-view” ( exe) /* KEYVIEW2.C Displays Keyboard and Character Messages (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("KeyView2") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; Nguy ễn Đạ t Thông 180 Lập trình C trên Windows - 2013
- Ví dụ ■ Chương trình gõ văn bản (exe) /* TYPER.C Typing Program (c) Charles Petzold, 1998 */ #include #define BUFFER(x,y) *(pBuffer + y * cxBuffer + x) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Typer") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; Nguy ễn Đạ t Thông 181 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 182 Lập trình C trên Windows - 2013
- Mouse ■ Cursor ■ Sự ki ện Mouse trên Client Area ■ Sự ki ện Mouse trên Non-Client Area ■ Wheel ■ Capturing Mouse Nguy ễn Đạ t Thông 183 Lập trình C trên Windows - 2013
- Mouse ■ Các nút nhấn trên Mouse ■ Left ■ Middle (Optional) ■ Right ■ Các thao tác trên Mouse ■ Move ■ Click ■ Double Click ■ Drag ■ Wheel Nguy ễn Đạ t Thông 184 Lập trình C trên Windows - 2013
- Cursor ■ Cursor đại di ện cho Mouse trên màn hình. ■ Cursor có thể có nhi ều hình dạng ■ Cursor chỉ đến 1 pixel trên màn hình. Nguy ễn Đạ t Thông 185 Lập trình C trên Windows - 2013
- Thao tác trên Cursor ■ Ẩn – hi ện Cursor int WINAPI ShowCursor( BOOL bShow ); ShowCursor : ■ Thay đổi vị trí Cursor BOOL WINAPI SetCursorPos( int X, int Y ); BOOL WINAPI GetCursorPos( LPPOINT lpPoint ); SetCursorPos : GetCursorPos : Nguy ễn Đạ t Thông 186 Lập trình C trên Windows - 2013
- Mouse Message ■ Windows sẽ gửi message về mouse ■ Khi mouse đi vào vùng hi ển th ị của window ■ Khi mouse được click trong window ■ Windows gửi message ngay cả khi window không “active”. ■ Windows đị nh nghĩa các message ■ Client-Area message ■ Non-Client-Area message Nguy ễn Đạ t Thông 187 Lập trình C trên Windows - 2013
- Client-Area mouse message ■ Khi mouse di chuyển trong vùng Client ■ Window sẽ nh ận được message WM_MOUSEMOVE . ■ Mouse di chuyển từ tọa độ (0,0) đến tọa độ (0,1000) ■ Windows sẽ gửi 1000 message WM_MOUSEMOVE ? Nguy ễn Đạ t Thông 188 Lập trình C trên Windows - 2013
- Client-Area mouse message ■ Khi mouse được click trong vùng Client ■ Window sẽ nh ận được message Button Pressed Release Pressed Left WM_ LBUTTONDOWN WM_ LBUTTONUP WM_ LBUTTONDBLCLK Middle WM_ MBUTTONDOWN WM_ MBUTTONUP WM_ MBUTTONDBLCLK Right WM_ RBUTTONDOWN WM_ RBUTTONUP WM_ RBUTTONDBLCLK WM_LBUTTONDOWN : WM_LBUTTONUP : WM_LBUTTONDBLCLK : WM_RBUTTONDOWN : WM_RBUTTONUP : WM_RBUTTONDBLCLK : WM_MBUTTONDOWN : WM_MBUTTONUP : WM_MBUTTONDBLCLK : Nguy ễn Đạ t Thông 189 Lập trình C trên Windows - 2013
- Tham số lParam và wParam ■ lParam ■ tọa độ mouse tại th ời điểm phát sinh message ■ tọa độ được tính trong vùng “client” xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam); ■ wParam ■ tr ạng thái các phím ch ức năng và phím Mouse tại th ời điểm phát sinh message MK_LBUTTON // Left button is down MK_MBUTTON // Middle button is down MK_RBUTTON // Right button is down MK_SHIFT // Shift key is down MK_CONTROL // Ctrl key is down Nguy ễn Đạ t Thông 190 Lập trình C trên Windows - 2013
- Xử lý Mouse trong Client-Area case WM_LBUTTONDOWN: if (wParam & MK_SHIFT) { if (wParam & MK_CONTROL) { [Shift and Ctrl keys are down] } else { [Shift key is down] } } case WM_RBUTTONDOWN: [right button logic] return 0; Nguy ễn Đạ t Thông 191 Lập trình C trên Windows - 2013
- Double Click ■ Windows chỉ gửi message “double-click” ■ Khi window có đă ng ký nh ận “double-click” wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; Có CS_DBLCLKS Không có CS_DBLCLKS WM_LBUTTONDOWN WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONUP Nguy ễn Đạ t Thông 192 Lập trình C trên Windows - 2013
- Non-client area mouse message ■ Khi mouse di chuyển trong vùng Non- Client ■ Window sẽ nh ận được WM_ NC MOUSEMOVE . ■ lParam ■ tọa độ mouse tại th ời điểm phát sinh message ■ tọa độ được tính trong toàn màn hình (screen) ■ wParam ■ Tương tự nh ư wParam của các message “client” Nguy ễn Đạ t Thông 193 Lập trình C trên Windows - 2013
- Client-Area mouse message ■ Khi mouse click trong vùng Non-Client ■ Window sẽ nh ận được message Pressed Release Pressed WM_NC LBUTTONDOWN WM_NC LBUTTONUP WM_NC LBUTTONDBLCLK WM_NC MBUTTONDOWN WM_NC MBUTTONUP WM_NC MBUTTONDBLCLK WM_NC RBUTTONDOWN WM_NC RBUTTONUP WM_NC RBUTTONDBLCLK WM_NCLBUTTONDOWN : WM_NCLBUTTONUP : WM_NCLBUTTONDBLCLK : WM_NCRBUTTONDOWN : WM_NCRBUTTONUP : WM_NCRBUTTONDBLCLK : WM_NCMBUTTONDOWN : WM_NCMBUTTONUP : WM_NCMBUTTONDBLCLK : Nguy ễn Đạ t Thông 194 Lập trình C trên Windows - 2013
- Mouse wheel ■ Các thao tác trên Mouse wheel ■ Nh ấn ■ Wheel ■ WM_MOUSEWHEEL ■ Được gửi khi wheel mouse trong vùng hi ển th ị của window (Client và non-client) ■ Tham số lParam ch ứa tọa độ trên màn hình. ■ Tham số wParam ch ứa tr ạng thái các nút ch ức năng và WHEEL_DATA . WM_MOUSEWHEEL : Nguy ễn Đạ t Thông 195 Lập trình C trên Windows - 2013
- WHEEL_DATA ■ Tham số wParam fwKeys = GET_KEYSTATE_WPARAM(wParam); zDelta = GET_WHEEL_DELTA_WPARAM(wParam); ■ WHEEL_DATA ■ Là đơn vị khi wheel, có giá tr ị là 120 ■ zDelta ■ Số WHEEL_DATA mà ng ười dùng wheel ■ zDelta > 0 : up, zDelta < 0 : down Nguy ễn Đạ t Thông 196 Lập trình C trên Windows - 2013
- Capturing the Mouse ■ Window chỉ nhận được message mouse ■ Khi các thao tác mouse xảy ra trong vùng Client và Non-Client ■ Window mu ốn nh ận các message mouse khác? Nguy ễn Đạ t Thông 197 Lập trình C trên Windows - 2013
- Capture và Release Mouse ■ Hàm SetCapture HWND WINAPI SetCapture( HWND hWnd ); SetCapture : ■ Hàm ReleaseCapture BOOL WINAPI ReleaseCapture(void); ReleaseCapture : Nguy ễn Đạ t Thông 198 Lập trình C trên Windows - 2013
- Ví dụ ■ Không “capture mouse” ( exe) /* BLOKOUT1.C Mouse Button Demo Program (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("BlokOut1") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; Nguy ễn Đạ t Thông 199 Lập trình C trên Windows - 2013
- Ví dụ ■ Capture mouse ( exe) /* BLOKOUT2.C Mouse Button & Capture Demo Program (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("BlokOut2") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; Nguy ễn Đạ t Thông 200 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 201 Lập trình C trên Windows - 2013
- Timer ■ Khái ni ệm Timer ■ Sử dụng Timer Nguy ễn Đạ t Thông 202 Lập trình C trên Windows - 2013
- Timer ■ Timer là một loại input ■ Do Windows phát sinh, không ph ải từ user. ■ Phát sinh liên tục sau một kho ảng th ời gian nh ất đị nh. ■ Ví dụ: “Windows, send me a message every 10 minutes”. ■ Message được Windows gửi đến Program là WM_TIMER ■ Message WM_TIMER có độ ưu tiên th ấp, ch ỉ được gửi khi window đang “idle” Nguy ễn Đạ t Thông 203 Lập trình C trên Windows - 2013
- Ứng dụng của Timer ■ Timer được sử dụng trong Program ■ Hi ển th ị đồ ng hồ ■ Multitasking ■ Cập nh ật tr ạng thái liên tục ■ Autosave ■ Demo – Trial time ■ Game – di chuy ển đố i tượng ■ Multimedia – ch ơi nh ạc và phim Nguy ễn Đạ t Thông 204 Lập trình C trên Windows - 2013
- Thi ết lập Timer ■ Hàm SetTimer UINT_PTR WINAPI SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); ■ lpTimerFunc ■ Con tr ỏ đế n một hàm có protocol TimerProc ■ Đượ c gọi sau mỗi kho ảng th ời gian uEllapse (tính theo milisecond) SetTimer : TimerProc : Nguy ễn Đạ t Thông 205 Lập trình C trên Windows - 2013
- Ngừng Timer ■ Khi không muốn Windows gửi message WM_TIMER nữa BOOL WINAPI KillTimer( HWND hWnd, INT_PTR uIDEvent ); KillTimer : Nguy ễn Đạ t Thông 206 Lập trình C trên Windows - 2013
- WM_TIMER ■ Message WM_TIMER ■ wParam : đị nh danh của Timer ■ lParam : con tr ỏ đế n hàm TimerProc được truy ền vào khi kh ởi tạo Timer ■ WM_TIMER được xử lý mặc đị nh ■ Gọi hàm TimerProc được truy ền vào khi kh ởi tạo case WM_TIMER: timerProc = (TimerProc)lParam; if (timerProc != 0) timerProc(hwnd, WM_TIMER, wParam, GetTickCount()); break; WM_TIMER : Nguy ễn Đạ t Thông 207 Lập trình C trên Windows - 2013
- Xử lý Timer #define TIMER_SEC 1 #define TIMER_MIN 2 SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ; // case WM_TIMER: switch (wParam) { case TIMER_SEC: [once-per-second processing] break; case TIMER_MIN: [once-per-minute processing] break; } return 0; Nguy ễn Đạ t Thông 208 Lập trình C trên Windows - 2013
- Ví dụ ■ Đổi màu theo thời gian (exe) /* BEEPER2.C Timer Demo Program No. 2 (c) Charles Petzold, 1998 */ #include #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; VOID CALLBACK TimerProc (HWND, UINT, UINT, DWORD ) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Beeper2") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; Nguy ễn Đạ t Thông 209 Lập trình C trên Windows - 2013
- Ví dụ ■ Đồng hồ điện tử (exe) /* DIGCLOCK.c Digital Clock (c) Charles Petzold, 1998 */ #include #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("DigClock") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; Nguy ễn Đạ t Thông 210 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 211 Lập trình C trên Windows - 2013
- Ph ần 3 Các thành phần giao diện Nguyễn Đạt Thông www.ndthong.info
- Nội dung ■ Các thành phần giao di ện ■ Window con ■ Button ■ Một số thành ph ần giao di ện ■ Menu và Resource ■ Dialog ■ Multiple-Document Interface (MDI) Nguy ễn Đạ t Thông 213 Lập trình C trên Windows - 2013
- Window cha – con ■ Window cha – con ■ SendMessage ■ Standard và Owner-Draw Nguy ễn Đạ t Thông 214 Lập trình C trên Windows - 2013
- Window cha – con ■ Một window có thể có các window “con” ■ Window này được coi là cha “cha” ■ Một window “con” có thể có các window “con” khác. ■ “Desktop” là window cha của tất cả các window khác (tr ực ti ếp hoặc gián ti ếp) ■ Window cha của “Desktop” là NULL . Nguy ễn Đạ t Thông 215 Lập trình C trên Windows - 2013
- Window cha – con ■ Tạo window con với CreateWindow HWND WINAPI CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle , int x, int y, int nWidth, int nHeight, HWND hWndParent , HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); ■ dwStyle : bao gồm WS_CHILD ■ hWndParent = NULL : window cha là “Desktop” Nguy ễn Đạ t Thông 216 Lập trình C trên Windows - 2013
- Window cha – con ■ Truy vấn window cha với GetParent HWND WINAPI GetParent( HWND hWnd ); GetParent : ■ Giao ti ếp với window cha SendMessage(hwndParent, message, wParam, lParam); ■ Window con sẽ giao ti ếp (send message) với window cha khi nó phát sinh sự ki ện gì đó Nguy ễn Đạ t Thông 217 Lập trình C trên Windows - 2013
- Standard và Owner-Draw Standard là các Owner-Draw là các thành ph ần giao di ện thành ph ần giao di ện chu ẩn của Windows, đượ c tùy bi ến bởi lập trình viên. - Standard control có giao - Owner-Draw control có giao di ện theo chu ẩn của di ện đượ c vẽ bởi lập trình viên. Windows. Owner-Draw control giao ti ếp với - Standard control giao ti ếp window cha theo cách đượ c với window cha theo chu ẩn đị nh ngh ĩa bởi lập trình viên. của Windows. Nguy ễn Đạ t Thông 218 Lập trình C trên Windows - 2013
- Button ■ Button chuẩn của Windows ■ Giao ti ếp của các Button chuẩn ■ Các thao tác cơ bản trên Button ■ Push button, Check box, Radio button ■ Owner-Draw button Nguy ễn Đạ t Thông 219 Lập trình C trên Windows - 2013
- Button chuẩn ■ Button chuẩn của Window ■ Có “win class” được đă ng ký bởi Windows với tên là “BUTTON ” CreateWindow(TEXT("button"), szText, // button text WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , x, y, width, height, hwndParent, // handle to parent window (HMENU) id, // id of child window hInstance, NULL); Nguy ễn Đạ t Thông 220 Lập trình C trên Windows - 2013
- Style của Button ■ Button chuẩn của Windows bao gồm CheckBox BS_CHECKBOX AutoCheck Radio BS_AUTOCHECKBOX BS_RADIOBUTTON Button BS_PUSHBUTTON TriState Owner-Draw BS_3STATE BS_OWNERDRAW GroupBox BS_GROUPBOX Nguy ễn Đạ t Thông 221 Lập trình C trên Windows - 2013
- Các loại Button Nguy ễn Đạ t Thông 222 Lập trình C trên Windows - 2013
- Giao ti ếp của Button chuẩn ■ Button “chuẩn” giao ti ếp với window cha thông qua message WM_COMMAND ■ lParam : handle của button ■ LOWORD(wParam): đị nh danh (ID) của button ■ HIWORD(wParam): mã xác đị nh thông tin Mã thông điệp Mô tả BN_CLICKED Button đượ c click BN_DBLCLK Button đượ c double-click BN_DOUBLECLICKED BN_DISABLE Button bị vô hi ệu hóa BN_KILLFOCUS Button không còn focus BN_SETFOCUS Button nh ận đượ c focus Button Message: Nguy ễn Đạ t Thông 223 Lập trình C trên Windows - 2013
- Giao ti ếp của Button chuẩn ■ Window cha giao ti ếp với Button “chuẩn” thông qua cơ chế SendMessage ■ Các thao tác ■ Th ực hi ện Click lên button ■ Truy vấn tr ạng thái “check” của button ■ Vô hi ệu hóa button ■ Nguy ễn Đạ t Thông 224 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên Button ■ Ẩn – hi ện button ShowWindow(hwndChild, SW_SHOWNORMAL); ShowWindow(hwndChild, SW_HIDE); IsWindowVisible(hwndChild); ■ Vô hi ệu hóa button EnableWindow(hwndChild, FALSE); EnableWindow(hwndChild, TRUE); IsWindowEnabled(hwndChild); Nguy ễn Đạ t Thông 225 Lập trình C trên Windows - 2013
- Push Button ■ Style của Push button ■ BS_PUSHBUTTON ■ BS_DEFPUSHBUTTON ■ Thao tác // make button depressed SendMessage(hwndButton, BM_SETSTATE, 1, 0); // make button normal SendMessage(hwndButton, BM_SETSTATE, 0, 0); Nguy ễn Đạ t Thông 226 Lập trình C trên Windows - 2013
- Checkbox ■ Style của Checkbox ■ BS_CHECKBOX ■ BS_AUTOCHECKBOX ■ BS_3STATE ■ Thao tác // make checkbox check manually when use BS_CHECKBOX // 0: unchecked, 1: checked, 2: gray-checked SendMessage(hwndButton, BM_SETCHECK, 1, 0); // get the "check" of the checkbox iCheck = (int)SendMessage(hwndButton, BM_GETSTATE, 0, 0); Nguy ễn Đạ t Thông 227 Lập trình C trên Windows - 2013
- Radio button ■ Style của Radio button ■ BS_RADIOBUTTON ■ BS_AUTORADIOBUTTON ■ Thao tác // make radio button check SendMessage(hwndButton, BM_SETCHECK, 1, 0); // get the "check" of the radio button iCheck = (int)SendMessage(hwndButton, BM_GETSTATE, 0, 0); Nguy ễn Đạ t Thông 228 Lập trình C trên Windows - 2013
- Group box ■ Style của Group box ■ BS_GROUPBOX ■ Group box không giao ti ếp gì với window cha A Sample group box Nguy ễn Đạ t Thông 229 Lập trình C trên Windows - 2013
- Owner-Draw button ■ Style của Owner-Draw button ■ BS_OWNERDRAW Nguy ễn Đạ t Thông 230 Lập trình C trên Windows - 2013
- Ví dụ ■ Các loại button ( exe) /* BTNLOOK.C Button Look Program (c) Charles Petzold, 1998 */ #include struct { int iStyle ; TCHAR * szText ; } button[] = { BS_PUSHBUTTON, TEXT ("PUSHBUTTON"), BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"), BS_CHECKBOX, TEXT ("CHECKBOX"), BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"), BS_RADIOBUTTON, TEXT ("RADIOBUTTON"), BS_3STATE, TEXT ("3STATE"), BS_AUTO3STATE, TEXT ("AUTO3STATE"), BS_GROUPBOX, TEXT ("GROUPBOX"), BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"), BS_OWNERDRAW, TEXT ("OWNERDRAW") } ; #define NUM (sizeof button / sizeof button[0]) Nguy ễn Đạ t Thông 231 Lập trình C trên Windows - 2013
- Ví dụ ■ Owner-Draw button ( exe) /* OWNDRAW.C Owner-Draw Button Demo Program (c) Charles Petzold, 1998 */ #include #define ID_SMALLER 1 #define ID_LARGER 2 #define BTN_WIDTH (8 * cxChar) #define BTN_HEIGHT (4 * cyChar) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; HINSTANCE hInst ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("OwnDraw") ; MSG msg ; HWND hwnd ; WNDCLASS wndclass ; hInst = hInstance ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; Nguy ễn Đạ t Thông 232 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 233 Lập trình C trên Windows - 2013
- Một số thành phần giao di ện ■ Static Text ■ Edit box ■ List box ■ ScrollBar Nguy ễn Đạ t Thông 234 Lập trình C trên Windows - 2013
- Static Text ■ Static Text của Windows ■ Có “win class” được đă ng ký bởi Windows với tên là “STATIC ” ■ không xử lý các sự ki ện bàn phím và mouse ■ không giao ti ếp với window cha qua message Nguy ễn Đạ t Thông 235 Lập trình C trên Windows - 2013
- Edit box ■ Edit box của Windows ■ Có “win class” được đă ng ký bởi Windows với tên là “EDIT ” ■ Hỗ tr ợ xử lý các thao tác ■ Gõ chu ỗi hoa – th ườ ng ■ Di chuy ển “caret”, Del, Backspace, Home, End ■ Copy (Ctrl+C) và Paste (Ctrl+V) Edit Control : Nguy ễn Đạ t Thông 236 Lập trình C trên Windows - 2013
- Style của Edit box ■ Window style ■ WS_CHILD ■ Edit box style Style Mô tả ES_LEFT , ES_CENTER , ES_RIGHT Canh lề chu ỗi đượ c nh ập ES_LOWERCASE , ES_UPPERCASE Chuy ển chu ỗi hoa – th ườ ng ES_NUMBER , ES_PASSWORD Xác đị nh lo ại chu ỗi nh ập ES_MULTILINE Cho phép nh ập nhi ều dòng ES_READONLY Ch ỉ đọ c, không th ể nh ập Edit box style: Nguy ễn Đạ t Thông 237 Lập trình C trên Windows - 2013
- Giao ti ếp của Edit box ■ Edit box giao ti ếp với window cha thông qua message WM_COMMAND ■ lParam : handle của edit box ■ LOWORD(wParam): đị nh danh (ID) của edit box ■ HIWORD(wParam): mã xác đị nh thông tin Mã thông điệp Mô tả EN_CHANGE Chu ỗi nh ập sẽ đượ c thay đổ i EN_UPDATE Chu ỗi nh ập đã đượ c thay đổ i EN_SETFOCUS Edit box đượ c focus EN_KILLFOCUS Edit box mất focus Nguy ễn Đạ t Thông 238 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên Edit box ■ Thực hi ện các thao tác trên Edit box ■ Sử dụng các hàm (macro) ■ Gửi message đế n edit box Macro Message Edit_GetText Edit_GetTextLength Edit_GetSel EM_GETSEL Edit_ReplaceSel EM_REPLACESEL Edit_LimitText EM_LIMITTEXT Edit_SetPasswordChar EM_SETPASSWORDCHAR Edit_SetReadOnly EM_SETREADONLY Edit_SetText Nguy ễn Đạ t Thông 239 Lập trình C trên Windows - 2013
- Cắt – dán trên Edit box ■ Thực hi ện các thao tác trên Edit box // cut current selected text SendMessage(hwndEdit, WM_CUT, 0, 0); // copy current selected text SendMessage(hwndEdit, WM_COPY, 0, 0); // clear (de-select) current selected text SendMessage(hwndEdit, WM_CLEAR, 0, 0); // paste clipboard text to the edit box SendMessage(hwndEdit, WM_PASTE, 0, 0); Nguy ễn Đạ t Thông 240 Lập trình C trên Windows - 2013
- List box ■ List box của Windows ■ Có “win class” được đă ng ký bởi Windows với tên là “LISTBOX ” ■ Hỗ tr ợ xử lý các thao tác ■ Hi ển th ị danh sách các item ■ Ch ọn 1 ho ặc nhi ều item trong danh sách ■ Highlight các item đượ c ch ọn ■ Duy ệt các item thông qua các phím di chuy ển List Box Control : Nguy ễn Đạ t Thông 241 Lập trình C trên Windows - 2013
- Style của List box ■ Window style ■ WS_CHILD ■ WS_BORDER ■ WS_VSCROLL ■ List box style Style Mô tả LBS_NOTIFY Giao ti ếp với window cha bằng WM_COMMAND LBS_SORT Tự độ ng sắp xếp các item LBS_MULTIPLESEL Cho phép ch ọn nhi ều item Nguy ễn Đạ t Thông 242 Lập trình C trên Windows - 2013
- Giao ti ếp của List box ■ List box giao ti ếp với window cha thông qua message WM_COMMAND ■ lParam : handle của list box ■ LOWORD(wParam): đị nh danh (ID) của list box ■ HIWORD(wParam): mã xác đị nh thông tin Mã thông điệp Mô tả LBN_SELCHANGE Sự lựa ch ọn item có thay đổ i LBN_DBLCLK Double-click trên một item LBN_SELCANCEL Bỏ ch ọn tất cả item LBN_SETFOCUS List box đượ c focus LBN_KILLFOCUS List box mất focus Nguy ễn Đạ t Thông 243 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên List box ■ Thao tác trên danh sách của List box ■ Thêm một item vào danh sách SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM) szItem); ■ Chèn một item vào danh sách SendMessage(hwndList, LB_INSERTSTRING, iIndex , (LPARAM) szItem); ■ Xóa một item kh ỏi danh sách SendMessage(hwndList, LB_DELETESTRING, iIndex , 0); Nguy ễn Đạ t Thông 244 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên List box ■ Thao tác trên danh sách của List box ■ Xóa toàn bộ danh sách item SendMessage(hwndList, LB_RESETCONTENT, 0, 0); ■ Vẽ lại List box khi danh sách thay đổi ■ Thêm ho ặc xóa một item ■ Thêm ho ặc xóa 1000 item? // temporary stop update the display of List box SendMessage(hwndList, WM_SETREDRAW, FALSE, 0); // turn back SendMessage(hwndList, WM_SETREDRAW, TRUE, 0); Nguy ễn Đạ t Thông 245 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên List box ■ Theo tác lựa chọn các item ■ Truy vấn số lượng item có trong List box iCount = SendMessage(hwndList, LB_GETCOUNT, 0, 0); ■ Truy vấn chu ỗi ký tự của một item // get text length of an item iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0); // get item text iLength = SendMessage(hwndList, LB_GETTEXT, iIndex, (LPARAM) szBuffer) ; Nguy ễn Đạ t Thông 246 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên List box ■ Thao tác lựa chọn các item ■ Truy vấn item đang được ch ọn iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0); ■ Ch ọn một item // iIndex = -1: deselect all items SendMessage(hwndList, LB_SETCURSEL, iIndex, 0); // select item which starts with a search string iIndex = SendMessage(hwndList, LB_SELECTSTRING, iIndex, (LPARAM) szSearchString) ; Nguy ễn Đạ t Thông 247 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên List box ■ Thao tác lựa chọn các item ■ Truy vấn một trong các item đang được ch ọn iSelect = SendMessage(hwndList, LB_GETSEL, iIndex, 0); ■ Ch ọn thêm một item // select an item SendMessage (hwndList, LB_SETSEL, TRUE, iIndex); // de-select an item SendMessage (hwndList, LB_SETSEL, FALSE, iIndex); Nguy ễn Đạ t Thông 248 Lập trình C trên Windows - 2013
- Ví dụ ■ Li ệt kê bi ến môi tr ường ( exe) /* ENVIRON.C Environment List Box (c) Charles Petzold, 1998 */ #include #define ID_LIST 1 #define ID_TEXT 2 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Environ") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ; Nguy ễn Đạ t Thông 249 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 250 Lập trình C trên Windows - 2013
- Scrollbar ■ Window Scrollbar ■ Tích hợp vào window có style WS_VSCROLL ho ặc WS_HSCROLL ■ Không có handle riêng. ■ Thành phần giao di ện Scrollbar ■ Có “win class” được đă ng ký bởi Windows với tên là “SCROLLBAR ” ■ Có style là SBS_VERT ho ặc SBS_HORZ ■ Là một thành ph ần giao di ện, có handle riêng. Scrollbar Control : Nguy ễn Đạ t Thông 251 Lập trình C trên Windows - 2013
- Window Scrollbar & Scrollbar Nguy ễn Đạ t Thông 252 Lập trình C trên Windows - 2013
- Scrollbar ■ Scrollbar của Windows hỗ tr ợ xử lý ■ Các phím di chuy ển Up, Down, Left, Right ■ Các phím Home, End, PageUp, PageDown ■ Giao ti ếp với window cha ■ Thông qua message WM_VSCROLL và WM_HSCROLL ■ lParam : handle của scrollbar ( NULL : window scrollbar) ■ LOWORD(wParam): thông tin scroll ■ HIWORD(wParam): thông tin thêm về vị trí scroll WM_HSCROLL : WM_VSCROLL : Nguy ễn Đạ t Thông 253 Lập trình C trên Windows - 2013
- Scrolling Nguy ễn Đạ t Thông 254 Lập trình C trên Windows - 2013
- Giao ti ếp với window cha ■ Message WM_VSCROLL và WM_HSCROLL Thao tác LOWORD(wParam) HIWORD(wParam) Scrolling SB_LINEUP, SB_LINELEFT, SB_LINEDOWN, SB_LINERIGHT Page SB_PAGEUP, scrolling SB_PAGEDOWN, SB_PAGELEFT, SB_PAGERIGHT Stop SB_ENDSCROLL scrolling Moving SB_THUMBPOSITION, Vị trí của thumb khi kết thúc thumb SB_THUMBTRACK Vị trí hi ện tại của thumb Nguy ễn Đạ t Thông 255 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên Scrollbar ■ Thao tác trên Scrollbar ■ Thi ết lập gi ới hạn của scrollbar // default range iMin = 0, iMax = 100 // hwnd: handle of window // set range for window scrollbar SetScrollRange(hwnd, SB_VERT , iMin, iMax, bRedraw); SetScrollRange(hwnd, SB_HORZ , iMin, iMax, bRedraw); // hwndScroll: handle of scrollbar control // set range for scrollbar control SetScrollRange(hwndScroll, SB_CTL , iMin, iMax, bRedraw); SetScrollRange : Nguy ễn Đạ t Thông 256 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên Scrollbar ■ Thao tác trên Scrollbar ■ Thi ết lập vị trí hi ện tại của scrollbar // iPos: an integer value // hwnd: handle of window // set thumb position of window scrollbar SetScrollPos(hwnd, SB_VERT , iPos, bRedraw); SetScrollPos(hwnd, SB_HORZ , iPos, bRedraw); // hwndScroll: handle of scrollbar control // set thumb position of scrollbar control SetScrollPos(hwndScroll, SB_CTL , iPos, bRedraw); SetScrollPos : Nguy ễn Đạ t Thông 257 Lập trình C trên Windows - 2013
- Thao tác cơ bản trên Scrollbar ■ Thao tác scroll window BOOL ScrollWindow( HWND hWnd, int XAmount, int YAmount, const RECT *lpRect, const RECT *lpClipRect ); ■ Scroll client-area (ho ặc một ph ần client-area) của window, và đánh dấu các vùng “invalid”. ■ Phát sinh message WM_PAINT nếu xu ất hi ện vùng “invalid” ScrollWindow : ScrollWindowEx : Nguy ễn Đạ t Thông 258 Lập trình C trên Windows - 2013
- Ví dụ ■ Window scrollbar (exe) /* SYSMETS3.C System Metrics Display Program No. 3 (c) Charles Petzold, 1998 */ #define WINVER 0x0500 #include #include "sysmets.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("SysMets3") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; Nguy ễn Đạ t Thông 259 Lập trình C trên Windows - 2013
- Ví dụ ■ Scrollbar control ( exe) /* COLORS1.C Colors Using Scroll Bars (c) Charles Petzold, 1998 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK ScrollProc (HWND, UINT, WPARAM, LPARAM) ; int idFocus ; WNDPROC OldScroll[3] ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Colors1") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; Nguy ễn Đạ t Thông 260 Lập trình C trên Windows - 2013
- Notes Nguy ễn Đạ t Thông 261 Lập trình C trên Windows - 2013
- Menu và Resource ■ Resource ■ Menu ■ Keyboard Accelerators Nguy ễn Đạ t Thông 262 Lập trình C trên Windows - 2013
- Resource ■ Resource là nơi lưu tr ữ ■ Hình ảnh icon ■ Hình ảnh cursor ■ Hình ảnh bitmap ■ Menu ■ Toolbar ■ Dialog Nguy ễn Đạ t Thông 263 Lập trình C trên Windows - 2013
- Tập tin Resource ■ Tập tin .rc ■ Mô tả từng thành ph ần resource ■ Tập tin .h ■ Đị nh danh từng thành ph ần resource ■ Tập tin .RES ■ Các thành ph ần resource đã được biên dịch ■ Được sử dụng để liên kết với các tập tin object Nguy ễn Đạ t Thông 264 Lập trình C trên Windows - 2013
- Tạo một tập tin .rc ■ Trong Visual Studio Nguy ễn Đạ t Thông 265 Lập trình C trên Windows - 2013
- Thêm một Resource ■ Trong Resource View Nguy ễn Đạ t Thông 266 Lập trình C trên Windows - 2013
- Thêm một icon ■ Trong “icon editor” Nguy ễn Đạ t Thông 267 Lập trình C trên Windows - 2013
- Tập tin .rc ■ Chứa mô tả của icon // Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // Nguy ễn Đạ t Thông 268 Lập trình C trên Windows - 2013
- Tập tin .h ■ Chứa đị nh danh của icon //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by myres.rc // #define IDI_ICON1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif Nguy ễn Đạ t Thông 269 Lập trình C trên Windows - 2013
- Biên dịch tập tin Resource ■ Biên dịch bằng Visual Studio ■ Biên dịch bằng command line Nguy ễn Đạ t Thông 270 Lập trình C trên Windows - 2013
- Menu ■ Thêm menu vào Resource bằng “Menu editor” Menus: Nguy ễn Đạ t Thông 271 Lập trình C trên Windows - 2013
- Tập tin Resource của Menu ■ Tập tin .rc // Menu MYMENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New \tCtrl+N", ID_FILE_NEW40001 MENUITEM SEPARATOR MENUITEM "E&xit\tAlt+X", ID_FILE_EXIT END // END Nguy ễn Đạ t Thông 272 Lập trình C trên Windows - 2013
- Tập tin Resource của Menu ■ Tập tin .h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by myres.rc // #define IDI_ICON1 101 #define ID_FILE_NEW40001 40001 #define ID_FILE_EXIT 40002 #define ID_VIEW_BASIC 40003 #define ID_VIEW_ADVANCED 40004 #define ID_ADVANCED_MOREADVANCED 40005 #define ID_ADVANCED_MOREMORE 40006 #define ID_MOREMORE_MOREMOREMORE 40007 Nguy ễn Đạ t Thông 273 Lập trình C trên Windows - 2013
- Sử dụng Menu ■ Gán Menu cho một window ■ Khi đă ng ký window class ho ặc CreateWindow WNDCLASS wndclass ; wndclass.lpszMenuName = TEXT(" MYMENU "); ■ Khi kh ởi tạo window với LoadMenu và SetMenu HMENU hMenu ; switch (message) { case WM_CREATE: hMenu = LoadMenu (hInst, TEXT(" MYMENU ")); SetMenu (hwnd, hMenu); return 0 ; LoadMenu : SetMenu : Nguy ễn Đạ t Thông 274 Lập trình C trên Windows - 2013
- Giao ti ếp của Menu ■ Menu giao ti ếp với window cha thông qua message WM_COMMAND ■ lParam : 0 ■ LOWORD(wParam): đị nh danh của menu item ■ HIWORD(wParam): 0 MENUITEM "E&xit", ID_FILE_EXIT #define ID_FILE_EXIT 40002 WM_MENUSELECT : Nguy ễn Đạ t Thông 275 Lập trình C trên Windows - 2013
- Xử lý message Menu ■ Trong hàm WinProc case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_NEW40001: return 0; case ID_FILE_EXIT: return 0; case ID_VIEW_BASIC: return 0; case ID_ADVANCED_MOREADVANCED: return 0; } Nguy ễn Đạ t Thông 276 Lập trình C trên Windows - 2013
- Thao tác trên Menu ■ Truy vấn Menu của một Window HMENU WINAPI GetMenu( HWND hWnd ); GetMenu : ■ Truy vấn Menu con của một Menu HMENU WINAPI GetSubMenu( HMENU hMenu, int nPos ); GetSubMenu : Nguy ễn Đạ t Thông 277 Lập trình C trên Windows - 2013
- Thao tác trên Menu ■ Truy vấn thông tin của một Menu item BOOL WINAPI GetMenuItemInfo( HMENU hMenu, UINT uItem, BOOL fByPosition, LPMENUITEMINFO lpmii ); ■ fByPosition ■ TRUE : uItem là vị trí của menu item ■ FALSE : uItem là đị nh danh của menu item GetMenuItemInfo : MENUITEMINFO : Nguy ễn Đạ t Thông 278 Lập trình C trên Windows - 2013
- Thao tác trên Menu ■ Vô hi ệu hóa một Menu item BOOL WINAPI EnableMenuItem( HMENU hMenu, UINT uIDEnableItem, UINT uEnable ); ■ uEnable bao gồm ■ MF_BYCOMMAND : uIDEnableItem là đị nh danh ■ MF_BYPOSITION : uIDEnableItem là vị trí ■ MF_DISABLE : menu item không th ể đượ c ch ọn ■ MF_ENABLE : menu item có th ể đượ c ch ọn ■ MF_GRAY: menu item bị mờ và không th ể đượ c ch ọn EnableMenuItem : Nguy ễn Đạ t Thông 279 Lập trình C trên Windows - 2013
- Thao tác trên Menu ■ Đánh dấu (check) một Menu item DWORD WINAPI CheckMenuItem( HMENU hmenu, UINT uIDCheckItem, UINT uCheck ); ■ uCheck bao gồm ■ MF_BYCOMMAND : uIDCheckItem là đị nh danh ■ MF_BYPOSITION : uIDCheckItem là vị trí ■ MF_CHECKED : đánh dấu menu item ■ MF_UNCHECKED : bỏ đánh dấu menu item CheckMenuItem : Nguy ễn Đạ t Thông 280 Lập trình C trên Windows - 2013
- Thao tác trên Menu ■ Tạo menu bằng code (programmatically) CreateMenu : CreatePopupMenu : TrackPopupMenu : ■ Thêm menu item AppendMenu : InsertMenu : InsertMenuItem : Nguy ễn Đạ t Thông 281 Lập trình C trên Windows - 2013