Hình nh Open dialog thông d ng.
Trang 1Vi t hoá m t s Dialog thông d ng
V n Chí Nam – Nguy n c Hoàng H
Khoa Công ngh Thông tin, Tr ng H KHTN TP.HCM (vcnam@fit.hcmuns.edu.vn, ndhha@fit.hcmuns.edu.vn)
Phiên b n c p nh t ngày 16/05/2005
Chúng ta đã quá quen v i m t s dialog thông d ng : Open Dialog, Color Dialog, SaveAs Dialog,… ây là nh ng dialog chu n đã đ c MFC h tr t t thông qua các l p CFileDialog, CColorDialog,… Chúng ta c ng đ u bi t nh ng dialog này
đ u s d ng ti ng Anh làm ngôn ng giao ti p, câu h i đ t ra đây, li u chúng ta có
th Vi t hoá nh ng dialog này hay không ? i u đó có ngh a là v n gi nguyên nh ng thành ph n trên các dialog chu n này, ch thay th nh ng ph n hi n th b ng ngôn ng Anh thành ngôn ng Vi t
Trong bài vi t này, tôi s gi i thi u cách th c vi t hoá m t dialog quen thu c: Open Dialog Các dialog khác có cách th c hi n t ng t
Hình nh Open dialog thông d ng
Trang 2Hình nh Open dialog sau khi đ c Vi t hoá
Bây gi , chúng ta s làm quen v i m t s thao tác c b n đ u tiên
Vi t hoá m t control
Công vi c này lúc m i nghe qua t ng ch ng là khó kh n, nh ng th c ch t không có gì là gay go c , đó ch là công vi c thay đ i thu c tính font c a các control thành font ti ng Vi t (trong tr ng h p này, tôi s d ng font ti ng Vi t VK Sans Serif)
thay đ i thu c tính font c a control, chúng ta có th có các cách sau đây :
+ Th nh t, thay đ i thu c tính font cho toàn b dialog, b ng cách thay đ i
ch n font trong b ng property c a dialog
+ Th hai, thi t l p font cho t ng control có l p d n xu t t CWnd
CFont *font;
LOGFONT logFont;
CWnd* pWnd;
pWnd = GetParent()->GetDlgItem(IDOK);
//l y con tr CWnd c a đ i t ng có ID là IDOK
font = pWnd->GetFont();
//l y font c a đ i t ng
font->GetLogFont(&logFont);
//chuy n đ i CFont v d ng c u trúc LOGFONT
strcpy(logFont.lfFaceName,"VK Sans Serif"); //thay đ i tên font đây
//thay đ i thu c tính tên font c a c u trúc LOGFONT
FontTemp = new CFont;
//FontTemp bi n member thu c tính private c a l p
FontTemp->CreateFontIndirect(&logFont);
Trang 3pWnd->SetFont(FontTemp);
//gán font m i cho đ i t ng
GetParent()->GetDlgItem(IDOK)->SetWindowText("&Më tËp tin"); //M t p tin
//thay đ i n i dung text c a đ i t ng
L y ID c a m t control trên m t dialog
Thông th ng, khi chúng ta s d ng control, chúng ta đ u đ t cho chúng m t cái tên đ d dàng s d ng sau này Các tên này đôi khi không c n thi t vì m i cái tên
đ c t ng ng b ng m t con s duy nh t do trình biên d ch gán cho và đ c đ t
trong t p tin Resource.h Chúng ta làm vi c v i các control thông qua các cái tên th c
ch t làm vi c v i các con s
V i các dialog do chúng ta t o ra, chúng ta d dàng xác đ nh đ c các con s này, nh ng v i các dialog do ng i khác vi t thì làm sao chúng ta có th xác đ nh
đ c các giá tr này ? Cách đ n gi n là dùng ch ng trình Spy++ có s n trong b
tools khi chúng ta cài VC++ ho c VB
Hình nh c a ch ng trình Spy++ th c thi
l y control ID c a m t control, chúng ta ph i xác đ nh control đó thu c v
dialog nào và nó có tên là gì Khi ch y Spy++ chúng ta s th y hình nh m t Tree
control, m i nhánh s đ i di n cho m t ch ng trình (ho c 1 dialog) hi n đang ch y trên máy C g ng dò tìm dialog thích h p M r ng (expand) nhánh b ng cách b m vào nút “+” M t lo t các control có trên ch n control đó s xu t hi n Ch n control
Trang 4thích h p c n l y ID (d nhiên là ph i c đoán đó là control nào trong c đ ng control),
nh n phím chu t ph i, ch n ch c n ng Property Ta s th y đ c hình nh sau :
Trên Window Properties có r t nhi u thu c tính, đây, chúng ta ch quan tâm
đ n ID c a nó nên ta ch c n bi t đ n giá tr control ID (d ng Hexa) mà thôi L u ý
r ng giá tr ID này ch duy nh t trên dialog đ c ch n mà thôi
B c 1
T o m t dialog m i
Thi t l p cho nó các thu c tính sau (trong Styles) : style = child ; border =
none; check clip siblings
Thêm trên dialog m i này m t group box control không có caption và ID c a
nó là stc32 = 0x045F (Quan tr ng !!!) (Trên dialog này có th thêm các control khác
tu theo ý ng i thi t k )
Trang 5B c 2
T o m t l p m i cho dialog này, l p m i này ban đ u d n xu t t CDialog và
đ c đ t tên là CSpecialFileDialog
Trong file Header thay đ i :
class CSpecialFileDialog : public CFileDialog
//d n xu t 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 th c 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 n i dung caption bar
c a dialog
}
Thêm vào l p CSpecialDialog m t bi n private là m t đ i t ng con tr
FontTemp thu c l p CFont, con tr này có nhi m v l u gi thu c tính font c a các
control trong Dialog, c n ph i hu b con tr khi không s d ng dialog n a
Trang 6B c 3
Thêm vào l p CSpecialDialog hàm OnInitDialog có n i dung nh sau :
BOOL CSpecialFileDialog::OnInitDialog()
{
BOOL bRet = CFileDialog::OnInitDialog();
CFont *font;
LOGFONT logFont;
if (bRet == TRUE)
{
//xác đ nh và thay đ i font ti ng Vi t cho các control c n thi t
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 t p
tin*/
GetParent()->GetDlgItem(0x442)->SetFont(FontTemp);
GetParent()->GetDlgItem(0x442)->SetWindowText("&Tªn tËp tin");/*Tên
t p tin*/
GetParent()->GetDlgItem(0x443)->SetFont(FontTemp);
CRect rect;
pWnd = GetParent()->GetDlgItem(0x443);
// -
// đo n ch ng trình này dùng đ đi u ch nh v trí c a 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 m c
GetParent()->GetDlgItem(0x441)->SetFont(FontTemp);
GetParent()->GetDlgItem(0x441)->SetWindowText("&Lo¹i tËp tin");//Lo i
t p tin
GetParent()->GetDlgItem(IDCANCEL)->SetFont(FontTemp);
GetParent()->GetDlgItem(IDCANCEL)->SetWindowText("&Hñy chän");//H y
ch n
}
return bRet;
}
Ghi chú : các giá tr ID 0x441,0x442,0x443 đ c xác đ nh b ng Spy++ theo
cách đã trình bày trên
Trang 7B c 4
Xoá b con tr FontTemp khi không còn s d ng dialog n a
BOOL CSpecialFileDialog::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
if (FontTemp) delete FontTemp;
return CDialog::DestroyWindow();
}
Do CSpecialDialog d n xu t t CFileDialog nên ta có th thêm cho nó m t s
hàm c n thi t c a riêng chúng ta nh :
CString CSpecialFileDialog::Layduongdan()
{
return CFileDialog::GetPathName();
}
Cách s d ng không khác gì so v i CFileDialog, khai báo m t đ i t ng thu c
l p CSpecialDialog và s d ng hàm DoModal đ kích ho t dialog ho t đ ng
Ví d :
CSpecialDialog dlg(TRUE);
if (dlg.DoMoDal() == IDOK)
{
}
Các dialog d n xu t t các l p còn l i có cách th c hi n không khác l m
Tài Li u Tham Kh o :
- Programming VC++6.0 Fifth Edition
- MSDN Library