Giáo trình Lập trình C for Win

Mục lục

Trang

Bài 1: GIỚI THIỆU CHUNG . 2

1. Mở đầu . 2

2. Các thư viện lập trình của Windows . 3

3. Các khái niệm cơ bản . 4

4. Lập trình sự kiện (Even driven programming). 5

5. Các thành phần giao diện đồ họa (GUI) . 6

6. Cấu trúc chương trình C for Win. 10

7. Qui trình hoạt động của chương trình ứng dụng . 10

8. Một số quy ước đặt tên. 11

9. Ví dụ . 11

10. Tài nguyên của ứng dụng (Resources) . 18

11. Một số kiểu dữ liệu mới. 19

12. Phân tích, tìm hiểu source code của project . 19

Bài 2: PAINT VÀ REPAINT. 24

1. Giới thiệu . 24

2. Tổng quan về GDI (Graphics Device Interface) . 25

3. Một số hàm đồ họa cơ sở . 28

4. Kết luận. 30

Bài 3: CÁC THIẾT BỊ NHẬP LIỆUU . 31

1. Bàn phím . 31

2. Thiết bị chuột . 38

3. Timer. 41

Bài 4: HỘP THOẠI VÀ ĐIỀU KHIỂN . 45

1. Hộp thoại. 45

2. Menu . 57

Bài 5: XỬ LÝ VĂN BẢN . 62

1. Hiển thị văn bản . 62

2. Định dạng văn bản. 64

3. Sử dụng font . 65

Tài liệu tham khảo . 69

pdf69 trang | Chia sẻ: hienduc166 | Lượt xem: 954 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình C for Win, để xem tài liệu hoàn chỉnh bạn click vào nút TẢI VỀ ở trên
lpnTabStopPositions trỏ đến giá trị xác định một dãy tăng tuần hoàn là 
bội số của dãy này. Ví dụ, nếu nNumTabs bằng 1, và 
Bài giảng: Lập trình C for Win .............................................................................................Trang 62/69 
 lpnTabStopPositions bằng 30, ta sẽ có dãy tab dừng tại vị trí 30, 60, 90, 
 pixels. 
Trường nTabOrigin xác định tọa độ theo trục x của điểm bắt đầu tính 
khoảng cách tới các tab. Giá trị này không nhất thiết phải là vị trí đầu 
tiên của chuỗi, có thể chọn trùng hoặc không. 
Hàm trả về kích thước chuỗi hiển thị, theo đơn vị logic, nếu thành công. 
Ngược lại, hàm trả về 0. Trong đó, chiều cao chuỗi là WORD cao của 
biến kiểu LONG, chiều rộng là WORD thấp. 
™ int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT 
lpRect, UINT uFormat); 
Cũng như các hàm xuất văn bản khác, hàm DrawText xuất chuỗi xác 
định bởi con trỏ lpString có độ dài nCount. Tuy nhiên, với chuỗi có ký 
tự kết thúc là NULL, nếu nCount bằng -1, hàm sẽ tự động tính toán 
chiều dài của chuỗi. 
Biến lpRect trỏ đến cấu trúc RECT của hình chữ nhật (theo toạ độ logic) 
mà trong đó văn bản thể hiện theo định dạng được thiết lập trong 
uFormat. 
Nếu uFormat bằng 0, nội dung văn bản sẽ được hiển thị theo từng dòng 
từ trên xuống dưới. Mỗi dòng mới được xác định thông qua ký tự về đầu 
dòng CR (carriage return, bằng ‘\r’ hoặc 0x0D) hoặc ký tự xuống dòng 
LF (linefeed, bằng ‘\n’ hoặc 0x0A) có trong văn bản. Phần văn bản bên 
ngoài hình chữ nhật lpRect sẽ bị cắt bỏ. 
Giá trị uFormat bằng 0 cũng chính là giá trị cờ canh lề trái 
(DT_LEFT). Ngoài ra, ta có thể thiết lập các cờ canh lề phải 
(DT_RIGHT), và canh lề giữa (DT_CENTER) cho văn bản. 
Để loại bỏ chức năng điều khiển của các ký tự CR và LF, cần thêm vào 
cờ DT_SINGLELINE. Nếu thiết lập DT_SINGLELINE, ta cũng có thể 
chỉ định vị trí của dòng hiển thị ở phía trên (DT_TOP), phía dưới 
(DT_BOTTOM), hoặc ở chính giữa (DT_VCENTER) trong vùng hình 
chữ nhật. 
Bài giảng: Lập trình C for Win .............................................................................................Trang 63/69 
 Trong trường hợp hiển thị nhiều dòng văn bản, Windows chỉ ngắt dòng 
