Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
56,42 KB
Nội dung
CHƯƠNG TỔNG QUAN LẬP TRÌNH C TRÊN WINDOWS 1.1 MỞ ĐẦU Để lập trình Microsoft Windows®, cần nắm đặc điểm hệ điều hành Chương giới thiệu khái quát đặc điểm hệ điều hành Microsoft Windows, vấn đề liên quan đến lập trình ngơn ngữ C, đồng thời đưa chương trình mẫu làm sườn cho chương trình viết sau Trong phần đầu, tìm hiểu sơ lược lịch sử phát triển hệ điều hành Microsoft Windows® đặc điểm tảng Windows Phần trình bày khái niệm yêu cầu việc lập trình C Windows Ngồi ra, phần giới thiệu chế công cụ mà hệ điều hành cung cấp cho người lập trình hay người phát triển ứng dụng Windows Cuối chương phần xây dựng chương trình đơn giản Windows Chương trình xem khn mẫu chương trình ứng dụng điển hình, hầu hết đoạn chương trình viết minh họa sách lấy chương trình làm khung sườn để phát triển cho phù hợp với yêu cầu Thêm vào đó, số kiểu liệu định nghĩa Windows qui ước cách đặt tên biến giới thiệu phần Phần chi tiết chuyên sâu việc lập trình ngơn ngữ C mơi trường Windows trình bày chương 1.2 HỆ ĐIỀU HÀNH MICROSOFT WINDOWS 1.2.1 Giới thiệu Giữa thập niên 80, cơng ty phần mềm máy tính Microsoft cơng bố phiên dịng hệ điều hành Windows Microsoft Windows® 1.0 Đây hệ điều hành dùng giao diện đồ họa khác với giao diện ký tự (text hay console) MS-DOS Tuy nhiên phải đến phiên thứ hai (Windows 2.0 - tháng 11 năm 1987) có bước cải tiến đáng kể, mở rộng giao tiếp bàn phím thiết bị chuột giao diện đồ họa (GUI-Graphic User Interface) trình đơn (menu) hộp thoại (dialog) Trong phiên Windows yêu cầu vi xử lý Intel 8086 hay 8088 chạy real-mode để truy xuất megabyte nhớ Tháng năm 1990, Microsoft công bố phiên Windows 3.0 Sự thay đổi lớn phiên Windows 3.0 hỗ trợ protected-mode 16 bit vi xử lý 286, 386, 486 Intel Sự thay đổi cho phép ứng dụng Windows truy xuất 16 megabyte nhớ Tiếp bước với phát triển phiên Windows 3.1 đời năm 1992, Microsoft đưa công nghệ Font TrueType, âm nhạc (multimedia), liên kết nhúng đối tượng (OLE- Object Linking and Embedding), đưa hộp thoại chung chuẩn hóa Trong phát triển mạnh mẽ thập niên 90, Microsoft cơng bố tiếp dịng hệ điều hành Windows với ứng dụng công nghệ (1993) Hệ điều hành lấy tên Windows® NT® (Windows New Technology), phiên hệ điều hành Windows hỗ trợ 32 bit cho xử lý 386, 486 Pentium Trong hệ điều hành ứng dụng phải truy xuất nhớ với địa 32-bit tập lệnh hay thị 32-bit Ngoài Windows NT thiết kế để chạy vi xử lý (CPU) khác Intel chạy máy trạm (workstation) Hệ điều hành Windows 95 công bố năm 1995 hệ điều hành 32-bit cho Intel 386 trở sau Tuy thiếu tính bảo mật Windows NT việc thích nghi với máy trạm cơng nghệ RISC, bù lại hệ điều hành yêu cầu phần cứng không cao Song song với phát triển phần mềm cơng nghệ phần cứng phát triển khơng Để tận dụng sức mạnh phần cứng hệ Windows ngày hoàn thiện Như Windows 98 phát triển từ Window 95 có nhiều cải thiện hiệu làm việc, hỗ trợ thiết bị phần cứng tốt hơn, cuối việc tích hợp chặt chẽ với Internet Word Wide Web Windows 2000 hệ điều hành xem ổn định tốt dòng Windows, phiên tăng cường tính bảo mật thích hợp mội trường mạng giao diện đẹp 1.2.2 Đặc điểm chung hệ điều hành Microsoft Windows Windows hệ điều hành sử dụng giao tiếp người dùng đồ họa (GUI), hay gọi hệ điều hành trực quan (Visual interface) GUI sử dụng đồ họa dựa hình ảnh nhị phân (Bitmapped video display) Do tận dụng tài nguyên thực hình, cung cấp mơi trường giàu tính trực quan sinh động Windows không đơn điệu MS-DOS (hay số hệ điều hành giao diện console) mà hình sử dụng để thể chuỗi ký tự, người dùng gõ từ bàn phím (keyboard) hay để xuất thông tin dạng văn Trong giao diện người dùng đồ họa, hình giao tiếp với người sử dụng đa dạng hơn, người dùng nhập liệu thông qua chuột cách nhấn vào nút nhấn (button) hôp chọn (combo box)…thiết bị nhập, bàn phím thiết bị chuột (mouse device) Thiết bị chuột thiết bị định vị hình, sử dụng thiết bị chuột người dùng nhập liệu cách trực quan cách kích hoạt nút lệnh, hay làm việc với đối tượng đồ họa liên quan đến tọa độ hình Để giao tiếp môi trường đồ họa, Windows đưa số thành phần gọi điều khiển chung (common control), điều khiển chung đối tượng đưa vào hộp thoại để giao tiếp với người dùng Bao gồm : hộp văn (text box), nút nhấn (button), nút chọn (check box), hộp danh sách (list box), hộp chọn (combo box)… Thật ứng dụng Windows khơng phải q phức tạp chúng có hình thức chung Chương trình ứng dụng thuờng chiếm phạm vi hình chữ nhật hình gọi cửa sổ Trên cửa sổ tiêu đề (title bar) Các chức chương trình liệt kê thực đơn lựa chọn chương trình (menu) , hay xuất dạng trực quan công cụ (toolbar) Các công cụ chứa chức sử dụng thường xuyên thực đơn để giảm thời gian cho người dùng phải mở thực đơn chọn Thông thường cần lấy thông tin hay cung cấp thơng tin cho người dùng ứng dụng đưa hộp thoại, hộp thoại chứa điều khiển chung để giao tiếp với người dùng Windows tạo số hộp thoại chuẩn Open Files, số hộp thoại tương tự Windows hệ điều hành đa nhiệm, tùy thuộc vào nhớ mà ta chạy nhiều ứng dụng lúc, đồng thời chuyển qua lại ứng dụng thực thi chúng Trong phiên Windows® 98 NT® trở sau, chương trình ứng dụng tự thân chúng chia thành nhiều tiểu trình (thread) để xử lý với tốc độ xử lý nhanh tạo cảm giác chương trình ứng dụng chạy đồng thời với Trong Windows, chương trình ứng dụng thực thi chia sẻ thủ tục mà Windows cung cấp sẵn, tập tin cung cấp thủ tục gọi thư viện liên kết động (Dynamic Link Libraries - DLL) Windows có chế liên kết chương trình ứng dụng với thủ tực cung cấp thư viện liên kết động Khả tương thích Windows cao Các chương trình ứng dụng viết cho Windows khơng truy xuất trực tiếp phần cứng thiết bị đồ hoạ hình máy in Mà thay vào đó, hệ điều hành cung cấp ngơn ngữ lập trình đồ họa (gọi Giao tiếp thiết bị đồ hoạ - Graphic Device Interface - GDI) cho phép hiển thị đối tượng đồ họa cách dễ dàng Nhờ ứng dụng viết cho Windows chạy với thiết bị hình hay máy in, miễn cài đặt trình điều khiển thiết bị hỗ trợ cho Windows Chương trình ứng dụng không quan tâm đến kiểu thiết bị kết nối với hệ thống Như giới thiệu phần khái niệm liên kết động thành phần quan trọng Windows, xem hạt nhân hệ điều hành, thân Windows tập thư viện liên kết động Windows cung cấp nhiều hàm cho chương trình ứng dụng để cài đặt giao diện người dùng hiển thị văn hay đồ họa hình Những hàm cài đặt thư viện liên kết động hay gọi DLL Đó tập tin có dạng phần mở rộng *.DLL hay *.EXE, hầu hết chứa thư mục \Windows\System, \Windows\system32 Windows® 98 thư mục \WinNT\System, \WinNT\System32 Windows® NT® Trong phiên sau này, hệ thống liên kết động tạo nhiều, nhiên, hầu hết hàm gọi thư viện phân thành đơn vị sau: Kernel, User, GDI Kernel cung cấp hàm thủ tục mà hạt nhân hệ điều hành truyền thống quản lý, quản lý nhớ, xuất nhập tập tin tác vụ Thư viện cài đặt tập tin KRNL386.EXE 16 bit KERNEL32.DLL 32 bit User quản lý giao diện người dùng, cài đặt tất khung cửa sổ mức luận lý Thư viện User cài đặt tập tin USER.EXE 16 bit USER32.DLL 32 bit GDI cung cấp toàn giao diện thiết bị đồ hoạ (Graphics Device Interface), cho phép chương trình ứng dụng hiển thị văn đồ hoạ thiết bị xuất phần cứng hình máy in Trong Windows 98, thư viện liên kết động chứa khoảng vài ngàn hàm, hàm có tên đặc tả, ví dụ CreateWindow, hàm dùng để tạo cửa sổ cho ứng dụng Khi sử dụng hàm mà Windows cung cấp cho ứng dụng phải khai báo tập tin tiêu đề h hay hpp (header file) Trong chương trình Windows, có khác biệt ta gọi hàm thư viện C hàm Windows hay thư viện liên kết động cung cấp Đó biên dịch mã máy, hàm thư viện C liên kết thành mã chương trình Trong hàm Windows gọi chương trình cần dùng đến khơng liên kết vào chương trình Để thực lời gọi chương trình Windows *.EXE ln chứa tham chiếu đến thư viện liên kết động khác mà cần dùng Khi đó, chương trình Windows nạp vào nhớ tạo trỏ tham chiếu đến hàm thư viện DLL mà chương trình dùng, thư viện chưa nạp vào nhớ trước nạp 1.3 LẬP TRÌNH TRÊN MICROSOFT WINDOWS 1.3.1 Đặc điểm chung Windows hệ điều hành đồ họa trực quan, dó tài nguyên hệ thống cung cấp đa dạng đòi hỏi người lập trình phải nghiên cứu nhiều để phát hay mạnh hệ điều hành Theo mục đích tiếp cận nhà lập trình ứng dụng Windows phải thân thiện với người dùng thông qua giao diện đồ họa sẵn có Windows Về lý thuyết người dùng làm việc với ứng dụng Windows làm việc với ứng dụng khác Nhưng thực tế để sử dụng ứng dụng cho đạt hiệu cao Windows cần phải có số huấn luyện trợ giúp hay tối thiểu phải cho biết chương trình ứng dụng làm việc Đa số ứng dụng Windows có chung giao diện tương tác với người dùng giống Ví dụ ứng dụng Windows đa số có thực đơn chứa mục : File, Edit, Tool, Help… Và hộp thoại thường chứa phần tử điều khiển chung : Edit Control, Button Control, Checkbox… 1.3.2 Sự khác biệt với lập trình MS-DOS Khi bước vào lập trình Windows đa số người học lạ lẫm, người làm việc với MS-DOS Do MS-DOS hệ điều hành đơn nhiệm giao tiếp qua giao diện console Nên viết chương trình khơng phức tạp Cịn Windows người lập trình làm việc với cơng cụ lập trình đồ họa đa dạng với cách xử lý đa nhiệm, đa luồng Windows Vì việc lập trình Windows giúp cho người lập trình đỡ nhàm chán với giao diện console MS-DOS Việc cố gắng phát huy sức mạnh tài nguyên Windows làm cho ứng dụng mạnh mẽ, đa dạng, thân thiện, dễ sử dụng 1.3.3 Một số yêu cầu người lập trình Điều trước tiên người học lập trình C Windows phải biết lập trình C, sách khơng có tham vọng hướng dẫn người học thơng thạo lập trình C Windows mà chưa qua lớp huấn luyện C Tuy nhiên, khơng thiết phải hồn tồn thơng thạo C học lập trình Windows Để lập trình Windows ngồi u cầu việc sử dụng cơng cụ lập trình, người học cịn cần phải có Windows, tối thiểu dùng qua số ứng dụng Windows Thật u cầu khơng q khó khăn người học Windows quen thuộc với người, người mà sử dụng máy tính Ngồi u cầu trên, đơi người lập trình Windows cần có khiếu thẩm mỹ, cách trình bày hình ảnh, điều khiển hộp thoại tốt làm cho ứng dụng tiện lợi, rõ ràng, thân thiện với người dùng 1.3.4 Bộ công cụ giao diện lập trình ứng dụng API Hệ điều hành Windows cung cấp hàng trăm hàm ứng dụng sử dụng truy cập tài nguyên hệ thống Những hàm gọi giao diện lập trình ứng dụng API (Application Programming Interface) Những hàm chứa thư viện liên kết động DLL hệ thống Nhờ có cấu trúc động ứng dụng truy cập đến hàm Khi biên dịch chương trình, đến đoạn mã gọi hàm API chương trình dịch khơng thêm mã hàm vào mã thực thi mà thêm tên DLL chứa hàm tên hàm Do mã hàm API thực tế không sử dụng xây dựng chương trình, thêm vào chương trình nạp vào nhớ để thực thi Trong API có số hàm có chức trì độc lập thiết bị đồ họa, hàm gọi giao diện thiết bị đồ họa GDI (Graphics Device Interface) Do độc lập thiết bị nên hàm GDI cho phép ứng dụng làm việc tốt với nhiều kiểu thiết bị đồ họa khác 1.3.5 Cơ chế thông điệp Không giống ứng dụng chạy MS-DOS, ứng dụng Win32® xử lý theo kiện (event - driven), theo chế ứng dụng viết liên tục chờ cho hệ điều hành truyền liệu nhập vào Hệ thống đảm nhiệm việc truyền tất liệu nhập ứng dụng vào cửa sổ khác ứng dụng Mỗi cửa sổ có riêng hàm gọi hàm xử lý cửa sổ thường đặt tên WndProc, hệ thống gọi hàm có liệu nhập truyền đến cửa sổ, hàm xử lý liệu nhập trả quyền điều khiển cho hệ thống Hệ thống truyền liệu nhập vào thủ tục xử lý cửa sổ thông qua hình thức gọi thơng điệp (message) Thơng điệp phát sinh từ ứng dụng hệ thống Hệ thống phát sinh thơng điệp có kiện nhập vào (input even), ví dụ người dùng nhấn phím, di chuyển thiết bị chuột, hay kích vào điều khiển (control) cuộn,… Ngồi hệ thống phát sinh thơng điệp để phản ứng lại thay đổi hệ thống ứng dụng mang đến, điều xảy ứng dụng làm cạn kiệt tài nguyên hay ứng dụng tự thay đổi kích thước cửa sổ Một ứng dụng phát sinh thơng điệp cần yêu cầu cửa sổ thực nhiệm vụ hay dùng để thông tin cửa sổ Hệ thống gởi thông điệp vào thủ tục xử lý cửa sổ với bốn tham số: định danh cửa sổ, định danh thơng điệp, hai tham số cịn lại gọi tham số thông điệp (message parameters) Định danh cửa sổ xác định cửa sổ mà thông điệp định Hệ thống dùng định danh để xác định cần phải gởi thông điệp đến thủ tục xử lý cửa sổ Định danh thông điệp số thể mục đích thơng điệp Khi thủ tục xử lý cửa sổ nhận thông điệp dùng định danh để biết hình thức cần thực Ví dụ, thơng điệp truyền đến thủ tục cửa sổ có định danh WM_PAINT có ý nghĩa cửa sổ vùng làm việc thay đổi cần phải vẽ lại vùng Tham số thông điệp lưu giá trị hay vị trí liệu, dùng thủ tục cửa sổ xử lý thông điệp Tham số phụ thuộc vào loại thơng điệp truyền đến, số nguyên, tập bit dùng làm cờ hiệu, hay trỏ đến cấu trúc liệu đó,… Khi thơng điệp khơng cần dùng đến tham số hệ thống thiết lập tham số có giá trị NULL Một thủ tục cửa sổ phải kiểm tra xem với loại thông điệp cần dùng tham số để định cách sử dụng tham số Có hai loại thông điệp : Thông điệp định nghĩa hệ thống (system-defined messages) : Dạng thông điệp hệ thống định nghĩa cho cửa sổ, điều khiển, tài nguyên khác hệ thống Thường bắt đầu với tiền tố sau : WM_xxx, LB_xxx, CB_xxx,… Thông điệp định nghĩa ứng dụng (application-defined message) : Một ứng dụng tạo riêng thông điệp để sử dụng cửa sổ hay truyền thơng tin cửa sổ ứng dụng Nếu ứng dụng định nghĩa thông điệp riêng thủ tục cửa sổ nhận thơng điệp phải cung cấp hàm xử lý tương ứng Đối với thơng điệp hệ thống, cung cấp giá trị định danh từ 0x0000 đến 0x03FF, ứng dụng khơng định nghĩa thơng điệp có giá trị khoảng Thông điệp ứng dụng định nghĩa có giá trị định danh từ 0x0400 đến 0x7FFF Lộ trình thơng điệp từ lúc gởi đến lúc xử lý có hai dạng sau: Thơng điệp gởi vào hàng đợi thông điệp để chờ xử lý (queue message): bao gồm kiểu thông điệp phát sinh từ bàn phím, chuột thơng điệp : WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, WM_CHAR Thông điệp gởi trực tiếp đến thủ tục xử lý không qua hàng đợi (nonqueue message), bao gồm thông điệp thời gian, thông điệp vẽ, thơng điệp WM_TIMER, WM_PAINT, WM_QUIT Xử lý thơng điệp : Một ứng dụng phải xóa xử lý thông điệp gởi tới hàng đợi ứng dụng Đối với ứng dụng đơn tiểu trình sử dụng vịng lặp thơng điệp (message loop) hàm WinMain để nhận thông điệp từ hàng đợi gởi tới thủ tục xử lý cửa sổ tương ứng Với ứng dụng nhiều tiểu trình tiểu trình có tạo cửa sổ có vịng lặp thơng điệp để xử lý thơng điệp cửa sổ tiểu trình 1.4 CÁCH VIẾT MỘT ỨNG DỤNG TRÊN MICROSOFT WINDOWS 1.4.1 Các thành phần tạo nên ứng dụng 1.4.1.1 Cửa sổ Trong ứng dụng đồ họa 32-bit, cửa sổ (window) vùng hình chữ nhật hình, nơi mà ứng dụng hiển thị thông tin nhận thông tin vào từ người sử dụng Do vậy, nhiệm vụ ứng dụng đồ họa 32-bit tạo cửa sổ Một cửa sổ chia sẻ hình với cửa sổ khác ứng dụng hay ứng dụng khác Chỉ cửa sổ thời điểm nhận thông tin nhập từ người dùng Người sử dụng dùng bàn phím, thiết bị chuột hay thiết bị nhập liệu khác để tương tác với cửa sổ ứng dụng Tất cửa sổ tạo từ cấu trúc cung cấp sẵn gọi lớp cửa sổ (window class) Cấu trúc tập mô tả thuộc tính mà hệ thống dùng khn mẫu để tạo nên cửa sổ Mỗi cửa sổ phải thành viên lớp cửa sổ Tất lớp cửa sổ xử lý riêng biệt 1.4.1.2 Hộp thoại điều khiển Hộp thoại (Dialog) dùng để tương tác với người dùng chương trình ứng dụng Một hộp thoại thường chứa nhiều khiển ô nhập văn (edit text), nút bấm (button), ghi (static control), hộp danh sách (list box)… Nút bấm (button): gồm có Push Button dùng kích hoạt thao tác, Check Box dùng để chọn hai trạng thái (TRUE hay FALSE), Radio Button giống Check Box nhóm Radio Button phải chọn loại trừ Chú thích (static): dùng để chứa ghi hộp thoại, ngồi nội dung thay đổi q trình sử dụng hộp thoại Hộp liệt kê (list box): Chọn hay nhiều liệu liệt kê danh sách, hộp chứa nhiều dòng hộp khơng hiển thị hết mẫu thơng tin phải kèm theo cuộn (scroll bar) Ô nhập văn (edit text): Dùng nhập văn bản, ô có nhiều dịng thường kèm theo cuộn Thanh cuộn (scroll bar): việc dùng kèm với list box hay edit box cuộn cịn sử dụng độc lập nhằm tạo thước đo… Thực đơn (menu): danh sách chứa thao tác với định danh mà người dùng chọn Hầu hết ứng dụng có cửa sổ thiếu thực đơn Thanh công cụ (toolbar): dạng menu chứa thao tác cần thiết dạng biểu tượng đặc trưng Ngồi cịn nhiều điều khiển mà cơng cụ lập trình cung cấp cho người lập trình hay tự họ tạo dựa thành phần cung cấp sẵn 1.4.1.3 Ứng dụng điển hình Windows 1.4.1.4 Các kiểu tập tin để xây dựng ứng dụng Windows Chương trình nguồn Tương tự chương trình C chuẩn, bao gồm tập tin tiêu đề (header) chứa tập tin *.h, *.hpp Còn mã nguồn (source code) chứa tập tin *.c hay *.cpp Tập tin định nghĩa Tập tin có phần mở rộng *.def, dùng định nghĩa điều khiển chương trình tạo viết ứng dụng tạo DLL, ngồi cịn dùng để khai báo vùng nhớ heap chạy chương trình Lúc trước vấn đề tương thích với Windows 3.1 nên tập tin thường dùng, cịn ngày chúng dùng đến Các file chứa tài nguyên ứng dụng • Các file *.ico biểu tượng (icon) dùng chương trình Thơng thường cơng cụ lập trình Windows có tool để tạo ảnh • Con trỏ chuột ứng dụng vẽ lại dạng biểu tượng lưu đĩa với dạng file *.cur • Các file dạng ảnh bitmap dùng để minh họa lưu dạng file *.bmp • Tập tin tài nguyên *.rc phần khai báo tài nguyên thực đơn, hộp thoại, định danh đến tập tin dạng *.ico, *.cur, *.bmp, 1.4.1.5 Các kiểu liệu Các kiểu liệu Windows thường định nghĩa nhờ toán tử typedef tập tin windows.h hay tập tin khác Thông thường tập tin định nghĩa Microsoft viết cơng ty viết trình biên dịch C tạo ra, thiết phải tương thích với hệ điều hành Windows 98, hay NT dựa kiến trúc 32-bit Một vài kiểu liệu có tên viết tắt dễ hiểu UINT liệu thường dùng mà đơn giản kiểu unsigned int, Windows 9x kiểu có kích thước 32-bit Đối với kiểu chuỗi có kiểu PSTR kiểu trỏ đến chuỗi tương tự char* Tuy nhiên, có số kiểu khái báo tên thiếu rõ ràng WPARAM LPARAM Tên đặt có nguồn ngốc lịch sử sâu xa Khi hệ điều hành Windows 16bit tham số thứ hàm WndProc khai báo kiểu WORD, với kích thước 16-bit , cịn tham số thứ có kiểu LONG 32-bit Đây lý người ta thêm tiến tố "W", "L" vào từ "PARAM" Tuy nhiên, phiên Windows 32-bit, WPARAM định nghĩa UINT LPARAM định nghĩa kiểu LONG, hai tham số có giá trị 32-bit Điều nhầm lẫn WORD giá trị 16-bit Window 98 Trong thủ tục xử lý cửa sổ WndProc giá trị trả kiểu LRESULT Kiểu đơn giản định nghĩa kiểu LONG Ngồi ra, có kiểu thường xuyên dùng kiểu HANDLE số nguyên 32-bit sử dụng kiểu định danh Có nhiều kiểu định danh thiết tất phải có kích thước với HANDLE Bảng sau mơ tả số kiểu liệu mới: Kiể Ý nghĩa HA Số nguyên 32-bit, định danh HW Số nguyên 32-bit, định danh BY Giá trị 8-bit không dấu WO Số nguyên 16-bit không dấu DW Số nguyên 32-bit không dấu UI Số nguyên không dấu 32-bit u NDLE ND TE RD ORD NT LO long 32-bit BO Bool LPS Con trỏ chuỗi LP Hằng trỏ chuỗi WP 32-bit LP 32-bit BS Giá trị 32-bit trỏ đến kí tự LP Con trỏ 32-bit đến kiểu không xác định LP Giống LPSTR chuyển sang dạng Unicode NG OL TR CSTR ARAM ARAM TR VOID TSTR LP CTSTR DBCS Giống LPCTSTR chuyển sang dạng Unicode DBCS Bảng 1.1 Mô tả kiểu liệu 1.4.2 Khuôn mẫu chung tạo ứng dụng Một ứng dụng đơn giản Windows bao gồm có hai hàm WinMain xử lý cửa sổ WinProc Do hai hàm quan trọng thiếu ứng dụng Windows Hàm WinMain thực chức sau : • Định nghĩa lớp cửa sổ ứng dụng • Đăng ký lớp cửa sổ vừa định nghĩa • Tạo thể cửa sổ lớp cho • Hiển thị cửa sổ • Khởi động chu trình xử lý thơng điệp Hàm xử lý WinProc có chức xử lý tất thơng điệp có liên quan đến cửa sổ 1.4.3 Hàm WinMain Hàm ứng dụng chạy Windows hàm WinMain, khai báo sau: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow); Chúng ta tìm hiểu hàm WinMain mẫu sau int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); // tên ứng dụng HWND hwnd; MSG msg; WNDCLASS wndclass; // biến để định nghĩa cửa sổ /* Định nghĩa kiểu cửa sổ */ wndclass.style = SC_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // Hàm thủ tục cửa sổ wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // Định danh ứng dụng wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Khơng có menu wndclass.lpszClassName = szAppName; // tên ứng dụng /* Đăng ký lớp cửa sổ */ if (!RegisterClass(&wndclass)) return 0; /* Tạo lập cửa sổ */ hwnd = CreateWindow (szAppName, // Tên cửa sổ "Hello Program", // Tiêu đề WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ CW_USEDEFAULT, // Tọa độ x CW_USEDEFAULT, // Tọa độ y CW_USEDEFAULT, // Chiều rộng CW_USEDEFAULT, // Chiều dài NULL, // Cửa sổ cha NULL, // Khơng có menu hInstacne, // Định danh ứng dụng NULL); // Tham số bổ sung /* Hiển thị cửa sổ */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Chu trình xử lý thơng điệp*/ while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } Định nghĩa lớp cửa sổ : Đầu tiên viêc xây dựng ứng dụng Windows phải định nghĩa lớp cửa sổ cho ứng dụng Windows cung cấp cấu trúc WNDCLASS gọi lớp cửa sổ, lớp chứa thuộc tính tạo thành cửa sổ typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASS, *PWNDCLASS; Ý nghĩa thuộc tính cấu trúc WNDCLASS mơ tả bảng sau : Thuộc tính Ý nghĩa ghi style Kiểu lớp Kết hợp nhiều kiểu giá trị khác toán tử OR lpfnWndProc Con trỏ đến thủ tục window cbClsExtra Số byte cấp phát thêm sau cấu trúc window-class Mặc định cbWndExtra Số byte cấp phát thêm sau instance window Mặc định hInstance Định danh chứa thủ tục cửa sổ lớp window hIcon Định danh biểu tượng Dùng hàm LoadIcon hCursor Định danh trỏ chuột Dùng hàm LoadCursor hbrBackground Định danh chổi tô Dùng hàm GetStockObject lpszMenuName Tên thực đơn Tên thực đơn gắn với cửa sổ, thực dơn khai báo tập tin tài chương trình chạy Khi kiện nhập thông tin xuất hiện, Windows dịch kiện thành dạng thông điệp đưa vào hàng đợi thơng điệp ứng dụng tương ứng Một ứng dụng nhận thông điệp từ hàng đợi thông điệp cách thực thi đoạn mã sau: while ( GetMessage(&msg, NULL, ,0) ) { TranslateMessage (&msg); DispatchMessage (&msg); } Trong msg biến cấu trúc kiểu MSG định nghĩa tập tin tiêu đề WINUSER.H typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG; Kiểu liệu POINT kiểu cấu trúc khác, định nghĩa tập tin tiêu đề WINDEF.H, có mơ tả : typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT; Ý nghĩa trường cấu trúc MSG hwnd : Định danh cửa sỗ mà thông điệp phát sinh message : Định danh thơng điệp, ví dụ thông điệp phát sinh bấm nút chuột trái WM_LBUTTONDOWN có giá trị 0x0201 wParam : Tham số 32-bit chứa thông tin phụ thuộc vào thông điệp cụ thể lParam : Tham số 32-bit phụ thuộc vào thông điệp time : Thời gian đặt thông điệp hàng đợi pt : Tọa độ chuột đặt thông điệp vào hàng đợi Hàm GetMessage trả msg chứa thông điệp có định danh WM_QUIT (0x0012), vịng lặp thơng điệp ngưng ứng dụng kết thúc Ngược lại hàm trả giá trị khác với thông điệp khác 1.4.6 Xây dựng ứng dụng Một ứng dụng thường có giao diện tảng khung cửa sổ, để tạo cửa sổ thực cách khai báo lớp cửa sổ đăng ký lớp cửa sổ Để cửa sổ tương tác phải viết hàm xử lý cửa sổ WndProc tất thông điệp liên quan đến cửa sổ truyền vào cho hàm Đoạn chương trình sau khung sườn cho chương trình viết Windows, bao gồm hàm : WinMain : hàm chương trình thực chức : • Khai báo lớp cửa sổ • Đăng ký lớp cửa sổ vừa khai báo • Tạo hiển thị lớp cửa sổ • Vịng lặp nhận thơng điệp WndProc : Hàm xử lý thông điệp gởi đến cửa sổ /* HELLOWORLD.C */ #include LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static TCHAR szAppName [] = TEXT ("HelloWorld"); 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; if ( !RegisterClass ( &wndclass ) ) { MessageBox(NULL, TEXT (" The program requires Windows"), szAppName, MB_ICONERROR ); return 0; } hwnd = CreateWindow ( szAppName, // Tên lớp cửa sổ TEXT (" The Hello World Program"), // Tiêu đề cửa sổ WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ CW_USEDEFAULT, // Tọa độ x CW_USEDEFAULT, // Tọa độ y CW_USEDEFAULT, // Chiều ngang CW_USEDEFAULT, // Chiều dọc NULL, // Cửa sổ cha NULL, // Thực đơn hInstance, // Định danh NULL ); // Tham số ShowWindow ( hwnd, iCmdShow ); UpdateWindow ( hwnd ); while ( GetMessage ( &msg, NULL, 0, 0) ) { TranslateMessage (&msg); DispatchMessage (&msg) ; } return msg.wParam; } // End WinMain LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch ( msg ) { case WM_CREATE: return 0; case WM_PAINT: 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; case WM_DESTROY: PostQuitMessage (0); return 0; } // End switch return DefWindowProc ( hwnd, msg, wParam, lParam); } Bảng liệt kê ý nghĩa hàm sử dụng hàm WinMain WndProc chương trình HELLOWORLD.C Tên hàm Ý nghĩa LoadIcon Nạp biểu tượng để sử dụng chương trình LoadCursor Nap trỏ chuột cho chương trình GetStockOb Nhận đối tượng đồ họa, trường hợp chương trình lấy chổi tô để tô lại cửa sổ RegisterCla Đăng ký lớp cửa sổ cho cửa sổ ứng dụng chương trình ject ss MessageBox CreateWind ow Hiển thị thông điệp Tạo cửa sổ dựa lớp cửa sổ ShowWindo Hiển thị cửa sổ lên hình UpdateWin u cầu cửa sổ vẽ lại thân GetMesssag Nhận thơng điệp từ hàng đợi thơng điệp TranslateM Dịch thơng điệp bàn phím DispatchMe Gởi thông điệp đến hàm xứ lý cửa sổ BeginPaint Khởi tạo chức vẽ cửa sổ GetClientRe Lấy hình chữ nhật lưu vùng làm việc DrawText Hiển thị chuỗi văn EndPaint Kết thúc việc vẽ cửa sổ PostQuitMe Đưa thơng điệp vào hàng đợi thơng điệp DefWindow Thực việc xử lý mặc định thông điệp w dow e essage ssage ct ssage Proc Bảng 1.3 Mô tả hàm sử dụng chương trình minh họa 1.4.7 Một số qui ước đặt tên biến Khi viết chương trình ứng dụng lớn với nhiều kiểu khai báo biến khác nhau, việc khai báo tên biến khơng thích hợp làm cho chương trình phức tạp thêm, đơi làm khó người viết mã nguồn Vì lập trình viên thường qui ước cho tên biến vừa gợi chức vừa xác định kiểu loại Có nhiều phong cách để đặt tên, số có phong cách đặt tên theo cú pháp Hungary (Hungarian Notation) dùng nhiều Qui ước đơn giản bắt đầu tên biến viết chữ thường chữ đầu thể kiểu liệu biến, gọi tiền tố Ví dụ biến szCmdLine biến lưu chuỗi nhập từ dòng lệnh, sz thể cho biến kiểu chuỗi kết thúc ký tự 0, ta hay thấy hInstance hPrevInstance, h viết tắt cho kiểu handle, kiểu liệu nguyên thường khai báo dạng tiến tố chữ i Cú pháp Hungary giúp cho người lập trình nhiều khâu kiểm tra lỗi chương trình, nhìn vào hai biến ta dễ dàng nhận biết đựơc khơng tương thích hai kiểu liệu thể tên hai biến Bảng mô tả số tiền tố đặt tên biến kiểu liệu : Tiền tố Kiểu liệu c char, WCHAR, TCHAR by BYTE n short i int x,y biến lưu tọa độ x, y b BOOL w WORD l long dw DWORD s string sz chuỗi kết thúc kí tự h handle p pointer Lpsz trỏ dài chuỗi ký tự kết thúc kí tự Bảng 1.4 Mơ tả kiểu đặt tên biến ... dụng Windows q ph? ?c tạp chúng c? ? hình th? ?c chung Chương trình ứng dụng thuờng chiếm phạm vi hình chữ nhật hình gọi c? ??a sổ Trên c? ??a sổ tiêu đề (title bar) C? ?c ch? ?c chương trình liệt kê th? ?c đơn... giao diện console Nên viết chương trình khơng ph? ?c tạp C? ??n Windows người lập trình làm vi? ?c với c? ?ng c? ?? lập trình đồ họa đa dạng với c? ?ch xử lý đa nhiệm, đa luồng Windows Vì vi? ?c lập trình Windows. .. thơng thạo C h? ?c lập trình Windows Để lập trình Windows yêu c? ??u vi? ?c sử dụng c? ?ng c? ?? lập trình, người h? ?c cịn c? ??n phải c? ? Windows, tối thiểu dùng qua số ứng dụng Windows Thật yêu c? ??u khơng q