Vit hoá mt s Dialogthông dng
Vn Chí Nam – Nguyn c Hoàng H
Khoa Công ngh Thông tin, Trng H KHTN TP.HCM
(vcnam@fit.hcmuns.edu.vn, ndhha@fit.hcmuns.edu.vn)
Phiên bn cp nht ngày 16/05/2005
Chúng ta đã quá quen vi mt s dialogthông dng : Open Dialog, Color
Dialog, SaveAs Dialog,… ây là nhng dialog chun đã đc MFC h tr tt thông
qua các lp CFileDialog, CColorDialog,… Chúng ta cng đu bit nhng dialog này
đu s dng ting Anh làm ngôn ng giao tip, câu hi đt ra đây, liu chúng ta có
th Vit hoá nhng dialog này hay không ? iu đó có ngha là vn gi nguyên nhng
thành phn trên các dialog chun này, ch thay th nhng phn hin th bng ngôn ng
Anh thành ngôn ng Vit.
Trong bài vit này, tôi s gii thiu cách thc vit hoá mt dialog quen thuc:
Open Dialog. Các dialog khác có cách thc hin tng t.
Hình nh Open dialogthông dng
Hình nh Open dialog sau khi đc Vit hoá
Bây gi, chúng ta s làm quen vi mt s thao tác c bn đu tiên.
Vit hoá mt control
Công vic này lúc mi nghe qua tng chng là khó khn, nhng thc cht
không có gì là gay go c, đó ch là công vic thay đi thuc tính font ca các control
thành font ting Vit (trong trng hp này, tôi s dng font ting Vit VK Sans Serif).
thay đi thuc tính font ca control, chúng ta có th có các cách sau đây :
+ Th nht, thay đi thu
c tính font cho toàn b dialog, bng cách thay đi
chn font trong bng property ca dialog.
+ Th hai, thit lp font cho tng control có lp dn xut t CWnd.
CFont *font;
LOGFONT logFont;
CWnd* pWnd;
pWnd = GetParent()->GetDlgItem(IDOK);
//ly con tr CWnd ca đi tng có ID là IDOK
font = pWnd->GetFont();
//ly font ca đi tng
font->GetLogFont(&logFont);
//chuyn đi CFont v dng cu trúc LOGFONT
strcpy(logFont.lfFaceName,"VK Sans Serif");
//thay đi tên
font đây
//thay đi thuc tính tên font ca cu trúc LOGFONT
FontTemp = new CFont;
//FontTemp bin member thuc tính private ca lp
FontTemp->CreateFontIndirect(&logFont);
pWnd->SetFont(FontTemp);
//gán font mi cho đi tng
GetParent()->GetDlgItem(IDOK)->SetWindowText("&Më tËp
tin"); //M tp tin
//thay đi ni dung text ca đi tng
Ly ID ca mt control trên mt dialog
Thông thng, khi chúng ta s dng control, chúng ta đu đt cho chúng mt
cái tên đ d dàng s dng sau này. Các tên này đôi khi không cn thit vì mi cái tên
đc tng ng bng mt con s duy nht do trình biên dch gán cho và đc đt
trong tp tin Resource.h. Chúng ta làm vic vi các control thông qua các cái tên thc
cht làm vic vi các con s.
Vi các dialog do chúng ta to ra, chúng ta d dàng xác đnh đc các con s
này, nhng vi các dialog do ngi khác vit thì làm sao chúng ta có th
xác đnh
đc các giá tr này ? Cách đn gin là dùng chng trình Spy++ có sn trong b
tools khi chúng ta cài VC++ hoc VB.
Hình nh ca chng trình Spy++ thc thi
ly control ID ca mt control, chúng ta phi xác đnh control đó thuc v
dialog nào và nó có tên là gì. Khi chy Spy++ chúng ta s thy hình nh mt Tree
control, mi nhánh s đi din cho mt chng trình (hoc 1 dialog) hin đang chy
trên máy. C gng dò tìm dialog thích hp. M rng (expand) nhánh bng cách bm
vào nút “+”. Mt lot các control có trên chn control đó s xut hin. Chn control
thích hp cn ly ID (d nhiên là phi c đoán đó là control nào trong c đng control),
nhn phím chut phi, chn chc nng Property. Ta s thy đc hình nh sau :
Trên Window Properties có rt nhiu thuc tính, đây, chúng ta ch quan tâm
đn ID ca nó nên ta ch cn bit đn giá tr control ID (dng Hexa) mà thôi. Lu ý
rng giá tr ID này ch duy nht trên dialog đc chn mà thôi.
Các bc thc hin
Bc 1
To mt dialog mi.
Thit lp cho nó các thuc tính sau (trong Styles) : style = child ; border =
none; check clip siblings
Thêm trên dialog mi này mt group box control không có caption và ID ca
nó là stc32 = 0x045F (Quan trng !!!). (Trên dialog này có th thêm các control khác
tu theo ý ngi thit k.)
Bc 2
To mt lp mi cho dialog này, lp mi này ban đu dn xut t CDialog và
đc đt tên là CSpecialFileDialog.
Trong file Header thay đi :
class CSpecialFileDialog : public CFileDialog
//dn xut t CFileDialog thay vì t CDialog
CSpecialFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt =
NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
//constructor
Trong file thc thi.CPP :
CSpecialFileDialog::CSpecialFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
LPCTSTR lpszFilter, CWnd* pParentWnd)
: CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
//{{AFX_DATA_INIT(CSpecialFileDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);
m_ofn.lpstrTitle = "Mo tap tin";//thay đi ni dung caption bar
ca dialog
}
Thêm vào lp CSpecialDialog mt bin private là mt đi tng con tr
FontTemp thuc lp CFont, con tr này có nhim v lu gi thuc tính font ca các
control trong Dialog, cn phi hu b con tr khi không s dng dialog na.
Bc 3
Thêm vào lp CSpecialDialog hàm OnInitDialog có ni dung nh sau :
BOOL CSpecialFileDialog::OnInitDialog()
{
BOOL bRet = CFileDialog::OnInitDialog();
CFont *font;
LOGFONT logFont;
if (bRet == TRUE)
{
//xác đnh và thay đi font ting Vit cho các control cn thit.
CWnd* pWnd;
pWnd = GetParent()->GetDlgItem(IDOK);
font = pWnd->GetFont();
font->GetLogFont(&logFont);
strcpy(logFont.lfFaceName,"VK Sans Serif");
FontTemp = new CFont;
FontTemp->CreateFontIndirect(&logFont);
pWnd->SetFont(FontTemp);
GetParent()->GetDlgItem(IDOK)->SetWindowText("&Më tËp tin");/*M tp
tin*/
GetParent()->GetDlgItem(0x442)->SetFont(FontTemp);
GetParent()->GetDlgItem(0x442)->SetWindowText("&Tªn tËp tin");/*Tên
tp tin*/
GetParent()->GetDlgItem(0x443)->SetFont(FontTemp);
CRect rect;
pWnd = GetParent()->GetDlgItem(0x443);
//
//đon chng trình này dùng đ điu chnh v trí ca control.
pWnd->GetClientRect(&rect);
rect.right += 30;
pWnd-> SetWindowPos
(&wndTop,rect.left,rect.top+10,rect.Width(),rect.Height(), SWP_SHOWWINDOW);
//
GetParent()->GetDlgItem(0x443)->SetWindowText("Th- môc");//Th mc
GetParent()->GetDlgItem(0x441)->SetFont(FontTemp);
GetParent()->GetDlgItem(0x441)->SetWindowText("&Lo¹i tËp tin");//Loi
tp tin
GetParent()->GetDlgItem(IDCANCEL)->SetFont(FontTemp);
GetParent()->GetDlgItem(IDCANCEL)->SetWindowText("&Hñy chän");//Hy
chn
}
return bRet;
}
Ghi chú : các giá tr ID 0x441,0x442,0x443 đc xác đnh bng Spy++ theo
cách đã trình bày trên.
Bc 4
Xoá b con tr FontTemp khi không còn s dng dialog na.
BOOL CSpecialFileDialog::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base
class
if (FontTemp) delete FontTemp;
return CDialog::DestroyWindow();
}
Do CSpecialDialog dn xut t CFileDialog nên ta có th thêm cho nó mt s
hàm cn thit ca riêng chúng ta nh :
CString CSpecialFileDialog::Layduongdan()
{
return CFileDialog::GetPathName();
}
CÁCH S DNG
Cách s dng không khác gì so vi CFileDialog, khai báo mt đi tng thuc
lp CSpecialDialog và s dng hàm DoModal đ kích hot dialog hot đng
Ví d :
CSpecialDialog dlg(TRUE);
if (dlg.DoMoDal() == IDOK)
{
}
Các dialog dn xut t các lp còn li có cách thc hin không khác lm.
Tài Liu Tham Kho :
- Programming VC++6.0 Fifth Edition
- MSDN Library
. mt s dialog thông dng : Open Dialog, Color
Dialog, SaveAs Dialog, … ây là nhng dialog chun đã đc MFC h tr tt thông
qua các lp CFileDialog,. hoá mt dialog quen thuc:
Open Dialog. Các dialog khác có cách thc hin tng t.
Hình nh Open dialog thông dng
Hình nh Open dialog sau