khi gặp ký tự CR và LF. Để ngắt dòng dài hơn kích thước hình chữ nhật 
hiển thị, cần thiết lập cờ DT_WORDBREAK. Nếu không muốn Windows 
cắt bỏ các phần dư ra khi vẽ chữ vượt quá phạm vi khung chữ nhật, ta 
thêm cờ DT_NOCLIP. Nếu muốn ký tự tab (‘\t’ hoặc 0x09) được diễn 
dịch thành ký tự phân cột, cần thêm cờ DT_EXPANDTABS. Giá trị mặc 
định của tab là 8 khoảng trắng. Cờ DT_TABSTOP được dùng để đặt lại 
giá trị tab. Trong trường hợp này, byte cao của word thấp (bits 15-8) 
của uFormat sẽ chứa giá trị tab cần thay thế. 
2. Định dạng văn bản 
a) Hàm thiết lập màu chữ và màu nền: 
™ COLORREF SetTextColor (HDC hdc, COLORREF color); 
™ COLORREF SetBkColor (HDC hdc, COLORREF color); 
• Trả về giá trị màu trước đó. 
• Nếu có lỗi trả về CLR_INVALID. 
™ int SetBkMode (HDC hdc, int mode) ; 
• Trả về chế độ nền trước đó. 
• Trả về 0 nếu gặp lỗi. 
mode = OPAQUE : Mỗi khi hiển thị văn bản thì màu nền được thay 
đổi thành màu nền hiện hành. Hoặc TRANSPARENT: Màu nền 
không bị ảnh hưởng Î SetBkColor() bị vô hiệu. 
b) Xác định màu chữ và màu nền hiện hành: 
™ COLORREF GetTextColor(HDC hDC); 
™ COLORREF GetBkColor(HDC hDC); 
c) Xác định chế độ nền hiện tại: 
™ int GetBkMode(HDC hDC); 
Hàm trả về giá trị TRANSPARENT hoặc OPAQUE, nếu thành công. 
Ngược lại, giá trị trả về là zero. 
d) Để xác lập vị trí chuỗi văn bản hiển thị dựa trên điểm gốc nXStart, 
nYStart: 
Bài giảng: Lập trình C for Win .............................................................................................Trang 64/69 
 ™ UINT SetTextAlign(HDC hDC, UINT fMode); 
