Lập trình C trên Windows Các khái niệm cơ bản Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2 C
Trang 1ĐỀ CƯƠNG MÔN HỌC: LẬP TRÌNH WINDOWS
(WINDOWS PROGRAMMING)
Mã môn học: ………
45 tiết lý thuyết, 30 tiết thực hành
-oOo -
I Tóm tắt mục tiêu của môn học:
- Cung cấp cho sinh viên kiến thức và phương pháp lập trình trên môi trường Windows: cơ chế quản lý chương trình, lập trình giao diện đồ họa (GUI), cơ chế quản lý bộ nhớ, lập trình đồng hành, kỹ thuật in ấn…, từ đó sinh viên có khả năng tự xây dựng 1 ứng dụng hoàn chỉnh ở mức độ vừa phải bằng ngôn ngữ Visual C++, trên nền thư viện MFC
- Tạo cho sinh viên một nền tảng trong việc tiếp thu và khai thác các ngôn ngữ lập trình cấp cao khác trên Windows như: Visual Basic, Delphi, C++ Builder, Access, …
- Tạo cho sinh viên một kiến thức cơ bản để có thể tự nghiên cứu các kỹ thuật lập trình sâu hơn trên môi trường Windows
II Các môn học trước:
Tin học đại cương A1, Tin học đại cương A2, Lập trình hướng đối tượng, Cấu trúc dữ liệu
III Đối tượng áp dụng:
- Sinh viên hệ Cao đẳng
- Sinh viên hệ chính qui chuyên ngành CNTT, giai đoạn 2
- Sinh viên hệ Hoàn chỉnh đại học chuyên ngành CNTT
IV Nội dung môn học:
Chương 0: Các khái niệm cơ bản
1 Giới thiệu các thư viện lập trình của HĐH Windows
2 Các thành phần giao diện GUI (Cửa sổ, hộp thoại, các controls,…)
3 Các khái niệm cơ bản (Handle, ID, Instance, Callback)
4 Lập trình sự kiện (Event driven programming), vòng lặp xử lý thông điệp (Message loop) trong các ứng dụng
5 Tài nguyên của ứng dụng (Resources)
6 Một chương trình tổng quát xây dựng trên Windows 32 API
7 Các kiểu dữ liệu cơ bản
Chương 1: Kỹ thuật lập trình Visual C++ (MFC)
1 Giới thiệu về MFC
Trang 2Nguyen Tri Tuan – Khoa CNTT – DHHKTN – TP.HCM (Updated 02/2004) 2 / 3
6 Các Control
7 Xây dựng và xử lý hộp thoại (Dialog box)
8 Documents và Views: Scroll view, List view, Tree view
9 SDI – Single Document Interface
10 MDI - Multi Document Interface
Chương 2: Thư viện liên kết động (DLL)
2 Phân trang bộ nhớ (Paging Memory)
3 Không gian địa chỉ ảo (Virtual Address Space)
4 Các hàm xử lý trên bộ nhớ ảo (Virtual Memory Functions)
2 Các kiểu định dạng dữ liệu (data format) dùng trong Clipboard
3 Các kỹ thuật thao tác trên Clipboard
4 Xây dựng 1 Clipboard Viewer
Chương 6: Multi-Media
1 Tổng quan về các hàm thư viện
2 Thư viện MCI (Media Control Interface)
3 Một chương trình minh họa điều khiển CD-audio và play file WAV
Chương 7: Multi-thread programming
1 Khái niệm Multi-tasking và Multi-threading
2 Tiến trình (Process), tiểu trình (Thread)
3 Chương trình Multi-thread đơn giản
4 Quản lý các tiểu trình
- Tạo lập tiểu trình
- Kết thúc tiểu trình
- Tạm dừng tiểu trình (Thread suspension)
- Tiếp tục tiểu trình (Thread resumption)
Trang 35 Đồng bộ các tiểu trình (Thread Synchronization)
6 Lưu trữ cục bộ trong tiểu trình (Thread Local Storage – LTS)
V Tài liệu tham khảo:
1 Lê H ữu Đạt - Lập trình Windows – Nhà xuất bản giáo dục, 2000
2 Jeff Prosise - Programming Windows with MFC 2nd Edition, Microsoft Press, 1999
3 Charles Petzold - Programming Windows 5th Edition - Microsoft Press,
1998
4 Matt Pietrek - Windows 95 System Programming SECRETS - IDG Books
Worldwide Inc., 1995
5 Thuan Q Pham and Pankaj K.Garg – Multithreaded Programming with
Windows NT – Prentice Hall PTR, 1996
6 Windows 95 Developer’s Guide
7 David J Kruglinski and Scott Wingo and George Shepherd - Programming
Microsoft Visual C++ 5th Edition - Microsoft Press, 1998
- Khuyến khích thiết kế chương trình theo hướng đối tượng
- Thời gian tự làm bài thêm: 90 tiết
- Người biên soạn: Th.S NGUYỄN TRI TUẤN
- Người duyệt: ………
Trang 4Nguyen Tri Tuan – Khoa CNTT – DH KHTN Tp.HCM 1/1
CÁC QUI ĐỊNH - Môn học: Lập trình C trên Windows
-oOo -
1 Cách tính điểm:
- Môn học chỉ thi trên máy vào cuối khóa, không thi viết trên giấy
- Điểm thi cuối khoá: 50%
- Điểm bài project giữa khóa: 50% (từ 1-4 bài project)
- Có thể có các đồ án môn học cộng điểm (không quá 30% tổng số điểm)
- Được phép sử dụng tất cả tài liệu và đĩa mềm khi thi
- Tất cả các bài làm giống nhau sẽ bị điểm 0
2 Làm bài thực hành:
- Phải có kiến thức tốt về lập trình hướng đối tượng
- Phải có kiến thức tốt về sử dụng hệ điều hành Windows và các ứng dụng khác
- Phải chuẩn bị bài thực hành trước khi vào giờ thực hành
- Công cụ lập trình: Visual C++ 6, sử dụng MFC
- Chương trình viết phải ngăn nắp, thẳng hàng, ghi chú đầy đủ Đặt tên biến
và tên hàm phải gợi nhớ, có qui ước xác định (VD Tên biến chữ thường, tên hàm chữ hoa …)
3 Bài tập Project và đồ án:
Xem thêm phần “Hướng dẫn làm bài tập Project hay Đồ án môn học”
- Hết -
Trang 5Hướng dẫn làm bài tập Project hay Đồ án môn học
2 Yêu cầu chung:
- Thường các bài tập Project hay đồ án sẽ được yêu cầu nộp 2 phần chính:
Sưu liệu: là phần tài liệu DOC đi kèm, để mô tả bài tập Chỉ nộp file Xem phần [3] để biết nội dung sưu liệu
Chương trình: xem phần [4] để biết cấu trúc đĩa nộp
- Để tránh tình trạng kiện cáo mất bài nộp sau này, yêu cầu thực hiện theo các qui định sau:
Lớp trưởng chỉ nộp cho GV 1 đĩa CD duy nhất chứa tất cả bài
nộp của các bạn trong lớp GV sẽ không nhận nộp đĩa mềm vì có
thể thất lạc hay hư hỏng
GV sẽ không nhận bất kỳ bài nộp nào qua email, vì bất kỳ lý do
gì GV cũng sẽ không trả lời email gởi nộp bài, và đương nhiên, bài nộp đó coi như không có
3 Gợi ý viết báo cáo sưu liệu: (không nhất thiết phải có đủ các mục)
- Phân tích các hướng tiếp cận khác nhau (nếu có)
- Chọn ra phương pháp được sử dụng trong đồ án
Phần 4: Phân tích và thiết kế chương trình
- Các thuật toán quan trọng
- Trình bày trên phương diện lý thuyết các thuật toán then chốt trong chương trình Minh họa bằng lưu đồ Đánh giá, phân tích
- Thiết kế chi tiết của chương trình: các CTDL, các hàm quan trọng, các giải thuật, các bước thực hiện cài đặt
- Các cấu trúc dữ liệu cần thiết Nêu mô tả, ý nghĩa từng cấu trúc, các field, lý
do chọn lựa CTDL
- Các hàm quan trọng: nêu prototype, ý nghĩa các tham số, kết quả trả về, nội dung của hàm
Phần 5: Hướng dẫn & Trợ giúp
- Hướng dẫn sử dụng và cài đặt chương trình
Trang 6Nguyen Tri Tuan – Khoa CNTT – DH KHTN Tp.HCM 2/2
- Ưu khuyết điểm của chương trình, đồ án
- Đánh giá kết quả thực hiện: phần nào đã hoàn thành, phần nào chưa ?
- Hướng mở rộng của chương trình ?
Phần 7: Tài liệu tham khảo
- Liệt kê cụ thể các tài liệu tham khảo, tên tác giả, tựa, năm xuất bản, trang nào ?
- Liệt kê cụ thể địa chỉ Web-site
4 Cấu trúc đĩa nộp:
Mỗi người có 1 thư mục duy nhất, tên thư mục là mã SV VD 012123 Trong thư mục có những phần sau đây:
o Thư mục con <SOURCE> chứa toàn bộ chương trình nguồn của project
o Thư mục con <RELEASE> chứa file thi hành EXE và các file thư viện
(Lib, DLL,…), nếu có
o Thư mục con <SETUP> chứa toàn bộ chương trình cài đặt của project
(nếu cần phải setup)
o Thư mục con <DOCUMENTS> chứa các file Word là sưu liệu của
chương trình
o Thư mục con <REFERENCES> chứa các file tài liệu tham khảo (DOC,
PDF, HTML, source code…) mà Project có tham khảo, nếu có
Lưu ý: không nộp các file trung gian trong quá trình biên dịch như NCB, OPT, PCH, …
5 Các lưu ý khác:
- Nếu chương trình có sử dụng các công cụ khác (không phải thư việc chuẩn
của ngôn ngữ) hay cần phải thực hiện các thao tác cài đặt/đăng ký mới chạy
được thì bắt buộc phải có chương trình Setup đi kèm
- Chương trình phải được thử nghiệm chạy tốt trên các môi trường Win9x,
Win2000, WinXP
- Nên Setup và Test chương trình trên các máy bình thường (không phải máy
dùng để develop chương trình) để tránh tình trạng cài đặt thiếu thư viện,
Component, ActiveX, …
- Hết -
Trang 7Môn học Lập trình C trên Windows
Bài tập thực hành -oOo - Chương 0:
1 Làm quen với 1 chương trình C viết trên thư viện API
a Phần 1:
- Sử dụng VC++ 6, dùng chức năng New project, chọn loại project “Win32 Application”
- Chọn chức năng “A typical Hello World !” application
- Hoàn tất tạo project, biên dịch và chạy thử nghiệm chương trình
b Phần 2:
- Thay đổi tiêu đề của của sổ thành “Chuong trinh C/API”
- Thay đổi nội dung hiển thị trên màn hình client area thành:
“Day la chuong trinh dau tien…
… viet bang VC++…
… tren HDH Windows…
… bang thu vien API “
2 Tài nguyên của chương trình: lấy chương trình kết quả của bài tập 1, thực hiện tiếp:
a Phần 1:
- Thay đổi biểu tượng của chương trình
- Thay đổi con trỏ chuột
- Thay đổi nội dung của hộp thoại “About”
b Phần 2:
- Bổ sung thêm vào menu “File” các mục sau: New, Open, Save
- Thêm mới 1 menu popup “Edit” với các item sau: Undo, Cut, Copy, Paste, Select all
- Mỗi menu item đều có phím tắt tương ứng
3 Lập trình sự kiện: lấy chương trình kết quả của bài tập 2, thực hiện tiếp:
a Phần 1:
- Khi user chọn menu item, hiển thị dialog box thông báo:
“Ban vua chon chuc nang XXXX”
- Khi user thoát chương trình, hiển thị dialog box hỏi xác nhận
b Phần 2:
- Khi user click mouse trái/phải, hiển thị dialog box thông báo:
“Ban vua nhan mouse trai [phai], tai toa do X=, Y=”
Chương 1:
4 Làm quen với 1 chương trình C viết bằng thư viện MFC
a Phần 1:
- Sử dụng VC++ 6, dùng chức năng New project, chọn loại project “MFC AppWizard (exe)”
- Chọn loại ứng dụng “Single document”
- Hoàn tất tạo project, biên dịch và chạy thử nghiệm chương trình
b Phần 2:
- Thay đổi biểu tượng của chương trình
- Thay đổi con trỏ chuột
- Thay đổi nội dung của hộp thoại “About”
c Phần 3:
- Khi user click mouse trái/phải, hiển thị dialog box thông báo:
Trang 8© Nguyen Tri Tuan – Khoa CNTT ĐH.KHTN TP.HCM 2/7
- Khi user chọn chức năng “New” Æ tạo 1 cửa sổ soạn thảo EDIT trong vùng client của cửa sổ giao diện chính
- Xử lý WM_SIZE để kích thước của cửa sổ soạn thảo EDIT luôn trùng khớp với kích thước vùng client của cửa sổ giao diện chính
- Thực hiện các chức năng: Open, Save, Save as, Undo, Cut, Copy, Paste
6 Một chương trình quản lý đơn giản
- Tạo ứng dụng MFC ở chế độ “Dialog based”
- Màn hình giao diện gợi ý như hình vẽ
- Chương trình cho phép nhập và lưu thông tin lý lịch của các nhân viên Dữ liệu được lưu vào file nhị phân dạng record
- Người dùng nhập thông tin chi tiết cho 1 nhân viên rồi nhấn “Lưu” để lưu record vào file Sau khi lưu xong, xóa các ô nhập liệu để thực hiện cho nhân viên tiếp theo
- Mục “Trình độ” có các lựa chọn sau: tiểu học, trung học, trung cấp, đại học, sau đại học
- Nút “Chọn hình” mở hộp thoại cho phép chọn 1 file hình ảnh (BMP) Tên file được thể hiện trên ô “Tên file hình”, ảnh được hiển thị trên ô trống
7 Phát triển từ bài tập 6
- Tạo ứng dụng MFC ở chế độ “Dialog based”
- Màn hình giao diện gồm 2 phần:
o Bên trái là 1 danh sách các Mã NV (đọc từ file record)
o Bên phải có giao diện giống bài tập 6
- User chọn 1 Mã NV trong danh sách, các thông tin tương ứng của NV sẽ hiển thị
Chương 2:
8 Áp dụng kỹ thuật lập trình sự kiện và kỹ thuật Hook (chặn các thông điệp) để xây dựng
chương trình “bộ gõ tiếng Việt.”
Yêu cầu:
- Chương trình chạy background, hiển thị icon ở system tray
- Hỗ trợ 1 trong các cách gõ: VNI, TELEX
- Hỗ trợ 1 trong các bảng mã: VNI, TCVN3
- Áp dụng được trong tất cả các ứng dụng trên Windows
- Chỉ nộp chương trình, không cần sưu liệu
9 Xây dựng chương trình “DateBook” Công dụng của chương trình là cho phép ghi nhận
các việc phải làm trong ngày, nhắc nhở user khi đến thời điểm qui định
Yêu cầu:
Trang 9- Chương trình chạy background, hiển thị icon ở system tray
- Khi user click lên icon của chương trình, sẽ mở giao diện hộp thoại như sau:
- Khi user click chọn 1 ngày trên lịch, chương trình sẽ mở giao diện hộp thoại quản lý công việc như sau:
• Ngày: là ngày/tháng/năm đã chọn
• Các công việc: danh sách các công việc đã được định nghĩa trong ngày Thể hiện dạng ListView 2 cột 1 cột là “Tên công việc”; 1 cột là “Thời gian thực hiện”
• Add: chức năng định nghĩa mới 1 công việc
• Delete: chức năng xóa bỏ 1 công việc trong danh sách
• Close: đóng dialog
- Khi user chọn chức năng “Add”, chương trình mở dialog cho phép định nghĩa mới 1 công việc trong ngày như sau:
Trang 10© Nguyen Tri Tuan – Khoa CNTT ĐH.KHTN TP.HCM 4/7
• Nhắc nhở: hiển thị 1 message-box với câu thông báo lên màn hình khi đến giờ qui định, đồng thời phát 1 tiếng sound
• OK: xác nhận công việc đã nhập
• Cancel: hủy bỏ công việc đang nhập
- Sau khi user đã định nghĩa các công việc, chương trình sẽ tự động kiểm tra và nhắc nhở Chu kỳ kiểm tra là 1 phút
- Lưu trữ:
• Lưu lại tất cả công việc trong 1 tập tin, tên file do user chỉ định
• Tên file được lưu vào file WIN.INI trong section [DateBook]
• Khi user mở dialog “Quản lý công việc trong ngày”, chương trình tự động đọc file và load tất cả các công việc của ngày đã chọn vào danh sách
- Xây dựng các chức năng chính dưới dạng DLL, bao gồm:
• Quản lý công việc trong ngày
• Tạo mới 1 công việc trong ngày
10 Xây dựng chương trình “Simple Drawing” Chương trình cho phép user dùng mouse để
vẽ các đối tượng hình, tô màu
Mô tả chi tiết:
Giao diện gợi ý như hình vẽ (SDI - Single Document Interface)
a Các chức năng của chương trình bao gồm:
- File:
o New: xóa màn hình, bắt đầu vẽ mới
o Exit: thoát chương trình
- Edit:
o Cut: cắt khu vực đang chọn, đưa vào Clipboard (dạng bitmap)
o Copy: copy khu vực đang chọn, đưa vào Clipboard (dạng bitmap)
o Paste: dán dữ liệu trong Clipboard ra màn hình, tại tọa độ (0, 0)
Trang 11- Drawing:
o Line: chọn chế độ vẽ đường thẳng User dùng mouse để vẽ đoạn thẳng
o Rectangle: chọn chế độ vẽ hình chữ nhật User dùng mouse để vẽ hình chữ nhật
o Circle: chọn chế độ vẽ đường tròn User dùng mouse để vẽ đường tròn
o Select: chọn chế độ đánh dấu vùng (để Cut/Copy)
o Fill: chọn chế độ tô màu User click mouse để chọn điểm bắt đầu tô màu
o Line Color: mở hộp thoại Color, cho phép user chọn màu vẽ đường
o Fill Color: mở hộp thoại Color, cho phép user chọn màu để tô
- View:
o Toolbar: Xem/ẩn thanh ToolBar
o Statusbar: Xem/ẩn thanh StatusBar
- Help:
o About: giới thiệu về chương trình
b Các yêu cầu khác:
- Tất cả các chức năng đều thể hiện trên ToolBar
- Mỗi chức năng đều có ToolTip Text và có hướng dẫn trên StatusBar
- Tất cả chức năng liên quan đến Clipboard (Cut/Copy/Paste) được tổ chức thành 1 DLL riêng
11 Xây dựng chương trình “Object Drawing” Chương trình cho phép user dùng mouse để
vẽ các đối tượng hình, copy, cắt dán các đối tượng
Mô tả chi tiết:
Giao diện gợi ý như hình vẽ (SDI - Single Document Interface)
a Các chức năng của chương trình bao gồm:
- File:
o New: xóa màn hình, bắt đầu vẽ mới
Trang 12© Nguyen Tri Tuan – Khoa CNTT ĐH.KHTN TP.HCM 6/7
o Line: chọn chế độ vẽ đường thẳng User dùng mouse để vẽ đoạn thẳng Đối tượng đường thẳng có các thuộc tính: (x1, y1), (x2, y2), nét vẽ (pen, bao gồm: màu (color), độ rộng (thickness), dạng (style))
o Rectangle: chọn chế độ vẽ hình chữ nhật User dùng mouse để vẽ hình chữ nhật Đối tượng hình chữ nhật có các thuộc tính: (x1, y1), (x2, y2), nét vẽ (pen, bao gồm: màu (color), độ rộng (thickness), dạng (style)), mẫu tô (brush, bao gồm: dạng (style), màu (color), hatch)
o Ellipse: chọn chế độ vẽ đường tròn User dùng mouse để vẽ đường tròn Đối tượng ellipse có các thuộc tính: (x, y), bán kính nhỏ, bán kính lớn, nét vẽ (pen, bao gồm: màu (color), độ rộng (thickness), dạng (style)), mẫu tô (brush, bao gồm: dạng (style), màu (color), hatch)
o Select: chuyển sang chế độ chọn đối tượng (để Cut/Copy) Đối tượng được chọn sẽ “high-light” và user có thể dùng mouse di chuyển đối tượng
o Settings: mở hộp thoại xác định các thuộc tính vẽ Hộp thoại cho phép xác định 2 loại thuộc tính sau:
Nét vẽ (Pen): màu (color), độ rộng (thickness), dạng (style)
Mẫu tô (Brush): dạng (style), màu (color), hatch Các thuộc tính vẽ sẽ được áp dụng cho những đối tượng sau đó
- View:
o Toolbar: Xem/ẩn thanh ToolBar
o Statusbar: Xem/ẩn thanh StatusBar
- Mỗi chức năng đều có ToolTip Text (trên Toolbar) và có hướng dẫn trên StatusBar
- Tất cả chức năng liên quan đến Clipboard (Cut/Copy/Paste) được tổ chức thành 1
DLL riêng
Chương 6:
12 Xây dựng chương trình “Trò chơi lật hình” Chương trình có 1 số cặp hình giống nhau
(bị dấu) Người dùng click mouse để lật từng hình, nếu lật được 2 hình giống nhau liên tiếp thì ghi được 1 điểm; nếu không hình sẽ trở lại trạng thái bị dấu
Mô tả chi tiết:
- Giao diện gợi ý như hình vẽ Thư viện các hình sử dụng có thể lấy các file ICO và import vào chương trình sẵn
- Màn hình bên trái dạng ListView thể hiện các hình
- Option “Số hình”: cho phép user chọn số cặp hình muốn chơi Không quá MAX = 10 cặp hình
- Option “Play nhạc”: cho phép play 1 file nhạc (WAV) trong lúc chơi Nhạc bắt đầu play khi user nhấn “New game” để bắt đầu 1 game mới
- Option “Play 1 lần”: play xong file nhạc 1 lần rồi dừng
- Option “Play liên tục”: play liên tiếp bài nhạc cho đến khi hết game hay thoát
Trang 13- Option “Chọn file WAV”: cho phép user chọn file WAV để play Tên file đã chọn thể hiện trên mục “Tên file”
- “Kết quả” thể hiện số điểm đạt được và thời gian đã trôi qua (từ lúc bắt đầu game)
- Nút “New game” để bắt đầu 1 game mới
o Có play nhạc hay không
o Play 1 lần hay play liên tục
o Tên file WAV
o Tọa độ góc trên của cửa sổ giao diện
- Khi bắt đầu chạy, chương trình kiểm tra file TCLH.INI, nếu có thì xác lập tất cả các thông số như đã lưu; nếu không có thì xác lập các thông số mặc định
o Số hình = 6
o Không play nhạc
o Cửa sổ giao diện hiển thị ngay chính giữa màn hình
- Hết -
Trang 15Bài tập tuần 1
Người soạn: Nguyễn Đức Hoàng Hạ Ngày soạn: 26-2-2005
Email: ndhha@fit.hcmuns.edu.vn
Viết chương trình từ hàm WinMain:
Đọc tập tin input.txt các thông tin:
• Dòng đầu là số n
• Dòng kế tiếp có n số nguyên, mỗi số cách một khoảng trắng
Yêu cầu:
a) Tính tổng của dãy số trên và thông báo bằng MessageBox
b) Tìm phần tử lớn nhất của dãy và thông báo bằng MessageBox
c) Sắp xếp tăng dần dãy số trên rồi xuất ra tập tin output.txt như sau:
• Dòng đầu là số n
• Dòng kế tiếp có n số nguyên, mỗi số cách một khoảng trắng
Sau khi ghi xong thi thông báo
“Da sap xep du lieu va ghi vao tap tin output.txt”
d) Đếm số số nguyên tố trong dãy và thông báo kết quả bằng MessageBox
(Số nguyên tố là số nguyên lớn hơn 1 và chỉ chia hết cho 1 và chính nó)
Một số hướng dẫn:
• Tạo project: File à New à (Projects) Win32 Application (Nhập tên project)
à A simple Win32 Application
• Cú pháp lệnh MessageBox:
int MessageBox(
HWND hWnd,
LPCTSTR lpText, //chu ỗi ký tự
LPCTSTR lpCaption, //chu ỗi ký tự
UINT uType
);
Xem chi ti ết trong MSDN
Ví dụ cách dùng:
MessageBox(NULL,”Noi dung thong bao”, “Thong bao so 1”, MB_OK);
• Ví dụ thông báo một số nguyên x la số nguyên tố:
int x = 7;
char buf[100];
sprintf(buf,”so x=%d la so nguyen to”, x);
MessageBox(NULL, buf, “So nguyen to”, MB_OK);
(Nhớ include tập tin “stdio.h” vào để sử dụng lệnh sprintf)
• Debug:
- Chạy chương trình dạng debug: F5
- Chạy từng lệnh: F10
- Chạy vào trong hàm con: F11
- Chạy tới vị trí trỏ chuột: Ctrl+F10
- Đánh dấu vị trí dừng (Breakpoint) : F9
Một số câu hỏi:
Trang 16Lập trình C trên Windows
Các khái niệm cơ bản
Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2
Các khái niệm cơ bản
Lập trình sự kiện (Even driven programming)
Các thành phần giao diện đồ họa (GUI)
Tài nguyên của ứng dụng (Resources)
Một chương trình tổng quát xây dựng trên
Win32 API
Các kiểu dữ liệu cơ bản
Trang 17Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 3
Vài điểm khác biệt giữa lập trình Windows và DOS
Hỗ trợ 32 bits hay hơn nữa
Phải dùng các thư viện Multimedia riêng
Tích hợp sẵn Multimedia
Single CPU Multi- CPU
Single task Multi- tasking
Thực hiện tuần tự theo chỉ định
Lập trình sự kiện, dựa vào
thông điệp (message)
DOS Windows
Các thư viện lập trình của Windows
SDK - Software Development Kit
Là bộ thư viện lập trình nền tảng của HĐH
Windows
Cung cấp tất cả các công cụ cần thiết để xây
dựng 1 ứng dụng trên Windows
Được sử dụng như là thư viện cơ sở để tạo ra
những thư viện cấp cao hơn trong những ngôn
ngữ lập trình VD OWL của BorlandC, MFC của
Visual C++,…
Trang 18Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 5
Các thư viện lập trình của Windows …(tt)
Một số thành phần tiêu biểu của SDK:
Các thư viện lập trình của Windows …(tt)
OWL - Object Windows Library
Là bộ thư viện hướng đối tượng của
BorlandC++
MFC - Microsoft Foundation Classes
Là bộ thư viện hướng đối tượng của Visual C++
Một ứng dụng trên Windows có thể được
viết bằng
Thư viện SDK
Một thư viện khác (OWL, MFC,…) phối hợp với
SDK
Trang 19Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 7
Các loại ứng dụng
Win32 Console: ứng dụng 32 bits, với giao diện
dạng DOS command line
Win32 (SDK): ứng dụng 32 bits, chỉ sử dụng thư
MFC EXE: ứng dụng 32 bits, sử dụng thư viện
Microsoft Foundation Class
MFC DLL: ứng dụng 32 bits, dạng thư viện liên kết
động (Dynamic-linked library), sử dụng MFC
Các khái niệm cơ bản
Handle:
Một giá trị 32 bits không dấu (unsigned) do HĐH tạo ra
để làm định danh cho 1 đối tượng (cửa sổ, file, vùng
nhớ, menu,…)
ID (Identifier):
Một giá trị nguyên do ứng dụng tạo ra để làm định danh
cho 1 đối tượng (menu item, control)
Instance:
Một giá trị nguyên do HĐH tạo ra để định danh 1 thể
hiện đang thực thi của ứng dụng
Callback:
Thuộc tính của 1 hàm/thủ tục sẽ được gọi bởi HĐH,
không phải bởi ứng dụng
Trang 20Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 9
Lập trình sự kiện (Even driven programming)
Phát sinh các sự kiện và thông điệp
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 10
Lập trình sự kiện (Even driven programming)…(tt)
Qui trình xử lý thông điệp
Trang 21Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 11
Lập trình sự kiện (Even driven programming)…(tt)
// Vòng lặp xử lý thông điệp trong 1 ứng dụng –
// Message loop
MSG msg;
// lấy thông điệp ra khỏi hàng đợi của ứng dụng
while (GetMessage(&msg, NULL, 0, 0))
Lớp cửa sổ (window class)
Hàm xử lý thông điệp (window procedure)
Các thuộc tính
Trang 22Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13
Các thành phần giao diện đồ họa (GUI)…(tt)
GUI: Graphics User Interface
Các dạng GUI cơ bản:
SDI - Single Document Interface
Một cửa sổ làm việc
Cho phép thay đổi kích thước cửa sổ (Resizeable)
Không có các cửa sổ con
Ví dụ: NotePad, Paint,…
MDI - Multiple Document Interface
Một cửa sổ làm việc chính (Frame window) và nhiều cửa sổ con (Child
window)
Cho phép thay đổi kích thước cửa sổ (Resizeable)
Cho phép Maximize/Minimize/Close các cửa sổ con
Ví dụ: Word, Excel, VC++,…
Dialog
Một cửa sổ làm việc
Thường kích thước cố định
Thường không có menu bar
Thường có các button, edit box, list-box,…
Ví dụ: Calculator, CD Player,…
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 14
Các thành phần giao diện đồ họa (GUI)…(tt)
Dialog, SDI, MDI
Trang 23Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 15
Mô hình phân cấp: mỗi cửa sổ đều có 1 cửa sổ
cha (parent window), ngoại trừ cửa sổ nền
Desktop
Tại mỗi thời điểm, chỉ có 1 cửa sổ nhận input từ
user (Active/Focused window)
GUI – Window …(tt)
Phân loại:
Cửa sổ Desktop
Cửa sổ tiêu chuẩn
Cửa sổ hộp thoại (Dialog box)
Các control
Trang 24Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17
GUI – Window …(tt)
App Window
Dialog
box
Desktop Window
Control
Child window
Parent window
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 18
GUI – Window …(tt)
bar
Title-Minimized, Restored, Maximized buttons
bar
Scroll- bar
Menu-Resized border
Window Caption
Trang 25Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 19
Combo- button
Push- sheet
Trang 26Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 21
GUI – Window …(tt)
Lớp cửa sổ (window class):
Là một tập các thuộc tính mà HĐH Windows sử dụng
làm khuôn mẫu (template) khi tạo lập 1 cửa sổ
Mỗi lớp cửa sổ được đặc trưng bằng 1 tên (class-name)
dạng chuỗi
Phân loại class:
Lớp cửa sổ của hệ thống (System class)
Được định nghĩa trước bởi HĐH Windows
Các ứng dụng không thể hủy bỏ
Lớp cửa sổ do ứng dụng định nghĩa:
Được đăng ký bởi ứng dụng
Có thể hủy bỏ khi không còn sử dụng nữa
Lớp toàn cục của ứng dụng (Application global class)
Lớp cục bộ của ứng dụng (Application local class)
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 22
Các lớp cửa sổ của hệ thống
Trang 27Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 23
GUI – Window …(tt)
Lớp cửa sổ (window class):
Mỗi cửa sổ đều thuộc một lớp xác định
Cần phải đăng ký lớp trước khi tạo lập 1 cửa sổ,
nếu lớp chưa được đăng ký
wc.lpszClassName = “MyClass”; // tên class
wc.lpfnWndProc = MyWndProc; // tên hàm xử lý message
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(hInstance, (LPSTR) IDC_CURSOR);
wc.hIcon = LoadIcon(hInstance, (LPSTR) IDI_ICON);
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
Trang 28Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25
GUI – Window …(tt)
Minh họa cấu trúc WNDCLASS
typedef struct _WNDCLASS {
GUI – Window …(tt)
Ý nghĩa Thuộc tính
số byte dành riêng cho mỗi cửa sổ thuộc class (<=
40 bytes) cbWndExtra
số byte dành riêng cho class (<= 40 bytes) cbClsExtra
kiểu dáng của lớp (class style) Style
tên menu bar, chuỗi kết thúc bằng 0 lpszMenuName
handle của brush, xác định cách tô vùng client; +1 nếu muốn sử dụng màu mặc định của hệ thống.
VD COLOR_BACKGROUND + 1 hbrBackground
handle của icon, xác định biểu tượng của cửa sổ hIcon
handle của cursor, xác định dạng cursor trong vùng client
Trang 29Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27
GUI – Window …(tt)
Hàm xử lý thông điệp (window procedure)
Có nhiệm vụ tiếp nhận và xử lý các thông điệp
được gởi đến cho cửa sổ
Sử dụng chung cho tất cả các cửa sổ của cùng
1 class
Được gọi bởi HĐH (là hàm Callback)
GUI – Window …(tt)
Dạng tổng quát của 1 hàm xử lý thông điệp
LRESULT CALLBACK WndProc(
HWND hwnd, // handle của window nhận message
UINT uMsg, // ID của message
WPARAM wParam, // tham số thứ 1 của message (WORD)
LPARAM lParam) // tham số thứ 2 của message (LONG)
Trang 30Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 29
GUI – Window …(tt)
Các thuộc tính của cửa sổ:
tên lớp (class name)
tiêu đề (window title)
kiểu dáng (window style)
kiểu dáng mở rộng (extended window style)
vị trí (position – x, y)
kích thước (size – w, h)
cửa sổ cha (parent or owner window handle)
menu hay ID (menu handle or child-window
identifier)
instance của ứng dụng sở hữu (application
instance handle)
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 30
GUI – Window …(tt)
VD Tạo lập 1 cửa sổ bằng hàm CreateWindow
HWND hWnd =
CreateWindow(“MyClass”, // class name
“XYZ Application”, // window title
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // default x
CW_USEDEFAULT, // default y
CW_USEDEFAULT, // default Width
CW_USEDEFAULT, // default Height
(HWND) NULL, // parent handle
(HMENU) NULL, // MenuBar
hInstance, // application instance
NULL); // extra default data
Trang 31Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31
Tài nguyên của ứng dụng (Resources)
Resouce:
là 1 đối tượng (object) được sử dụng trong ứng
dụng (VD Menu bar, dialog, bitmap, icon,
cursor,…)
được định nghĩa bên ngoài và được thêm vào
trong file thi hành của ứng dụng khi biên dịch
Dialog box: - khung hộp thoại (Dialogbox Template)
Enhanced metafile: - tập hợp các cấu trúc để lưu ảnh
(picture) theo định dạng “độc lập thiết bị” (Device-Independent format)
String-table entry: - bảng mô tả các chuỗi ký tự
Version information: - bảng mô tả thông tin “phiên bản”
Trang 32Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33
Tài nguyên của ứng dụng (Resources)…(tt)
Accelerator và Bitmap
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 34
Tài nguyên của ứng dụng (Resources)…(tt)
CursorCaret
Trang 33Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
Tài nguyên của ứng dụng (Resources)…(tt)
IconDialogBox template
Tài nguyên của ứng dụng (Resources)…(tt)
String tableMenubar
Trang 34Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37
Tài nguyên của ứng dụng (Resources)…(tt)
Version Information
Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 38
Một chương trình tổng quát xây dựng trên Win32 API
Các bước tạo lập chương trình
Trang 35Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 39
Một chương trình tổng quát xây dựng trên Win32 API…(tt)
WinMain:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow)
hInstance: handle của ứng dụng
hPrevInstance: handle của thể hiện trước của cùng một
ứng dụng Trong Win32, giá trị này = NULL
lpCmdLine: chuỗi chứa dòng lệnh (command line)
VD “winword c:\My documents\baitap.doc”
nCmdShow: xác định cách thức cửa sổ được hiển thị
VD MAXIMIZE, MINIMIZE, SHOW, HIDE,…
Một chương trình tổng quát xây dựng trên Win32 API…(tt)
Đăng ký lớp cửa sổ:
ATOM MyRegisterClass(HINSTANCE hInstance)
Tạo lập cửa sổ giao diện:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
Thực hiện vòng lặp xử lý message
Trang 36Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41
Một chương trình tổng quát xây dựng trên Win32 API…(tt)
Một chương trình tổng quát xây dựng trên Win32 API…(tt)
Hàm xử lý message của cửa sổ:
Xử lý message cho cửa sổ giao diện chính
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
Xử lý message cho dialog box “About”
LRESULT CALLBACK About(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
Trang 37Spring 2004 C4W - Basic - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43
Cám ơn - Hỏi & Đáp
Trang 38C4W - Nguyen Tri Tuan – Khoa CNTT – ĐHKHTN TP.HCM 1 / 3
CÁC KIỂU DỮ LIỆU CƠ BẢN TRONG WINDOWS (Tóm tắt)
-oOo -
BOOL kiểu logic, có giá trị TRUE hay FALSE
BYTE kiểu byte (8 bits)
CALLBACK qui ước để mô tả những hàm Callback
CHAR ký tự 8 bits (Windows ANSI)
COLORREF giá trị màu 32 bits, được tổng hợp từ 3 màu cơ bản Red,
Green, Blue CONST biến có giá trị không thay đổi trong quá trình xử lý
DWORD số nguyên không dấu 32 bits
DWORD_PTR số nguyên không dấu 32 bits sử dụng khi cần chuyển kiểu
con trỏ DWORD để tính toán DWORD32 số nguyên không dấu 32 bits
DWORD64 số nguyên không dấu 64 bits
HACCEL handle đến bảng mô tả phím tắt (Accelerator)
HANDLE handle của 1 đối tượng
HBITMAP handle của 1 đối tượng ảnh bitmap
HBRUSH handle của 1 đối tượng brush
HCURSOR handle của 1 đối tượng cursor
HDC handle của 1 device context (DC)
HDDEDATA handle của 1 dữ liệu DDE
HDESK handle của desktop
HFILE handle của file được mở bằng hàm OpenFile, không phải
hàm CreateFile HFONT handle của 1 đối tượng font
HGDIOBJ handle của 1 đối tượng đồ họa GDI
HGLOBAL handle của 1 khối bộ nhớ toàn cục
HHOOK handle của 1 hàm hook
HICON handle của 1 đối tượng icon
HIMAGELIST handle của 1 đối tượng imagelist
HINSTANCE handle của 1 instance
HKEY handle của 1 khóa registry
HLOCAL handle của 1 khối bộ nhớ cục bộ
HMENU handle của 1 đối tượng menu
HMETAFILE handle của 1 đối tượng meta-file
HMODULE handle của 1 module
HMONITOR handle của 1 màn hình hiển thị
HPALETTE handle của 1 đối tượng palette (bảng màu)
HPEN handle của 1 đối tượng pen
HRGN handle của 1 đối tượng region
HRSRC handle của 1 đối tượng resource
HSZ handle của 1 DDE string
HWND handle của 1 đối tượng cửa sổ
INT số nguyên có dấu 32 bits
INT_PTR số nguyên không dấu 32 bits sử dụng khi cần chuyển kiểu
con trỏ INT để tính toán INT32 số nguyên có dấu 32 bits
INT64 số nguyên có dấu 64 bits
Trang 39LONG số nguyên có dấu 32 bits
LONG_PTR số nguyên không dấu 32 bits sử dụng khi cần chuyển kiểu
con trỏ LONG để tính toán LONG32 số nguyên có dấu 32 bits
LONG64 số nguyên có dấu 64 bits
LONGLONG số nguyên có dấu 64 bits
LPARAM tham số thứ 2 của message, kiểu LONG
LPBOOL con trỏ đến kiểu BOOL
LPBYTE con trỏ đến kiểu BYTE
LPCOLORREF con trỏ đến kiểu COLORREF
LPCSTR con trỏ đến 1 chuỗi ký tự hằng, kết thúc bằng 0 Đây là
chuỗi dạng ANSI 8 bits/ký tự LPCTSTR con trỏ chuỗi ký tự Nếu cờ hiệu UNICODE được định
nghĩa, kiểu này tương đương với LPCWSTR; ngược lại sẽ tương đương với LPCSTR
LPCVOID con trỏ đến 1 hằng kiểu bất kỳ
LPCWSTR con trỏ đến 1 chuỗi ký tự hằng, kết thúc bằng 0 Đây là
chuỗi dạng UNICODE 16 bits/ký tự LPDWORD con trỏ đến kiểu DWORD
LPHANDLE con trỏ đến kiểu HANDLE
LPINT con trỏ đến kiểu INT
LPLONG con trỏ đến kiểu LONG
LPSTR con trỏ đến 1 chuỗi ký tự, kết thúc bằng 0 Đây là chuỗi
dạng ANSI 8 bits/ký tự LPTSTR con trỏ chuỗi ký tự Nếu cờ hiệu UNICODE được định
nghĩa, kiểu này tương đương với LPWSTR; ngược lại sẽ tương đương với LPSTR
LPVOID con trỏ đến 1 kiểu bất kỳ
LPWORD con trỏ đến kiểu WORD
LPWSTR con trỏ đến 1 chuỗi ký tự, kết thúc bằng 0 Đây là chuỗi
dạng UNICODE 16 bits/ký tự LRESULT giá trị 32 bits có dấu, là kết quả trả về của hàm nhận và xử
lý message PBOOL con trỏ đến kiểu BOOL
PBOOLEAN con trỏ đến kiểu BOOLEAN
PBYTE con trỏ đến kiểu BYTE
PCHAR con trỏ đến kiểu CHAR
PCSTR con trỏ đến 1 chuỗi ký tự hằng, kết thúc bằng 0 Đây là
chuỗi dạng ANSI 8 bits/ký tự PCTSTR con trỏ chuỗi ký tự Nếu cờ hiệu UNICODE được định
nghĩa, kiểu này tương đương với PCWSTR; ngược lại sẽ tương đương với PCSTR
PCWCH con trỏ đến 1 hằng kiểu WCHAR
PCWSTR con trỏ đến 1 chuỗi ký tự hằng, kết thúc bằng 0 Đây là
chuỗi dạng UNICODE 16 bits/ký tự
PFLOAT con trỏ đến FLOAT
PHANDLE con trỏ đến HANDLE
Trang 40C4W - Nguyen Tri Tuan – Khoa CNTT – ĐHKHTN TP.HCM 3 / 3
(truncated pointer) POINTER_64 con trỏ 64 bits Trong môi trường 64 bits, đây là 1 con trỏ
đầy đủ, trong môi trường 32 bits, đây là 1 con trỏ mở rộng
có dấu (sign-extended pointer) PSHORT con trỏ đến SHORT
PSTR con trỏ đến 1 chuỗi ký tự, kết thúc bằng 0 Đây là chuỗi
dạng ANSI 8 bits/ký tự PTBYTE con trỏ đến TBYTE
PTCHAR con trỏ đến TCHAR
PTSTR con trỏ chuỗi ký tự Nếu cờ hiệu UNICODE được định
nghĩa, kiểu này tương đương với PWSTR; ngược lại sẽ tương đương với PSTR
PUSHORT con trỏ đến USHORT
PVOID con trỏ đến kiểu bất kỳ
PWSTR con trỏ đến 1 chuỗi ký tự, kết thúc bằng 0 Đây là chuỗi
dạng UNICODE 16 bits/ký tự SHORT số nguyên ngắn (16 bits)
SIZE_T số byte tối đa mà 1 con trỏ có thể định vị, giá trị không dấu SSIZE_T như SIZE_T, nhưng là giá trị có dấu
TBYTE Nếu cờ hiệu UNICODE được định nghĩa, kiểu này tương
đương với WCHAR; ngược lại sẽ tương đương với CHAR TCHAR Nếu cờ hiệu UNICODE được định nghĩa, kiểu này tương
đương với WCHAR; ngược lại sẽ tương đương với CHAR UCHAR ký tự không dấu (unsigned char)
UINT số nguyên không dấu (unsigned int)
UINT_PTR giá trị INT_PTR không dấu
UINT32 giá trị INT32 không dấu
UINT64 giá trị INT64 không dấu
ULONG giá trị LONG không dấu
ULONG_PTR giá trị LONG_PTR không dấu
ULONG32 giá trị LONG32 không dấu
ULONG64 giá trị LONG64 không dấu
ULONGLONG số nguyên 64 bits không dấu
UNSIGNED thuộc tính không dấu
USHORT giá trị SHORT không dấu
WCHAR ký tự UNICODE 16 bits
WINAPI qui ước gọi hàm của những hàm hệ thống
WPARAM tham số thứ 1 của message, kiểu WORD