Bài 4: Hp thai và điu khin Trn Minh Thái
PostQuitMessage(0) ; 109
110
111
112
113
return 0 ;
}
return DefWindowProc(hwnd, message, wParam, lParam) ;
}
Bài ging: Lp trình C for Win .............................................................................................Trang 61/69
Bài 5: XVĂN BN
Phân b thi lượng:
- S tiết ging lp: 6 tiết
- S tiết t hc nhà: 6 tiết
- S tiết cài đặt chương trình nhà: 12 tiết
1. Hin th văn bn
Để hin th ni dung văn bn trên các thiết b xut, da vào tng trường hp th
hin khác nhau, ta dùng các hàm Win32 API khác nhau. Các hàm này ph
thuc vào font ch, thuc tính ca thiết b ng cnh DC (Device Context ) và
khong cách ký t th hin.
Hàm ph biến nht thc hin thao tác xut mt chui ký t văn bn, s dng
font ch, màu ch và màu nn hin hành là :
BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR
lpString,int cbString);
Æ
tr v giá tr khác không nếu thành công, ngược li tr v 0.
LONG TabbedTextOut(HDC hDC, int nX, int nY, LPCTSTR lpString, int
nCount, int nNumTabs, LPINT lpnTabStopPositions, int nTabOrigin);
Nếu trong chui ký t có các ký t tab (‘\t’ hoc 0x09), hàm
TabbedTextOut s chuyn các ký t tab vào dãy các v trí "dng" tương
ng. S lượng các tab dng được xác định bi nNumTabs, và
lpnTabStopPositions là dãy v trí các tab dng theo đơn v tính pixels. Ví
d, nếu độ rng trung bình ca mi ký t là 8 pixels, và mi tab dng
cn đặt cách nhau 5 ký t, dãy các tab dng s phi ln lượt có giá tr
40, 80, 120, … . Tuy nhiên, các giá tr này không nht thiết phi là bi
s ca nhau.
Nếu biến nNumTabs hoc lpnTabStopPositions có giá tr là 0 và NULL,
các tab dng được đặt cách nhau tng 8 ký t. Nếu nNumTabs bng 1,
lpnTabStopPositions tr đến giá tr xác định mt dãy tăng tun hoàn là
bi s ca dãy này. Ví d, nếu nNumTabs bng 1, và
Bài ging: Lp trình C for Win .............................................................................................Trang 62/69
lpnTabStopPositions bng 30, ta s có dãy tab dng ti v trí 30, 60, 90,
… pixels.
Trường nTabOrigin xác định ta độ theo trc x ca đim bt đầu tính
khong cách ti các tab. Giá tr này không nht thiết phi là v trí đầu
tiên ca chui, có th chn trùng hoc không.
Hàm tr v kích thước chui hin th, theo đơn v logic, nếu thành công.
Ngược li, hàm tr v 0. Trong đó, chiu cao chui là WORD cao ca
biến kiu LONG, chiu rng là WORD thp.
int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT
lpRect, UINT uFormat);
Cũng như các hàm xut văn bn khác, hàm DrawText xut chui xác
định bi con tr lpString có độ dài nCount. Tuy nhiên, vi chui có ký
t kết thúc là NULL, nếu nCount bng -1, hàm s t động tính toán
chiu dài ca chui.
Biến lpRect tr đến cu trúc RECT ca hình ch nht (theo to độ logic)
mà trong đó văn bn th hin theo định dng được thiết lp trong
uFormat.
Nếu uFormat bng 0, ni dung văn bn s được hin th theo tng dòng
t trên xung dưới. Mi dòng mi được xác định thông qua ký t v đầu
dòng CR (carriage return, bng ‘\r’ hoc 0x0D) hoc ký t xung dòng
LF (linefeed, bng ‘\n’ hoc 0x0A) có trong văn bn. Phn văn bn bên
ngoài hình ch nht lpRect s b ct b.
Giá tr uFormat bng 0 cũng chính là giá tr c canh l trái
(DT_LEFT). Ngoài ra, ta có th thiết lp các c canh l phi
(DT_RIGHT), và canh l gia (DT_CENTER) cho văn bn.
Để loi b chc năng điu khin ca các ký t CR và LF, cn thêm vào
c DT_SINGLELINE. Nếu thiết lp DT_SINGLELINE, ta cũng có th
ch định v trí ca dòng hin th phía trên (DT_TOP), phía dưới
(DT_BOTTOM), hoc chính gia (DT_VCENTER) trong vùng hình
ch nht.
Bài ging: Lp trình C for Win .............................................................................................Trang 63/69
Trong trường hp hin th nhiu dòng văn bn, Windows ch ngt dòng
khi gp ký t CR và LF. Để ngt dòng dài hơn kích thước hình ch nht
hin th, cn thiết lp c DT_WORDBREAK. Nếu không mun Windows
ct b các phn dư ra khi v ch vượt quá phm vi khung ch nht, ta
thêm c DT_NOCLIP. Nếu mun ký t tab (‘\t’ hoc 0x09) được din
dch thành ký t phân ct, cn thêm c DT_EXPANDTABS. Giá tr mc
định ca tab là 8 khong trng. C DT_TABSTOP được dùng để đặt li
giá tr tab. Trong trường hp này, byte cao ca word thp (bits 15-8)
ca uFormat s cha giá tr tab cn thay thế.
2. Định dng văn bn
a) Hàm thiết lp màu ch và màu nn:
COLORREF SetTextColor (HDC hdc, COLORREF color);
COLORREF SetBkColor (HDC hdc, COLORREF color);
Tr v giá tr màu trước đó.
Nếu có li tr v CLR_INVALID.
int SetBkMode (HDC hdc, int mode) ;
Tr v chế độ nn trước đó.
Tr v 0 nếu gp li.
mode = OPAQUE : Mi khi hin th văn bn thì màu nn được thay
đổi thành màu nn hin hành. Hoc TRANSPARENT: Màu nn
không b nh hưởng Î SetBkColor() b vô hiu.
b) Xác định màu ch và màu nn hin hành:
COLORREF GetTextColor(HDC hDC);
COLORREF GetBkColor(HDC hDC);
c) Xác định chế độ nn hin ti:
int GetBkMode(HDC hDC);
Hàm tr v giá tr TRANSPARENT hoc OPAQUE, nếu thành công.
Ngược li, giá tr tr v là zero.
d) Để xác lp v trí chui văn bn hin th da trên đim gc nXStart,
nYStart:
Bài ging: Lp 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 bn hin ti, ta dùng hàm :
UINT GetTextAlign(HDC hDC);
Nếu thành công, hàm tr v c tương ng ca canh l văn bn hin
hành. Ngược li, giá tr tr v là GDI_ERROR.
f) Để thay đổi khong cách gia các ký t:
int SetTextCharacterExtra(HDC hDC, int nCharExtra);
Nếu thành công, hàm tr v khong cách trước khi được thiết lp.
Ngược li, giá tr tr v là 0x80000000.
g) Để biết khong cách hin ti, ta dùng hàm :
int GetTextCharacterExtra(HDC hDC);
Nếu thành công, giá tr tr v cho biết khong cách hin ti. Ngược li,
giá tr tr v là 0x80000000.
3. S dng font
Lp ch s font ch.
Np font ch.
Gán ch s font ch cho ng cnh thiết b.
Đối vi Font ch mc định (h thng):S dng các font ch Windows
đang s dng.
MACRO FONT
ANSI_FIXED_FONT Font vi kích thước c định ca ký t da
trên Windows. Font Courier là mt ví d
đin hình ca dng font này.
ANSI_VAR_FONT Font vi độ rng ký t thay đổi da trên các
ký t chun ca Windows. Font MS San
Serif là mt ví d đin hình.
DEVICE_DEFAULT_FONT Font vi thiết b đã cho được chn mc
nhiên. Dng font này thường co sn trong h
thng để điu khin vic trình bày trên thiết
Bài ging: Lp trình C for Win .............................................................................................Trang 65/69