Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Lập trình hệ thống GV: Trần Nhật Hóa Bm: Cơng nghệ PM Chương Cơ sở lập trình hệ thống Môi trường Windows Giao tiếp người dùng đồ họa Đa nhiệm Chia sẻ thủ tục mà Windows cung cấp Sử dụng thư viện liên kết động (DLL) Có tính tương thích cao Xây dựng dựa kiến trúc mở Hoạt động ứng dụng Theo hướng kiện Ứng dụng: Được xây dựng không thiết chứa trong file Cửa sổ: Xuất trực quan hình, thành phần giao tiếp ứng dụng người dùng gồm thành phần bản: tiêu đề đường viền cửa sổ vùng làm việc (vùng client…) Các khái niệm Sự kiện (Event) Là tác động hay hoạt động ảnh hưởng đến ứng dụng (chương trình) Phân loại: Các kiện đến từ người dùng Các kiện đến từ hệ thống Chỉ xem xét kiện đến từ phía người dùng Các khái niệm (tt) Thông điệp (Message): Một kiện xảy phát sinh thông điệp Thông điệp cho biết chất kiện Thơng điệp kèm thông tin bổ sung chứa thông số Hàng đợi thơng điệp (Message queue) Mỗi ứng dụng có hàng đợi để chứa thơng điệp dành cho (tn theo ngun tắc FIFO) Hàng đợi thông điệp Windows cung cấp Các thơng điệp vào hàng đợi khơng tùy thuộc vào độ ưu tiên thông điệp Các khái niệm (tt) Vịng lặp thơng điệp (Message loop) Vịng lặp thơng điệp có chức lấy thông điệp từ hàng đợi để gửi cho chương trình xử lý Vịng lặp thơng điệp phải cài đặt từ phía ứng dụng Thủ tục xử lý thơng điệp Do chương trình cung cấp để xử lý kiện cần thiết Các thông điệp xử lý không xử lý chương trình gửi cho thủ tục xử lý mặc định Chương 2: Kiến trúc chương trình Có hai cách tiếp cận cho kiến trúc chương trình C/Windows, là: - Theo hướng thơng điệp (sự kiện) Theo hướng thành phần Theo hướng kiện Sơ đồ (hình bên) Mơ tả (…) Theo hướng thành phần Windows Windows Sơ đồ (hình bên) Mơ tả (…) Window API WinMain() WinMain() Khởi động biến định Khởi động biến định nghĩa cửa sổ Tạo lập cửa nghĩa cửa sổ Tạo lập cửa sổ sổ Chương trình ứng dụng Thơng điệp Thơng điệp Khởi động Khởi động chương trình chương trình Lời gọi API Lời gọi API WndProc() WndProc() Xử lý thông điệp Xử lý thơng điệp Ví dụ (HelloMsg) #include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, TEXT ("Hello, Windows"), TEXT ("HelloMsg"), 0) ; return ; } Kết quả: Ví dụ (tt) Kết Các thông điệp chuột vùng nonclient Các thông điệp bao gồm: Thông thường ta đưa thông điệp cho DefWindowProc xử lý Thông điệp Hit-Test Thông điệp WM_NCHITTEST trước tất thông điệp vùng client nonclient Các ứng dụng thường đưa thông điệp cho DefWindowProc xử lý, giá trị trả xử lý thông điệp WM_NCHITTEST thông số wParam thông điệp chuột HTCLIENT HTNOWHERE HTTRANSPARENT window HTERROR Vùng client Không thuộc cửa sổ A window covered by another Tạo tiếng beep Thông điệp Hit-Test (tt) Nếu giá trị trả HTCLIENT, Windows chuyển tọa độ hình thành tọa độ vùng client tạo thông điệp chuột vùng client Ta cấm chức chuột cách bẫy thơng điệp: case WM_NCHITTEST: return (LRESULT) HTNOWHERE ; Thông điệp tạo thông điệp Windows sử dụng WM_NCHITTEST để tạo thơng điệp chuột khác Ví dụ: Double-click vào system menu icon -> WM_NCHITTEST Thông điệp WM_NCLBUTTONDBLCLK đặt vào hàng đợi với wParam HTSYSMENU Thông điệp WM_SYSCOMMAND với wParam SC_CLOSE DefWindowProc gửi thông điệp WM_CLOSE cho thủ tục cửa sổ Chương BỘ ĐỊNH THỜI (TIMER) Những khái niệm Tác vụ mang tính định kỳ Được cài đặt ứng dụng để thực nhiệm vụ: Đa nhiệm Cập nhật trạng thái Cơ chế tự động Thiết kế ứng dụng hoạt hình Một số lưu ý Thơng điệp WM_TIMER xử lý bình đẳng tất thông điệp khác Windows không đặt vào hàng đợi hàng loạt thông điệp WM_TIMER Ta khơng thể biết có thơng điệp WM_TIMER bị bỏ qua Phương pháp sử dụng TIMER Phương pháp 1: Yêu cầu Windows gửi thông điệp WM_TIMER gửi đến hàm WndProc hàm: SetTimer (hwnd, 1, uiMsecInterval, NULL) ; Các tham số: Timer ID, khác Số nguyên 32-bit không dấu xác định mili giây (60,000 -> phút) Hủy bỏ định thời Timer lời gọi: KillTimer (hwnd, 1) ; Tham số thứ Timer ID Phương pháp (tt) Khi nhận WM_TIMER, wParam xác định ID Timer Cách sử dụng Định nghĩa ID cho Timer: #define TIMER_SEC #define TIMER_MIN Tạo Timer: SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ; Phương pháp (tt) Cấu trúc xử lý: Ví dụ (Beeper1) case WM_CREATE: SetTimer (hwnd, ID_TIMER, 1000*2, NULL) ; SetTimer (hwnd, ID_TIMER2, 1500*2, NULL) ; return ; case WM_TIMER : MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; InvalidateRect (hwnd, NULL, FALSE) ; return ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rc) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; EndPaint (hwnd, &ps) ; DeleteObject (hBrush) ; return ; case WM_DESTROY : KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return ; Phương pháp Gọi trực tiếp hàm xây dựng cho việc xử lý định thời (gọi call-back) Xây dựng hàm: Thiết lập định thời: SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ; Ví dụ (Beeper2) VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; RECT rc ; MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; GetClientRect (hwnd, &rc) ; hdc = GetDC (hwnd) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; ReleaseDC (hwnd, hdc) ; DeleteObject (hBrush) ; } Phương pháp Thiết lập lời gọi hàm: iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ; Hủy bỏ: KillTimer (NULL, iTimerID) ; ... Khởi động biến định nghĩa cửa sổ Tạo lập cửa nghĩa cửa sổ Tạo lập cửa sổ sổ Chương trình ứng dụng Thông điệp Thông điệp Khởi động Khởi động chương trình chương trình Lời gọi API Lời gọi API WndProc()...Chương Cơ sở lập trình hệ thống Mơi trường Windows Giao tiếp người dùng đồ họa Đa nhiệm Chia sẻ thủ tục... GetTextMetricts lần chương trình kích thước font hệ thống không thay đổi Nên đặt lời gọi hàm việc xử lý thông điệp WM_CREATE Sử dụng hai biến để lưu chiều rộng trung bình tổng chiều cao kí tự static