Cơ chế lập trình trong Windows : Một chương trình ứng dụng người lập trình phải xây dựng, khai báo, kế thừa các tài nguyên về giao diện. Hộp hội thoại... Tập khai báo tài nguyên :
Trang 1Lương Văn Vân
BÀI GIẢNG LẬP TRÌNH C TRÊN WIN
Trang 3TÀI LIỆU THAM KHẢO
1 Lập trình WinDows bằng Visual C++, Đặng Văn Đức – Lê Quốc Hưng, NXB Giáo dục, 2001.
2 Lập trình C trên Win, Đặng Văn Đức, Nhà xuất bản Khoa học kỹ thuật, 1998.
3 Bài giảng Lập trình C trên Windows.
4 www.codeproject.com, www.codeguru.com
Lập trình C trên Windows
Trang 4TỔNG QUAN LẬP TRÌNH C TRÊN WIN
Trang 5Chương 1: TỔNG QUAN LẬP TRÌNH C TRÊN WINDOWS
Mở đầu
Hệ điều hành Microsoft Windows Lập trình trên Microsoft Windows Cách viết một ứng dụng trên MS Windows Lập trình C trên Windows
Trang 6 Các ứng dụng của Windows rất dễ sữ dụng, nhưng rất khó đối với người tạo lập ra chúng.
Lập trình trên Windows khó và phức tạp hơn nhiều so với lập trình trên Dos.
Windows cung cấp các hàm để người lập trình thâm nhập các đặc trưng của hệ điều hành gọi là giao diện lập trình ứng dụng (API) Những hàm này đặt trong các thư viện liên kết động (.DLL).
Trang 71.2: HỆ ĐIỀU HÀNH MICROSOFT WINDOWS
Hệ điều hành Windows giao tiếp với người sử dụng bằng mơi trường đồ họa (graphic).
Windows là hệ thống đa nhiệm cho phép nhiều ứng dụng cùng thi hành đồng thời
Windows cho phép chạy một ứng dụng mà mã của
nó lớn hơn bộ nhớ hiện có nhờ vào cơ chế bộ nhớ ảo
Windows cung cấp cơ chế thư viện liên kết động
Hàng đợi nhập dữ liệu
Lập trình C trên Windows
Trang 8 Cơ chế lập trình trong Windows : Một chương trình ứng dụng người lập trình phải xây dựng, khai báo, kế thừa các tài nguyên về giao diện.
Hộp hội thoại
Trang 91.3: LẬP TRÌNH TRÊN MICROSOFT WINDOWS
Sự khác biệt so với lập trình trên MS-Dos
Lập trình C trên Windows
Trang 10 Cơ chế thông điệp:
Trang 111.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Các thành phần cơ bản tạo nên ứng dụng
Chương trình nguồn:
Bao gồm các tập tin *.C và *.H tương tự như các chương trình trong C chuẩn cho DOS Tuy nhiên trong đó là các cấu trúc đặc thù cho Windows
Tập tin *.H để định nghĩa các hằng số, khai báo biến, khai báo hàm,
Lập trình C trên Windows
Trang 12 Tập khai báo tài nguyên :
Tất cả các tài nguyên được mô tả tóm tắt trong tập tin có tên phụ là
*.RC
Tài nguyên cho một ứng thường bao gồm :
• Biểu tượng của ứng dụng (Icon)
• Con trỏ màn hình(cursor)
• Các hình ảnh (bitmap )
• Hộp hội thoại (Dialog)
• Khai báo control
• Menu cho ứng dụng
Trang 131.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Tập tin khai báo các thuộc tính cho ứng dụng
Các thuộc tính chẳng hạn như kích thước stack, kích
thước heap, được khai báo trong tập tin DEF Nếu không có chương trình ứng dụng cài đặt giá trị mặc định.
Tập tin đề án :
Tên_Dự_án DSW (*.DSW)
Lập trình C trên Windows
Trang 14 Hàm WinMain
int WINAPI WinMain ( HINSTANCE hInstance ,
HINSTANCE hPrevInstance , LPSTR lpszCmdLine , int
nCmdShow )
hInstance chỉ danh của instance hiện hành
hPrevInstance chỉ danh của instance vừa chạy lần trước Nếu có
thì tham số khác không , nếu tham số bằng 0 thì hInstance là
instance đầu tiên của ứng dụng.
lpszCmdLine : câu lệnh gọi từ chức năng Run trong thực đơn File
của Program Manager, giống như đối số argc của hàm main() trong C chuẩn và có kiểu char far * (LPSTR).
nCmdShow : Qui định cách thức thể hiện window của ứng dụng
Trang 151.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Các thành phần của hàm WinMain
Đăng ký lớp cửa sổ:
WNDCLASS wndclass; // biến để định nghĩa một 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;//Giá trị mở rộng của lớp
wndclass.cbWndExtra = 0;//
Lập trình C trên Windows
Trang 16// Định nghĩa kiểu cửa sổ (tt):
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
Trang 171.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Lập trình C trên Windows
Trang 18// 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
Trang 191.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
Lập trình C trên Windows
Trang 20// Chu trình xử lý các thông điệp
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
} return msg.wParam;
}
Trang 211.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Hàm window (window function)
Một ứng dụng giao tiếp với người sử dụng qua một hay nhiều
window, mỗi window trong ứng dụng được kết hợp với một window function
Nhiệm vụ của hàm window là xử lý các message do hệ điều
hành Windows hay WinMain gởi tới
Một ứng dụng viết trên Windows không bao giờ gọi trực tiếp
window function
LRESULT CALLBACK WndProc(HWND hWnd , UINT
Message ,WPARAM wParam , LPARAM lParam );
Lập trình C trên Windows
Trang 22/*Xử lý các thông điệp cần thiết với ứng dụng*/
Trang 231.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Thông điệp này chỉ định rằng Windows đang trong quá trình
hủy một cửa sổ khi người sử dụng click vào nút close button
hay chọn close trong thực đơn hệ thống
Thông điệp này được Windows gởi đến hàm window thông
qua tham số Message của hàm window
Xử lý thông thường của thông điệp này là kết thúc chương
trình bởi vì người sử dụng huỷ bỏ cửa sổ chính Để kết thúc chương trình gọi hàm PostQuitMessage(0), hàm này gởi đi thông điệp WM_QUIT làm cho message loop kết thúc
Lập trình C trên Windows
Trang 24 Thông điệp WM_CREATE
Hàm window nhận được thông điệp này khi Windows đang xử
lý hàm CreateWindow trong hàm WinMain, tức là lúc chương trình mới bắt đầu
Thông điệp này gởi đến hàm window qua thông số Message
của hàm window
Thông điệp gởi đi khi chương trình mới bắt đầu do đó việc xử
lý message là thường khởi động các giá trị ban đầu của chương trình ứng dụng
Trang 251.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
Thông điệp WM_PAINT
Thông điệp WM_PAINT được phát đi khi một phần hay tất cả
vùng client (vùng làm việc của cửa sổ) bị không hợp lệ và cần cập nhật, vẽ lại
Một vùng client không hợp lệ khi cửa sổ đầu tiên được tạo ra,
khi người sử dụng thay đổi kích thước cửa sổ, khi người sử dụng di chuyển các cửa sổ xung quanh màn hình để chúng xếp chồng lên nhau Windows không lưu các vùng cửa sổ chị che nên khi không bị che thì chúng bị bất hợp lệ
Thông điệp này được gởi qua thông số Message của hàm
window và việc xử lý thông điệp này luôn bắt đầu bằng hàm BeginPaint, và kết thúc bằng EndPaint
Lập trình C trên Windows
Trang 26 Xây dựng một ứng dụng đầu tiên
WinMain : hàm chính của chương trình thực hiện các
chức năng :
• Khai báo lớp cửa sổ.
• Đăng ký lớp cửa sổ vừa khai báo.
• Tạo và hiển thị lớp cửa sổ trên.
• 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ổ
Trang 271.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS
PSTR : một con trỏ đến một chuỗi tương tự như char *
WPARAM và LPARAM , trong tham số thứ 3 của hàm
WndProc được khai báo là kiểu WORD, với kích thước 16-bit , còn tham số thứ 4 có kiểu LONG là 32-bit
LRESULT : Kiểu này đơn giản được định nghĩa như là
kiểu LONG
HANDLE: là một số nguyên 32-bit được sử dụng như
một kiểu định danh
Lập trình C trên Windows
Trang 28Kiể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 không dấu 32-bit.
LONG long 32-bit.
Trang 29Chương 2: HỘP THOẠI VÀ THANH TRÌNH ĐƠN
Giới thiệu
Menu Hộp Thoại Lập trình C trên Windows
Trang 30 Hộp thoại ( dialog ) và thanh trình đơn
trong việc tổ chức giao tiếp giữa người sử dụng và chương trình Hộp thoại được xem như là một loại cửa sổ đặc biệt, là công cụ mềm dẻo, linh hoạt để đưa thông tin vào chương trình một cách dễ dàng Trong khi
các thao tác đơn giản hơn, thông qua các nhóm chức năng thường sử dụng
Trang 312.1: MENU
Menu popup hay dropdown
Các trạng thái của Menu :
Trang 32MENUITEM "&[ Tên_mục_con 1.1 ]", [ Tên ID 1.1 ]
MENUITEM "&[ Tên_mục_con 1.2 ]", [ Tên ID 1.2 ]
……….
END
POPUP "&[ Tên_Mục 2 ]"
BEGIN
MENUITEM "&[ Tên_mục_con 2.1 ]", [ Tên ID 2.1 ]
MENUITEM "&[ Tên_mục_con 2.2 ]", [ Tên ID 2.2 ]
……… MENUITEM SEPARATOR
Trang 332.1: MENU
Cách đặt menu vào cửa sổ của chương trình
ứng dụng:
trúc lớp WNDCLASS bằng tên menu được
khai báo trong tập tin tài nguyên.
Ví dụ:
wndclass.lpszMenuName = “Tên_Menu”;
WM_COMMAND và gởi đến chương trình khi
người dùng chọn một mục liệt kê.
Lập trình C trên Windows
Trang 34 int MessageBox ( HWND hWnd , LPCTSTR lpText ,
LPCTSTR lpCaption , UINT uType );
hWnd: Chỉ danh cửa sổ sở hữu hộp thông báo, có thể để NULL
lpText: Chuỗi thông báo
lpCaption: Tựa đề hộp thông báo
uType: Kiểm bao gồm các nút điều khiển
Trang 35HỘP THÔNG BÁO
uType có thể là các giá trị sau:
MB_ABORTRETRYIGNORE : Hộp thông báo bao gồm các nút Abort, Retry, Ignore
MB_OK : Hộp thông báo bao gồm các nút Ok
MB_OKCANCEL : Hộp thông báo bao gồm các nút Cancel, Ok
MB_RETRYCANCEL : Hộp thông báo bao gồm các nút Retry, Cancel
MB_YESNO : Hộp thông báo bao gồm các nút Yes, No
MB_YESNOCANCEL : Hộp thông báo bao gồm các nút Yes,
No, Cancel
Lập trình C trên Windows
Trang 36 Giá trị trả về của hàm:
IDABORT : Nút Abort được chọn
IDCANCEL : Nút Cancel được chọn
IDIGNORE : Nút Ignore được chọn
IDNO : Nút No được chọn
IDOK : Nút Ok được chọn
IDRETRY : Nút Retry được chọn
IDYES : Nút Yes được chọn
Trang 37VÍ DỤ:
Xây dựng một ứng minh họa Menu và hộp thông báo:
Lập trình C trên Windows
Trang 392.1: HỘP THOẠI
Các loại Hộp thoại: Có 3 loại hộp
thoại cơ bản
Hộp thoại trạng thái ( modal )
Hộp thoại không trạng thái ( modeless )
Hộp thoại thông dụng ( common dialog )
Lập trình C trên Windows
Trang 40 Cách tạo hộp thoại đơn giản
Cách 1: Tạo hộp thoại trong tập tin tài nguyên *.RC
[Định_danh] DIALOG DISCARDABLE X,Y ,W,H
STYLE [ Hằng hiển thị kiểu hộp thoại]
FONT <size>, “Font name"
BEGIN
LOẠI ĐIỀU KHIỂU <“Nhãn”>,[ID], X,Y ,W,H ………
Trang 41Hộp thoại trạng thái (
Hộp thoại trạng thái (modal modal )
Ví dụ: Tạo ra hộp thoại sauLập trình C trên Windows
Trang 42 Viết code như sau:
DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90
STYLE DS_MODALFRAME | WS_POPUP
FONT 9, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,54,65,50,14CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10ICON IDI_ICON1,IDC_STATIC,68,9,21,20
Trang 44 Kích hoạt một hộp hội thoại:
Int DialogBox(HINSTANCE hThisInst, LPCSTR lpszName,
HWND hWnd, DLGPROC lpDFunc);
hThisInst : là chỉ danh thể hiện hiện thời
lpszName: Tên hộp hội thoại được xác định trong tập tin tài nguyên
hWnd :Chỉ danh của cửa sổ cha chứaDialog
lpDFunc: Con trỏ trỏ đến hàm xử lý message cho hộp hội thoại
Trang 45Hộp thoại trạng thái (
Hộp thoại trạng thái (modal modal )
Thủ tục xử lý thông điệp của hộp thoại:
UINT Message , WPARAM wParam , LPARAM lParam )
DialogProc không cần xử lý thông điệp WM_DESTROY, WM_PAINT và WM_CREATE
Thông điệp WM_INITDIALOG dùng để khởi tạo.
Thông điệp WM_COMMAND: gởi đến cửa sổ cha khi ta
kích hoạt (trong word thấp của đối số wParam)
Lập trình C trên Windows
Trang 46 Tắt hộp hội thoại:
Để tắt hộp hội thoại modal dùng hàm EndDialog() như sau:
BOOL EndDialog (HWND hDlg, int Status);
hWnd : là chỉ danh hộp hội thoại
Status: Mã trạng thái do hàm DialogBox trả về Giá trị này có
thể bỏ qua.
Hàm trả về giá trị nonzero nếu thành công ngược lại zero
Trang 47Chương 3: CÁC ĐỐI TƯỢNG ĐIỀU KHIỂNLập trình C trên Windows
Trang 48 Nút nhấn (Push button)
PUSHBUTTON “Nhãn", IDC_RED , X,Y , W, H
xử lý hộp hội thoại.
Trang 49Các loại điều khiển
Nuùt CheckBox
CHECKBOX “String” , CBID , X, Y, W, H
String : là văn bản trình bày dọc theo
W, H : Chiều rộng, cao hộp chức văn bản
Lập trình C trên Windows
Trang 50 Hoạt động của checkbox
LONG SendDlgItemMessage( HWND hWnd, int ID, UINT
IDMsg, WPARAM wParam, LPARAM lParam);
Message BM_SETCHECK: Được gởi đến checkbox để xác lập trạng thái chọn hay không chọn.
Message BM_GETCHECK: Được gởi đến checkbox để lấy các thông tin chọn hay không chọn.
Giá trị BST_CHECKED: Hộp kiểm được chọn.
Giá trị BST_UNCHECKED: Hộp kiểm không được chọn.
Trang 51Các loại điều khiển
Trang 52 Điều khiển tĩnh
LTEXT “string”, ID,X, Y, W, H //Chuỗi được canh trái
RTEXT “string”, ID,X, Y, W, H // Chuỗi được canh phải
CTEXT “string”, ID,X, Y, W, H // Chuỗi được canh giữa
String: là chuỗi được hiển.
ID: chỉ danh của điều khiển
X,Y: Tọa độ bắt đầu chuỗi
W, H: Chiều rộng, cao của chuỗi
Trang 53Các loại điều khiển
Điều khiển Radio
Giống như điều khiển checkbox như lựa chọn có loại trừ
AUTORADIOBUTTON “String”, ID, X, Y, W, H
Hàm SendDlgItemMessage() gởi thông điệp BM_GET_CHECK
Nếu wParam là BST_CHECHED ,nút này sẽ được chọn,
Nếu là BST_UNCHECHED hộp sẽ được xóa
Lập trình C trên Windows
Trang 54 Hộp nhập văn bản (EDITTEXT)
Khai báo trong tập tin RC
EDITTEXT ID , X,Y, W,H
Cách lấy dữ liệu từ hộp nhập dữ liệu
UINT GetDlgItemText ( HWND hWnd, int ID, LPSTR lpstr, int Max)
• hWnd: chỉ danh hộp hội thoại
• ID: chỉ danh EditText
• lpstr: Con trỏ chuổi văn bản
• Max: số ký tự tối đa cần lấy
Trang 55Các loại điều khiển
Cách đưa dữ liệu lên hộp nhập dữ liệu
UINT SetDlgItemText ( HWND hWnd, int ID , LPSTR lpstr )
• hWnd: chỉ danh hộp hội thoại
• ID: chỉ danh EditText
• lpstr: Con trỏ chuổi văn bản
Lập trình C trên Windows
Trang 56 Hộp danh sách(LISTBOX)
Khai báo trong tập tin RC
LISTBOX ID, X, Y, W, H, style
Đưa danh sách mục chọn vào listbox thông qua message WM_INIDIALOG của hộp hội thoại vì message này được phát đi khi hộp hội thoại khởi động.
Trang 57Các loại điều khiển
Để thêm một mục chọn vào listbox cần gởi message
LB_ADDSTRING đến listbox bằng hàm
SendDlgItemMessage()
LONG SendDlgItemMessage (HWND hDlg, int ID, UINT IDMsg, WPARAM wParm, LPARAM lParam)
• hWnd: cửa sổ dialog
• ID: chỉ danh listbox
• IDMsg : Message cần gởi
• WParam =0
• LParam: chuỗi cần gởi đến
Lập trình C trên Windows
Trang 58 Ví dụ
SendDlgItemMessage(hWnd, LBID, LB_ADDSTRING, 0, “Apple”);
Trang 59
Các loại điều khiển
Các thao tác
LB_INSERTSTRING : chèn một chuỗi vào vị trí bất kỳ
Cú pháp:
• SendDlgItemMessage(hwndList, LB_INSERTSTRING,
iIndex , (LPARAM) szString);
iIndex là vị trí muốn chèn chuỗi vào
Nếu giá trị này bằng -1 thì chuỗi được chèn vào đáy của list box
Lập trình C trên Windows
Trang 60 LB_DELETESTRING : Xóa một chuỗi trong list box
Cú pháp:
• SendDlgItemMessage(hwndList, LB_DELETESTRING,
iIndex, 0);
iIndex là vị trí muốn xóa chuỗi vào
LB_RESETCONTENT: Xóa hết các phần tử nằm trong list box
Trang 61
Các loại điều khiển
LB_GETCOUNT : đếm số mục trong List box
Cú pháp:
• SendDlgItemMessage(hwndList, LB_GETCOUNT, 0 , 0);
LB_GETTEXT: Để chép chuỗi trên mục ListBox vào vùng đệp (chuỗi)