Megosztás a következőn keresztül:


Gyakori párbeszédpanelek használata

Ez a szakasz a gyakori párbeszédpaneleket meghívó feladatokat ismerteti:

Szín kiválasztása

Ez a témakör egy Szín párbeszédpanelt megjelenítő mintakódot ismertet, hogy a felhasználó kiválaszthassa a színt. A mintakód először inicializál egy CHOOSECOLOR struktúrát, majd meghívja a ChooseColor függvényt a párbeszédpanel megjelenítéséhez. Ha a függvény IGAZad vissza, amely azt jelzi, hogy a felhasználó kiválasztott egy színt, a mintakód a kijelölt színnel hoz létre egy új egyszínű ecsetet.

Ez a példa a CHOOSECOLOR struktúrát használja a párbeszédpanel inicializálásához az alábbiak szerint:

  • Inicializálja az lpCustColors tagot egy statikus értéktömbre mutató mutatóval. A tömb színei kezdetben feketék, de a statikus tömb megőrzi a felhasználó által a későbbi ChooseColor hívásokhoz létrehozott egyéni színeket.
  • Beállítja a CC_RGBINIT jelölőt, és inicializálja a rgbResult tagot, hogy megadja a párbeszédpanel megnyitásakor kezdetben kijelölt színt. Ha nincs megadva, a kezdeti kijelölés fekete. A példa az rgbCurrent statikus változóval őrzi meg a kiválasztott értéket a ChooseColorhívásai között.
  • Beállítja a CC_FULLOPEN jelzőt, hogy a párbeszédpanel egyéni színkiterjesztése mindig megjelenjen.
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; 
}

Betűtípus kiválasztása

Ez a témakör egy Betűtípus párbeszédpanelt megjelenítő mintakódot ismertet, amellyel a felhasználó kiválaszthatja a betűtípus attribútumait. A mintakód először inicializál egy CHOOSEFONT struktúrát, majd meghívja a ChooseFont függvényt a párbeszédpanel megjelenítéséhez.

Ez a példa úgy állítja be a CF_SCREENFONTS jelzőt, hogy a párbeszédpanelen csak a képernyő betűtípusai jelenjenek meg. A CF_EFFECTS jelzőt úgy állítja be, hogy megjelenítse azokat a vezérlőket, amelyek lehetővé teszik a felhasználó számára az áthúzási, aláhúzási és színbeállítások kiválasztását.

Ha ChooseFontTRUEad vissza, amely azt jelzi, hogy a felhasználó az OK gombra kattintott, a CHOOSEFONT struktúra olyan információkat tartalmaz, amelyek a felhasználó által kiválasztott betűtípus- és betűtípusattribútumokat ismertetik, beleértve a lpLogFont tag által mutatott LOGFONT struktúrájának tagjait is. Az rgbColors tag a kijelölt szövegszínt tartalmazza. A mintakód ezen információk alapján állítja be a tulajdonosi ablakhoz társított eszközkörnyezet betűtípusát és szövegszínét.

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);
 .
 .
 .
}

Fájl megnyitása

Jegyzet

A Windows Vista rendszertől kezdve a Közös fájl párbeszédpanelt felváltotta a Közös elem párbeszédpanel, amikor egy fájlt nyit meg. Javasoljuk, hogy a Common Item Dialog API-t használja a Common File Dialog API helyett. További információért lásd a Gyakori elempárbeszédpanel-t.

Ez a témakör egy Megnyitás párbeszédpanelt megjelenítő mintakódot ismertet, hogy a felhasználó meg tudja adni a megnyitni kívánt fájl meghajtóját, könyvtárát és nevét. A mintakód először inicializál egy OPENFILENAME struktúrát, majd meghívja a GetOpenFileName függvényt a párbeszédpanel megjelenítéséhez.

Ebben a példában az lpstrFilter tag egy pufferre mutató mutató, amely két fájlnévszűrőt határoz meg, amelyeket a felhasználó kiválaszthat a megjelenített fájlnevek korlátozásához. A puffer egy dupla null értékű végződésű sztringtömböt tartalmaz, amelyben minden sztringpár egy szűrőt határoz meg. Az nFilterIndex tag megadja, hogy a párbeszédpanel létrehozásakor az első minta legyen használva.

