-
Windows Common Dialog
سلام.
این topic درباره ی Common Dialog هست. که یکی از دوستانم از من خواسته بود و گفتم شاید بد نباشه در این جا مطرح بشه چون دارای کاربرد های زیادی هستند مخصوصا در برنامه نویسی تحت Windows.
به طور خیلی ساده درباره ی این Dialog ها میشه گفت که از Dialog های استاندارد Windowsهستند که همه شما با اونها آشنا هستید.که شامل Dialog های زیر میشه وهمگی در COMMDLG.DLL قرار دارند.
کد:
1-File Dialog
2-Font Dialog
3-Color Dialog
4-Print Dialog
5-FindReplace Dialog
6-PageSetup Dialog
7-Ole Dialog
که برای استفاده از اونها چند راه وجود داره.
1- استفاده از Windows SDK که بر گرفته از Software Development Kit هست.
2- استفاده از OCX یا کنترل این Dialog ها که معمولا در Net. استفاده میشه.
3- استفاده از MFC که همه کسانی که با VC برنامه مینویسن باهاش آشنا هستند. که بر گرفته از Microsoft Foundation Class هست.
در این topic از روش سوم استفاده میشه.
در MFC اینDialog ها ازکلاس CCommonDialog مشتق میشن که این کلاس مشتق شده از کلاس
CDialog هست.که نهایتا همه اینها مشتق شده از کلاس CWnd هستند. بنابراین میتونیم از این کلاس ها استفاده کنیم:
کد:
1-CFile Dialog
2-CFont Dialog
3-CColor Dialog
4-CPrint Dialog
5-CFindReplace Dialog
6-CPageSetup Dialog
7-COle Dialog
که پرکاربرد ترینشون رو در اینجا مطرح میکنم.
1-CFileDialog
از پرکاربردترین Dialog هست و همه شما با اون آشنا هستید. وقتی که میخواید یک File رو Open کنید یا
اون رو Save کنید این Dialog ظاهر میشه. این کلاس شامل توابع زیر هست:
کد:
1-DoModal() که باعث ظاهر شدن این صفحه میشه.
2-GetPathName() که آدرس کامل File انتخاب شده رو بر میگردونه.
3-GetFileName() که اسم file مورد نظر رو برمیگردونه.
4-GetFileExt() که پسوند file مورد نظر رو برمیگردونه.
و توابع دیگه که هر کدام کار ویژه انجام میدن که پرکاربرد ترینشون رو اسم بردم.
CFileDialog سازنده یا Constructor هست. وبه شکل زیر استفاده میشه:
کد:
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
آرگومان اول اگه TRUE باشه FileOpenDialog نمایش داده میشه و اگه FALSE باشه FileSaveDialog
نمایش داده میشه.
آرگومان دوم پسوند پیش فرض رو نشون میده.
آرگومان سوم اسم file ی رو که در textbox این Dialog قرار میگیره بر میگردونه.
آرگومان چهارم ترکیبی از Flag هاست که اجازه میده Dialog رو به دلخواه خودتون در بیارید.
آرگومان پنجم باعث ایجاد یه filter میشه در نتیجه ی اون در Dialog تنها file هایی که شما میخواید رو نشون میده.
آرگومان ششم هم یک pointer به parent این DialogBox هست.
خب.حالا با یه مثال قضیه روشن تر میشه:
کد:
LPCTSTR szFilter;
CString m_sFileName;
szFilter = _T("Text Files (*.txt)|*.txt||");
CFileDialog FileDlg(TRUE,(LPCTSTR)(".txt"),
m_sFileName,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter);
if(FileDlg.DoModal() == IDOK)
m_sFileName = FileDlg.GetFileName();
در اینجا اگه مقدار برگشتی از DialogBox برابر IDOK باشه یعنی که File ی انتخاب شده و اسم اون file
در m_sFileName قرار میگیره. برای استفاده از این برنامه کافی این رو در OnBnClick Event یک
Button قرار بگیره.
2-CFontDialog
با این Dialog هم آشنا هستید.وقتی بخواید در برنامه ای Font ی رو انتخاب کنید این Dialog ظاهر میشه.و
اینDialog لیست Font هایی که درsystem شما نصب شده رو نشون میده. این کلاس هم دارای توابعی هست از جمله:
کد:
1-DoModal() که باعث ظاهر شدن این صفحه میشه.
2-GetCurrentFont( LPLOGFONT lplf ) که اسمFont جاری رو برمیگردونه.در ضمن LPLOGFONT یه structure هست که خصوصیات یک Font رو تعریف میکنه.
3-GetSize() که size فونت مورد استفاده رو بر میگردونه.
4-GetColor() که رنگ font مورد استفاده رو بر میگردونه.
5-IsBold() که تشخیص میده که style مورد استفاده Bold هست یا نه.
6-IsItalic() که تشخیص میده که style مورد استفادهItalic هست یا نه.
و توابع دیگه که هر کدام کار ویژه انجام میدن که پرکاربرد ترینشون رو اسم بردم.
این کلاس هم دارای Constructor هست که به شکل زیر استفاده میشه.
کد:
CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );
آرگومان اول یه pointer یه LONGFONT هست. که اجازه میده مشخصات Font رو مقدار دهی کرد.
آرگومان دوم یه Flag هست که مثلا میتونه اجازه بده که کاربر underline رو برای font مورد نظر انتخاب کنه.
آرگومان سوم یه Pinter به DC یا Device Context هست.
آرگومان چهارم هم مثل CFileDialog هست.
این کلاس یه structure داره به نام m_cf که برای Customize کردن شیئ این کلاس به کار میره.
خب بازم میریم سر یه مثال:
کد:
CFontDialog FontDlg;
if( FontDlg.DoModal() == IDOK)
{
LOGFONT lf;
memcpy(&lf,FontDlg.m_cf.lpLogFont,sizeof(LOGFONT));
CFont font;
VERIFY(font.CreateFontIndirectW(&lf));
CClientDC dc(this);
CFont *pFont = dc.SelectObject(&font);
dc.TextOutW(10,10 ,_T("Font Test!"),sizeof("Font Test!"));
dc.SelectObject(pFont);
font.DeleteObject();
}
که مثل قبل میتونه در OnBnClick Event یه Button قرار بگیره.
3-CColorDialog
با این هم آشنا هستید که برای انتخاب رنگ ازش استفاده میشه. این Dialog هم از پرکاربرد ترین
Dialog هاست. این کلاس دارای تعداد کمی تابع هست. که به شکل زیر تعریف میشن:
کد:
1-DoModal() که باعث ظاهر شدن این صفحه میشه.
2-GetColor() که یک Colorref از رنگ انتخاب شده رو برمیگردونه.
3-GetSavedCustomColors() که رنگ هایی که توسط کاربر قبلا استفاده شده رو بر میگردونه.
4-SetCurrentColor( COLORREF clr ) که رنگ جاری رو روی رنگ مشخص شده set میکنه.
با این structure هم که آشنا هستید و نیاز به توضیح نداره.
این کلاس یه structure داره به نام m_cc که برای Customize کردن شیئ این کلاس به کار میره.
این کلاس هم دارای Constructor هست که به شکل زیر استفاده میشه.
کد:
CColorDialog( COLORREF clrInit = 0, DWORD dwFlags=0, CWnd* pParentWnd = NULL);
آرگومان اول رنگ پیش فرض رو انتخاب میکنه.
آرگومان دوم هم یه Flag هست برای Customize کردن DialogBox مربوط به این کلاس
آرگومان سوم هم مثل CFileDialog هست.
بازم یه مثال که بهترین راه برای یادگیری هست:
کد:
CClientDC dc(this);
CRect rect;
CColorDialog Tmp(CurColor,CC_ANYCOLOR|CC_RGBINIT,this);
if(Tmp.DoModal() == IDOK)
{
CString Msg;
Msg.Format(_T("You Select Color : %d"),Tmp.GetColor() );
MessageBox(Msg);
CurColor = Tmp.GetColor();
}
InvalidateRect(&rect);
dc.FillSolidRect(&rect,CurColor);
که مقدار رنگ برگشتی در CurColor قرار میگیره.CurColor به صورت public تعریف شده.
من برای رنگ کردن یه PictureBox با این ID از این کد استفاده کردم.
کد:
GetDlgItem(IDC_PICCOL)->GetWindowRect(&rect);
ScreenToClient(&rect);
این سه مورد از این Dialog ها بود.اگه خواستید ادامه ميدم.
سعی کردم ساده و روشن وخلاصه توضیح بدم.اگه خوب توضیح ندادم به بزرگواری خودتون میبخشید.
هر جا کدها نیاز به توضیح داشت اطلاع بدید.
ممنون.