Ortak İletişim Kutularını Kullanma
Bu bölüm, ortak iletişim kutularını çağıran görevleri kapsar:
- Bir Renk Seçmek
- Yazı Tipi Seçimi
- Dosya Açma
- Yazdırma İletişim Kutusunu Görüntüleme
- Yazdırma Özellik Sayfası Kullanarak
- Yazdırılan Sayfayı Ayarlama
- Metin bulma
Renk Seçme
Bu konuda, kullanıcının renk seçebilmesi için Renk iletişim kutusunu görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir CHOOSECOLOR yapısı başlatır ve ardından iletişim kutusunu görüntülemek için ChooseColor işlevini çağırır. İşlev doğru döndürürse, kullanıcının bir renk seçtiğini belirtirse, örnek kod seçilen rengi kullanarak yeni bir düz fırça oluşturur.
Bu örnekte, iletişim kutusunu aşağıdaki gibi başlatmak için CHOOSECOLORyapısıkullanılır:
- statik bir değer dizisi işaretçisiyle lpCustColors üyesini başlatır. Dizideki renkler başlangıçta siyahtır, ancak statik dizi, kullanıcı tarafından oluşturulan özel renkleri sonraki ChooseColor çağrıları için korur.
- İletişim kutusu açıldığında başlangıçta seçilecek rengi belirtmek için CC_RGBINIT bayrağını ayarlar ve rgbResult üyesini başlatır. Belirtilmezse, ilk seçim siyah olur. Örnekte, ChooseColorçağrıları arasındaki seçili değeri korumak için rgbCurrent statik değişkeni kullanılır.
- İletişim kutusunun özel renkler uzantısının her zaman görüntülenmesi için CC_FULLOPEN bayrağını ayarlar.
CHOOSECOLOR cc; // common dialog box structure
static COLORREF acrCustClr[16]; // array of custom colors
HWND hwnd; // owner window
HBRUSH hbrush; // brush handle
static DWORD rgbCurrent; // initial color selection
// Initialize CHOOSECOLOR
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hwnd;
cc.lpCustColors = (LPDWORD) acrCustClr;
cc.rgbResult = rgbCurrent;
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
if (ChooseColor(&cc)==TRUE)
{
hbrush = CreateSolidBrush(cc.rgbResult);
rgbCurrent = cc.rgbResult;
}
Yazı Tipi Seçme
Bu konuda, kullanıcının yazı tipinin özniteliklerini seçebilmesi için Yazı Tipi iletişim kutusunu görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir CHOOSEFONT yapısı başlatır ve ardından iletişim kutusunu görüntülemek için ChooseFont işlevini çağırır.
Bu örnek, iletişim kutusunun yalnızca ekran yazı tiplerini görüntülemesi gerektiğini belirtmek için CF_SCREENFONTS bayrağını ayarlar. It sets the CF_EFFECTS flag to display controls that allow the user to select strikeout, underline, and color options. tr-TR: CF_EFFECTS bayrağını, kullanıcının üstü çizili, altı çizili ve renk seçeneklerini seçmesine olanak tanıyan kontrolleri göstermek için ayarlar.
ChooseFontTRUEdöndürürse, kullanıcının Tamam düğmesine tıkladığını belirtirse, CHOOSEFONT yapısı, lpLogFont üyesi tarafından işaret edilen LOGFONT yapısının üyeleri dahil olmak üzere kullanıcı tarafından seçilen yazı tipi ve yazı tipi özniteliklerini açıklayan bilgiler içerir. rgbColors üyesi seçili metin rengini içerir. Örnek kod, sahip penceresiyle ilişkilendirilmiş cihaz bağlamı için yazı tipini ve metin rengini ayarlamak için bu bilgileri kullanır.
HWND hwnd; // owner window
HDC hdc; // display device context of owner window
CHOOSEFONT cf; // common dialog box structure
static LOGFONT lf; // logical font structure
static DWORD rgbCurrent; // current text color
HFONT hfont, hfontPrev;
DWORD rgbPrev;
// Initialize CHOOSEFONT
ZeroMemory(&cf, sizeof(cf));
cf.lStructSize = sizeof (cf);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbCurrent;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
if (ChooseFont(&cf)==TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
hfontPrev = SelectObject(hdc, hfont);
rgbCurrent= cf.rgbColors;
rgbPrev = SetTextColor(hdc, rgbCurrent);
.
.
.
}
Dosya Açma
Not
Windows Vista'dan başlayarak, bir dosyayı açmak için kullanılan Ortak Dosya İletişim Kutusu'nun yerini Ortak Öğe İletişim Kutusu almıştır. Ortak Dosya İletişim Kutusu API'sinin yerine Ortak Öğe İletişim Kutusu API'sini kullanmanızı öneririz. Daha fazla bilgi için bkz. Ortak Öğe İletişim Kutusu.
Bu konuda, kullanıcının açılacak dosyanın sürücüsünü, dizinini ve adını belirtebilmesi için Aç iletişim kutusunu görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir OPENFILENAME yapısı başlatır ve ardından GetOpenFileName işlevini çağırarak iletişim kutusunu görüntüler.
Bu örnekte lpstrFilter üyesi, kullanıcının görüntülenen dosya adlarını sınırlamak için seçebileceği iki dosya adı filtresi belirten bir arabelleğe yönelik bir işaretçidir. Arabellek, çift null karakterle sonlandırılmış bir dize dizisi içerir ve her bir dize çifti bir filtre belirtir. nFilterIndex üyesi, iletişim kutusu oluşturulduğunda ilk desenin kullanılacağını belirtir.
Bu örnek, Bayrakları üyesinde OFN_PATHMUSTEXIST ve OFN_FILEMUSTEXIST bayraklarını ayarlar. Bu bayraklar, iletişim kutusunun geri dönmeden önce kullanıcı tarafından belirtilen yolun ve dosya adının gerçekten var olduğunu doğrulamasına neden olur.
GetOpenFileName işlevi, kullanıcı Tamam düğmesine tıklarsa ve belirtilen yol ve dosya adı varsa TRUE döndürür. Bu durumda, lpstrFile üyesi tarafından işaret edilen arabellek, hem yolu hem de dosya adını içerir. Örnek kod, dosyayı açmak için işlev çağrısında bu bilgileri kullanır.
Bu örnek OFN_EXPLORER bayrağını ayarlamasa da, yine de varsayılan Gezgin stilinde Aç iletişim kutusunu görüntüler. Ancak, bir kanca prosedürü veya özel bir şablon sağlamak ve Explorer kullanıcı arabirimini istiyorsanız, OFN_EXPLORER bayrağını ayarlamanız gerekir.
Not
C programlama dilinde, tırnak içine alınmış bir dize null olarak sonlandırılır.
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
HWND hwnd; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE)
hf = CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
Yazdır İletişim Kutusunu Görüntüleme
Bu konuda, kullanıcının belge yazdırma seçeneklerini belirleyebilmesi için Yazdır iletişim kutusunu görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir PRINTDLG yapısı başlatır ve ardından PrintDlg işlevini çağırarak iletişim kutusunu görüntüler.
Bu örnek, PRINTDLG yapısının üyesi Bayraklar'da PD_RETURNDC bayrağını ayarlar. Bu, PrintDlghDC üyesinde seçili yazıcıya bir cihaz bağlam tutamacını döndürmesine neden olur. Yazıcıda çıkışı işlemek için tutamacı kullanabilirsiniz.
Girişte, örnek kod hDevMode ve hDevNames üyelerini NULL olarak ayarlar. İşlev TRUEdöndürürse, bu üyeler, kullanıcı girişini ve yazıcı hakkındaki bilgileri içeren DEVNAMES yapılarına ait tanıtıcılara döner. Seçilen yazıcıya gönderilecek çıkışı hazırlamak için bu bilgileri kullanabilirsiniz.
PRINTDLG pd;
HWND hwnd;
// Initialize PRINTDLG
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL; // Don't forget to free or store hDevMode.
pd.hDevNames = NULL; // Don't forget to free or store hDevNames.
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;
if (PrintDlg(&pd)==TRUE)
{
// GDI calls to render output.
// Delete DC when done.
DeleteDC(pd.hDC);
}
Yazdırma Özellik Sayfasını Kullanma
Bu konuda, kullanıcının belge yazdırma seçeneklerini belirleyebilmesi için Yazdırma özellik sayfası görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir PRINTDLGEX yapısı başlatır, ardından özellik sayfasını görüntülemek için PrintDlgEx işlevini çağırır.
Örnek kod, PRINTDLG yapısının Bayraklar üyesine PD_RETURNDC bayrağını ayarlar. Bu, PrintDlgEx işlevinin hDC üyesinde seçili yazıcıya bir cihaz bağlam tutamacı döndürmesine neden olur.
Girişte, örnek kod hDevMode ve hDevNames üyelerini NULL olarak ayarlar. Fonksiyon S_OKdeğerini döndürürse, bu üyeler kullanıcı girişini ve yazıcı hakkındaki bilgileri içeren DEVNAMES yapılarına tanıtıcı döndürür. Seçilen yazıcıya gönderilecek çıkışı hazırlamak için bu bilgileri kullanabilirsiniz.
Yazdırma işlemi tamamlandıktan sonra, örnek kod DEVMODE, DEVNAMESve PRINTPAGERANG E arabelleklerini boşaltır ve cihaz bağlamını silmek için DeleteDC işlevini çağırır.
// hWnd is the window that owns the property sheet.
HRESULT DisplayPrintPropertySheet(HWND hWnd)
{
HRESULT hResult;
PRINTDLGEX pdx = {0};
LPPRINTPAGERANGE pPageRanges = NULL;
// Allocate an array of PRINTPAGERANGE structures.
pPageRanges = (LPPRINTPAGERANGE) GlobalAlloc(GPTR, 10 * sizeof(PRINTPAGERANGE));
if (!pPageRanges)
return E_OUTOFMEMORY;
// Initialize the PRINTDLGEX structure.
pdx.lStructSize = sizeof(PRINTDLGEX);
pdx.hwndOwner = hWnd;
pdx.hDevMode = NULL;
pdx.hDevNames = NULL;
pdx.hDC = NULL;
pdx.Flags = PD_RETURNDC | PD_COLLATE;
pdx.Flags2 = 0;
pdx.ExclusionFlags = 0;
pdx.nPageRanges = 0;
pdx.nMaxPageRanges = 10;
pdx.lpPageRanges = pPageRanges;
pdx.nMinPage = 1;
pdx.nMaxPage = 1000;
pdx.nCopies = 1;
pdx.hInstance = 0;
pdx.lpPrintTemplateName = NULL;
pdx.lpCallback = NULL;
pdx.nPropertyPages = 0;
pdx.lphPropertyPages = NULL;
pdx.nStartPage = START_PAGE_GENERAL;
pdx.dwResultAction = 0;
// Invoke the Print property sheet.
hResult = PrintDlgEx(&pdx);
if ((hResult == S_OK) && pdx.dwResultAction == PD_RESULT_PRINT)
{
// User clicked the Print button, so use the DC and other information returned in the
// PRINTDLGEX structure to print the document.
}
if (pdx.hDevMode != NULL)
GlobalFree(pdx.hDevMode);
if (pdx.hDevNames != NULL)
GlobalFree(pdx.hDevNames);
if (pdx.lpPageRanges != NULL)
GlobalFree(pPageRanges);
if (pdx.hDC != NULL)
DeleteDC(pdx.hDC);
return hResult;
}
Yazdırılan Sayfayı Ayarlama
Bu konuda, kullanıcının yazdırılan sayfanın kağıt türü, kağıt kaynağı, sayfa yönlendirmesi ve sayfa kenar boşlukları gibi özniteliklerini seçebilmesi için Sayfa Yapısı iletişim kutusunu görüntüleyen örnek kod açıklanmaktadır. Örnek kod önce bir PAGESETUPDLG yapısı başlatır ve ardından iletişim kutusunu görüntülemek için PageSetupDlg işlevini çağırır.
Bu örnek, Bayrakları üyesinde PSD_MARGINS bayrağını ayarlar ve ilk kenar boşluğu değerlerini belirtmek için rtMargin üyesini kullanır. İletişim kutusunun kenar boşluğu boyutlarını binde bir inç olarak ifade etmesini sağlamak için PSD_INTHOUSANDTHSOFINCHES bayrağını ayarlar.
Girişte, örnek kod hDevMode ve hDevNames üyelerini NULL olarak ayarlar. İşlev TRUE döndürürse, işlev, kullanıcı girişini ve yazıcı hakkındaki bilgileri içeren DEVNAMESyapılarınıtanıtıcılar döndürmek için bu üyeleri kullanır. Seçilen yazıcıya gönderilecek çıkışı hazırlamak için bu bilgileri kullanabilirsiniz.
Aşağıdaki örnek, örnek sayfanın içeriğinin çizimini özelleştirmek için PagePaintHook kanca yordamını da etkinleştirir.
PAGESETUPDLG psd; // common dialog box structure
HWND hwnd; // owner window
// Initialize PAGESETUPDLG
ZeroMemory(&psd, sizeof(psd));
psd.lStructSize = sizeof(psd);
psd.hwndOwner = hwnd;
psd.hDevMode = NULL; // Don't forget to free or store hDevMode.
psd.hDevNames = NULL; // Don't forget to free or store hDevNames.
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS |
PSD_ENABLEPAGEPAINTHOOK;
psd.rtMargin.top = 1000;
psd.rtMargin.left = 1250;
psd.rtMargin.right = 1250;
psd.rtMargin.bottom = 1000;
psd.lpfnPagePaintHook = PaintHook;
if (PageSetupDlg(&psd)==TRUE)
{
// check paper size and margin values here.
}
Aşağıdaki örnek, örnek sayfa alanında kenar boşluğu dikdörtgenini çizen PagePaintHook kanca yordamını gösterir.
BOOL CALLBACK PaintHook(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LPRECT lprc;
COLORREF crMargRect;
HDC hdc, hdcOld;
switch (uMsg)
{
// Draw the margin rectangle.
case WM_PSD_MARGINRECT:
hdc = (HDC) wParam;
lprc = (LPRECT) lParam;
// Get the system highlight color.
crMargRect = GetSysColor(COLOR_HIGHLIGHT);
// Create a dash-dot pen of the system highlight color and
// select it into the DC of the sample page.
hdcOld = SelectObject(hdc, CreatePen(PS_DASHDOT, .5, crMargRect));
// Draw the margin rectangle.
Rectangle(hdc, lprc->left, lprc->top, lprc->right, lprc->bottom);
// Restore the previous pen to the DC.
SelectObject(hdc, hdcOld);
return TRUE;
default:
return FALSE;
}
return TRUE;
}
Metin Bulma
Bu konuda, kullanıcının arama işleminin parametrelerini belirtebilmesi için Bul iletişim kutusunu görüntüleyen ve yöneten örnek kod açıklanmaktadır. İletişim kutusu, arama işlemini gerçekleştirebilmeniz için pencere yordamına ileti gönderir.
Değiştir iletişim kutusunu görüntüleme ve yönetme kodu benzerdir, ancak iletişim kutusunu görüntülemek için Metni Değiştir işlevini kullanır. Değiştir iletişim kutusu, Değiştir ve Tüm Düğmelerini Değiştir düğmelerine kullanıcı tıklamalarına yanıt olarak iletiler de gönderir.
Bul veya Değiştir iletişim kutusunu kullanmak için üç ayrı görev gerçekleştirmeniz gerekir:
- FINDMSGSTRING kayıtlı ileti için bir ileti tanımlayıcısı alın.
- İletişim kutusunu görüntüleme.
- İletişim kutusu açıkken FINDMSGSTRING iletileri işleyin.
Uygulamanızı başlatırken, kayıtlı FINDMSGSTRING ileti tanımlayıcısı almak için RegisterWindowMessage işlevini çağırın.
UINT uFindReplaceMsg; // message identifier for FINDMSGSTRING
uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);
Bul iletişim kutusunu görüntülemek için, önce FINDREPLACE yapısını başlatın ve sonra FindText işlevini çağırın. FINDREPLACE yapısının ve arama dizesinin arabelleğinin, iletişim kutusu kapatılmadan önce kapsamın dışına çıkmaması için genel veya statik bir değişken olması gerektiğini unutmayın. Kayıtlı iletileri alan pencereyi belirtmek için hwndOwner üyesini ayarlamanız gerekir. İletişim kutusunu oluşturduktan sonra, döndürülen tutamacı kullanarak taşıyabilir veya değiştirebilirsiniz.
FINDREPLACE fr; // common dialog box structure
HWND hwnd; // owner window
CHAR szFindWhat[80]; // buffer receiving string
HWND hdlg = NULL; // handle to Find dialog box
// Initialize FINDREPLACE
ZeroMemory(&fr, sizeof(fr));
fr.lStructSize = sizeof(fr);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;
hdlg = FindText(&fr);
İletişim kutusu açıkken, ana ileti döngünüz IsDialogMessage işlevine bir çağrı içermelidir. IsDialogMessage çağrısında, parametre olarak iletişim kutusuna bir tanıtıcıyı iletin. Bu, iletişim kutusunun klavye iletilerini doğru şekilde işlemesini sağlar.
İletişim kutusundan gönderilen iletileri izlemek için, pencere yordamınızın FINDMSGSTRING kayıtlı iletiyi denetlemesi ve aşağıdaki örnekte olduğu gibi FINDREPLACE yapısında geçirilen değerleri işlemesi gerekir.
LPFINDREPLACE lpfr;
if (message == uFindReplaceMsg)
{
// Get pointer to FINDREPLACE structure from lParam.
lpfr = (LPFINDREPLACE)lParam;
// If the FR_DIALOGTERM flag is set,
// invalidate the handle that identifies the dialog box.
if (lpfr->Flags & FR_DIALOGTERM)
{
hdlg = NULL;
return 0;
}
// If the FR_FINDNEXT flag is set,
// call the application-defined search routine
// to search for the requested string.
if (lpfr->Flags & FR_FINDNEXT)
{
SearchFile(lpfr->lpstrFindWhat,
(BOOL) (lpfr->Flags & FR_DOWN),
(BOOL) (lpfr->Flags & FR_MATCHCASE));
}
return 0;
}