Ez a példa a OFN_PATHMUSTEXIST és OFN_FILEMUSTEXIST jelzőket állítja be a Zászlók tagban. Ezek a jelzők miatt a párbeszédpanel a visszatérés előtt ellenőrzi, hogy a felhasználó által megadott elérési út és fájlnév valóban létezik-e.

A GetOpenFileName függvény TRUE értéket ad vissza, ha a felhasználó az OK gombra kattint, és a megadott elérési út és fájlnév létezik. Ebben az esetben a lpstrFile tag által mutatott puffer tartalmazza az elérési utat és a fájlnevet. A mintakód ezt az információt használja a függvény hívásában a fájl megnyitásához.

Bár ez a példa nem állítja be a OFN_EXPLORER jelzőt, továbbra is megjeleníti az alapértelmezett Explorer-stílusú megnyitása párbeszédpanelt. Ha azonban horog eljárást vagy egyéni sablont szeretne megadni, és az Explorer felhasználói felületét szeretné használni, be kell állítania a OFN_EXPLORER jelzőt.

Jegyzet

A C programozási nyelvben az idézőjelek közé zárt karakterlánc nullával lezárt.

 

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);

A Nyomtatás párbeszédpanel megjelenítése

Ez a témakör egy Nyomtatás párbeszédpanelt megjelenítő mintakódot ismertet, hogy a felhasználó kiválaszthassa a dokumentum nyomtatásának beállításait. A mintakód először inicializál egy PRINTDLG struktúrát, majd meghívja a PrintDlg függvényt a párbeszédpanel megjelenítéséhez.

Ez a példa a PD_RETURNDC zászlót a FlagsPRINTDLG struktúra tagjára állítja. Emiatt a PrintDlg egy eszközkörnyezet-kezelőt ad vissza a kijelölt nyomtatóhoz a hDC tagban. A fogóval kinyomtathatja a kimenetet a nyomtatón.

Bemenetkor a mintakód beállítja a hDevMode és hDevNames tagokat a NULL . Ha a függvény TRUEad vissza, ezek a tagok visszaadnak fogantyúkat a DEVNAMES struktúrákhoz, amelyek tartalmazzák a felhasználói bemenetet és a nyomtatóval kapcsolatos információkat. Ezen információk segítségével előkészítheti a kiválasztott nyomtatónak küldendő kimenetet.

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);
}

A Nyomtatási tulajdonságlap használata

Ez a témakör egy Nyomtatási tulajdonságlapot megjelenítő mintakódot ismertet, így a felhasználó kiválaszthatja a dokumentum nyomtatásának beállításait. A mintakód először inicializál egy PRINTDLGEX struktúrát, majd meghívja a PrintDlgEx függvényt a tulajdonságlap megjelenítéséhez.

A mintakód beállítja a PD_RETURNDC jelzőt a JelzőkPRINTDLG struktúrájának tagjaként. Emiatt a PrintDlgEx függvény egy eszközkörnyezeti leírót ad vissza a kijelölt nyomtatóhoz a hDC tagban.

Bemenetkor a mintakód beállítja a hDevMode és hDevNames tagokat a NULL . Ha a függvény S_OKad vissza, ezek a tagok fogantyúkat adnak vissza a DEVNAMES struktúrákhoz, amelyek tartalmazzák a felhasználói bemenetet és a nyomtatóval kapcsolatos információkat. Ezen információk segítségével előkészítheti a kiválasztott nyomtatónak küldendő kimenetet.

A nyomtatási művelet befejezése után a mintakód felszabadítja a DEVMODE, DEVNAMES, valamint PRINTPAGERANGE puffereket, és meghívja a DeleteDC függvényt az eszközkörnyezet törlésére.

// 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;
}

A nyomtatott oldal beállítása