fMode: TA_LEFT, TA_RIGHT, TA_CENTER, TA_TOP, 
TA_BOTTOM, TA_BASELINE, TA_UPDATE 
e) Để biết chế độ canh lề văn bản hiện tại, ta dùng hàm : 
™ UINT GetTextAlign(HDC hDC); 
Nếu thành công, hàm trả về cờ tương ứng của canh lề văn bản hiện 
hành. Ngược lại, giá trị trả về là GDI_ERROR. 
f) Để thay đổi khoảng cách giữa các ký tự: 
™ int SetTextCharacterExtra(HDC hDC, int nCharExtra); 
Nếu thành công, hàm trả về khoảng cách trước khi được thiết lập. 
Ngược lại, giá trị trả về là 0x80000000. 
g) Để biết khoảng cách hiện tại, ta dùng hàm : 
™ int GetTextCharacterExtra(HDC hDC); 
Nếu thành công, giá trị trả về cho biết khoảng cách hiện tại. Ngược lại, 
giá trị trả về là 0x80000000. 
3. Sử dụng font 
• Lập chỉ số font chữ. 
• Nạp font chữ. 
• Gán chỉ số font chữ cho ngữ cảnh thiết bị. 
Đối với Font chữ mặc định (hệ thống):Sử dụng các font chữ Windows 
đang sử dụng. 
MACRO FONT 
ANSI_FIXED_FONT Font với kích thước cố định của ký tự dựa 
trên Windows. Font Courier là một ví dụ 
điển hình của dạng font này. 
ANSI_VAR_FONT Font với độ rộng ký tự thay đổi dựa trên các 
ký tự chuẩn của Windows. Font MS San 
Serif là một ví dụ điển hình. 
DEVICE_DEFAULT_FONT Font với thiết bị đã cho được chọn mặc 
nhiên. Dạng font này thường co sẵn trong hệ 
thống để điều khiển việc trình bày trên thiết 
Bài giảng: Lập trình C for Win .............................................................................................Trang 65/69 
 bị. Tuy nhiên, đối với một số thiết bị, font 
được cài đặt ngay trên thiết bị. Ví dụ, đối với 
máy in, các font thiết bị cài sẵn thực hiện 
thao tác in nhanh hơn so với việc load bitmap 
ảnh về từ máy tính. 
DEFAULT_GUI_FONT Font của giao diện đồ họa được thiết lập mặc 
định. 
OEM_FIXED_FONT Font chữ cố định, dựa trên bộ ký tự OEM. Ví 
dụ, đối với máy IBM®, font OEM dựa trên 
bộ ký tự IBM PC. 
SYSTEM_FONT Font hệ thống của Windows. Được hệ điều 
hành dùng để trình bày các thành phần giao 
diện như thanh tiêu đề, menu, nội dung văn 
bản trong các hộp thoại thông điệp. Các font 
hệ thống này luôn có sẵn khi cài hệ điều 
hành, trong khi các font khác cần phải cài 
thêm tùy theo ứng dụng sau này. 
SYSTEM_FIXED_FONT Font Windows được sử dụng như font hệ 
thống trong các phiên bản trước 3.0. 
Macro các font định nghĩa sẵn. 
• Nạp: HGDIOBJ GetStockObject(int fnObject) Æ Nếu thành công, trả 
về handle font chữ. Ngược lại, giá trị trả về là NULL. 
Trong đó, kiểu HGDIOBJ là HFONT, biến fnObject là một trong các 
macro ở bảng trên. 
• Gán chỉ số cho DC: HGDIOBJ SelectObject(HDC hDC, HGDIOBJ 
hGDIObj) Æ Trả về handle font chữ vừa sử dụng trước, lỗi trả về 
GDI_ERROR 
Hoặc gọn hơn, ta có thể gọi : 
SelectObject(hDC.GetStockObject(fnObject)); 
DeleteObject (Đối tượng): để hủy. 
Ví dụ: 
HFONT hfnt, hOldFont; 
hfnt = GetStockObject(ANSI_VAR_FONT); 
if (hOldFont = SelectObject(hdc, hfnt)) 
{ 
Bài giảng: Lập trình C for Win .............................................................................................Trang 66/69 
 TextOut(hdc, 10, 50, "Sample ANSI_VAR_FONT text.", 26); 
SelectObject(hdc, hOldFont); 
} 
™ Xác định kích thước font 
BOOL GetTextMetrics(HDC hdc, LPTEXTMETRIC lptm); 
typedef struct tagTEXTMETRIC // tm 
{ 
LONG tmHeight; 
LONG tmAscent; 
LONG tmDescent; 
LONG tmInternalLeading; 
LONG tmExternalLeading; 
LONG tmAveCharWidth; 
LONG tmMaxCharWidth; 
LONG tmWeight; 
LONG tmOverhang; 
LONG tmDigitizedAspectX; 
LONG tmDigitizedAspectY; 
BCHAR tmFirstChar; 
BCHAR tmLastChar; 
BCHAR tmDefaultChar; 
BCHAR tmBreakChar; 
BYTE tmItalic; 
BYTE tmUnderlined; 
BYTE tmStruckOut; 
BYTE tmPitchAndFamily; 
BYTE tmCharSet; 
} TEXTMETRIC; 
Cấu trúc TEXTMETRIC gồm 20 thành phần, một số thành phần quan 
trọng gồm: 
• tmHeight: Chiều cao ký tự tính bằng pixel. 
• tmInternalLeading: Vùng chứa dấu trọng âm. 
• tmExternalLeading: Không gian giữa 2 dòng. 
• tmAveCharWidth: Bề rộng trung bình mỗi ký tự. 
• tmPitchAndFamily: Họ của font (8 bit). 
Ví dụ: 
static int cxchar, cychar; 
Bài giảng: Lập trình C for Win .............................................................................................Trang 67/69 
 TEXTMETRIC tm; 