Ez a témakör egy lapbeállítási párbeszédpanelt megjelenítő mintakódot ismertet, amellyel a felhasználó kiválaszthatja a nyomtatott oldal attribútumait, például a papírtípust, a papírforrást, az oldal tájolását és az oldalmargókat. A mintakód először inicializál egy PAGESETUPDLG struktúrát, majd meghívja a PageSetupDlg függvényt a párbeszédpanel megjelenítéséhez.

Ez a példa beállítja a PSD_MARGINS jelzőt a Jelzők tagban, és a rtMargin tag használatával adja meg a kezdeti margóértékeket. Beállítja a PSD_INTHOUSANDTHSOFINCHES jelzőt, hogy a párbeszédpanel a margóméreteket ezredhüvelykben jelenítse meg.

Bemenetkor a mintakód beállítja a hDevMode és hDevNames tagokat a NULL . Ha a függvény TRUEértéket ad vissza, a függvény ezeket a tagokat használja arra, hogy handle-öket adjon vissza a DEVNAMES struktúrákra, amelyek tartalmazzák a felhasználói bemenetet és a nyomtatóval kapcsolatos információkat. Ezen információk segítségével előkészítheti a kiválasztott nyomtatónak küldendő kimenetet.

Az alábbi példa lehetővé tesz egy PagePaintHook hook eljárást a mintalap tartalmának testreszabására.

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.
}

Az alábbi példa egy PagePaintHook hook eljárást mutat be, amely a margó téglalapját rajzolja meg a mintalap területén.

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; 
}

Szöveg keresése

Ez a témakör a Keresés párbeszédpanelt megjelenítő és kezelő mintakódot ismerteti, hogy a felhasználó meg tudja adni a keresési művelet paramétereit. A párbeszédpanel üzeneteket küld az ablakműveletnek, hogy végrehajthassa a keresési műveletet.

A Csere párbeszédpanel megjelenítésére és kezelésére szolgáló kód hasonló, azzal a kivétellel, hogy a ReplaceText függvénnyel jeleníti meg a párbeszédpanelt. A Csere párbeszédpanel a cseréje és Az összes cseréje gombra kattintásra válaszul üzeneteket is küld.

A keresése vagy cseréje párbeszédpanel használatához három külön feladatot kell végrehajtania:

  1. Kérje le a FINDMSGSTRING regisztrált üzenet üzenetazonosítóját.
  2. A párbeszédpanel megjelenítése.
  3. FINDMSGSTRING üzenetek feldolgozása a párbeszédpanel megnyitásakor.

Az alkalmazás inicializálásakor hívja meg a RegisterWindowMessage függvényt a FINDMSGSTRING regisztrált üzenet üzenetazonosítójának lekéréséhez.

UINT uFindReplaceMsg;  // message identifier for FINDMSGSTRING 

uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);

A Keresés párbeszédpanel megjelenítéséhez először inicializáljon egy FINDREPLACE struktúrát, majd hívja meg a FindText függvényt. Vegye figyelembe, hogy a FINDREPLACE szerkezetének és a keresési sztring pufferének globális vagy statikus változónak kell lennie, hogy a párbeszédpanel bezárása előtt ne lépjen ki a hatókörből. A hwndOwner tagot be kell állítania, hogy megadja a regisztrált üzeneteket fogadó ablakot. A párbeszédpanel létrehozása után a visszaadott fogantyúval áthelyezheti vagy módosíthatja azt.

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);

Ha a párbeszédpanel meg van nyitva, a fő üzenethurknak tartalmaznia kell egy hívást az IsDialogMessage függvényhez. Adjon át egy hivatkozást a párbeszédpanelre paraméterként az IsDialogMessage függvényhívásban. Ez biztosítja, hogy a párbeszédpanel megfelelően dolgozza fel a billentyűzetüzeneteket.

A párbeszédpanelről küldött üzenetek figyeléséhez az ablak eljárásának ellenőriznie kell a FINDMSGSTRING regisztrált üzenetet, és feldolgoznia kell a FINDREPLACE struktúrában átadott értékeket az alábbi példában leírtak szerint.

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; 
}