case WM_CREATE: 
{ 
 hdc = GetDC(hwnd); 
 GetTextMetrics(hdc, &tm); 
 cxchar=tm.tmInternalLeading+tm.tmExternal; 
 cychar=tm.tmAveCharWidth; 
 ReleaseDC(hwnd, hdc); 
 return 0; 
} 
case WM_PAINT: 
 { 
 for(int i=0; i<10; i++) 
 TextOut(hdc, cxchar, cychar*i, “aaa”, 3); 
} 
™ Tính độ dài của xâu ký tự 
• Các ký tự hiển thị có bề rộng khác nhau do vậy không nên dùng 
hàm strlen() để lấy số ký tự Æ độ dài. 
• Dùng hàm: BOOL GetTextExtentPoint32 (HDC hdc, LPCSTR 
lpszString, int len, LPSIZE lpSize); 
typedef struct tagSIZE 
{ 
 long cx; 
 long cy; //Tính theo đơn vị logic 
} SIZE; 
len: Tổng số ký tự. 
Tạo lập đặc tính mới cho font chữ 
HFONT CreateFont (int Height, int Width, int Escapement, int Orientation, 
int fnWeight, DWORD Italic, DWORD Underline, DWORD StrikeOut, 
DWORD CharSet, DWORD outputPrecision, DWORD ClipPrecision, 
DWORD Quality, DWORD PitchAndFamily, LPCSTR lpszFontName) 
Với: 
Bài giảng: Lập trình C for Win .............................................................................................Trang 68/69 
 • PitchAndFamily: DEFAULT_PITCH | FF_DONTCARE 
• charSet: ANSI_CHARSET 
• outputPrecision: OUT_DEFAULT_PRECIS 
• clipPrecision: CLIP_DEFAULT_PRECIS 
• Quality: DEFAULT_QUALITY 
• fnWeight: 0 Æ 1000 (thông thường là 400) 
Tên Giá trị 
FW_DONTCARE 0 
FW_THIN 100 
FW_EXTRALIGHT 200 
FW_ULTRALIGHT 200 
FW_LIGHT 300 
FW_NORMAL 400 
FW_REGULAR 400 
FW_MEDIUM 500 
Tên Giá trị 
FW_SEMIBOLD 600 
FW_DEMIBOLD 600 
FW_BOLD 700 
FW_EXTRABOLD 800 
FW_ULTRABOLD 800 
FW_HEAVY 900 
FW_BLACK 900 
Macro xác định độ đậm nhạt lfWeight 
Tài liệu tham khảo 
[1] ĐẶNG VĂN ĐỨC: “Lập trình C trên Windows”. Nhà Xuất Bản Khoa Học 
Kỹ Thuật – 1998. 
[2] NGUYỄN ĐÌNH QUYỀN – MAI XUÂN HÙNG: “Giáo trình lập trình C trên 
Windows”. Nhà Xuất Bản Đại Học Quốc Gia Tp. Hồ Chí Minh – 2003. 
[3] MSDN – 10/2001 
Bài giảng: Lập trình C for Win .............................................................................................Trang 69/69 

File đính kèm:

  • pdf3872201.pdf