Delen via


Algemene dialoogvensters gebruiken

In deze sectie worden de taken behandeld die algemene dialoogvensters aanroepen:

Een kleur kiezen

In dit onderwerp wordt voorbeeldcode beschreven waarin een dialoogvenster Kleur wordt weergegeven, zodat een gebruiker een kleur kan selecteren. De voorbeeldcode initialiseert eerst een CHOOSECOLOR-structuur en roept vervolgens de functie ChooseColor aan om het dialoogvenster weer te geven. Als de functie TRUE retourneert, waarmee wordt aangegeven dat de gebruiker een kleur heeft geselecteerd, gebruikt de voorbeeldcode de geselecteerde kleur om een nieuwe effen kwast te maken.

In dit voorbeeld wordt de structuur CHOOSECOLOR gebruikt om het dialoogvenster als volgt te initialiseren:

  • Initialiseert het lid lpCustColors met een aanwijzer naar een statische matrix met waarden. De kleuren in de matrix zijn in eerste instantie zwart, maar de statische matrix behoudt aangepaste kleuren die door de gebruiker zijn gemaakt voor volgende ChooseColor-aanroepen .
  • Hiermee stelt u de CC_RGBINIT vlag in en initialiseert u het rgbResult-lid om de kleur op te geven die in eerste instantie is geselecteerd wanneer het dialoogvenster wordt geopend. Als deze niet is opgegeven, is de eerste selectie zwart. In het voorbeeld wordt de statische rgbCurrent-variabele gebruikt om de geselecteerde waarde tussen aanroepen naar ChooseColor te behouden.
  • Hiermee stelt u de CC_FULLOPEN vlag in, zodat de uitbreiding van de aangepaste kleuren van het dialoogvenster altijd wordt weergegeven.
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; 
}

Een lettertype kiezen

In dit onderwerp wordt voorbeeldcode beschreven waarin een dialoogvenster Lettertype wordt weergegeven, zodat een gebruiker de kenmerken van een lettertype kan kiezen. De voorbeeldcode initialiseert eerst een CHOOSEFONT-structuur en roept vervolgens de functie ChooseFont aan om het dialoogvenster weer te geven.

In dit voorbeeld wordt de vlag CF_SCREENFONTS ingesteld om op te geven dat in het dialoogvenster alleen schermlettertypen moeten worden weergegeven. Met deze instelling kunt u de CF_EFFECTS vlag gebruiken om besturingselementen weer te geven waarmee de gebruiker doorstreping, onderstrepen en kleurinstellingen kan selecteren.

Als ChooseFontTRUE retourneert, waarmee wordt aangegeven dat de gebruiker op de knop OK heeft geklikt, bevat de STRUCTUUR CHOOSEFONT informatie die het lettertype en de lettertypekenmerken beschrijft die door de gebruiker zijn geselecteerd, inclusief de leden van de LOGFONT-structuur waarnaar wordt verwezen door het lid lpLogFont . Het rgbColors-lid bevat de geselecteerde tekstkleur. De voorbeeldcode gebruikt deze informatie om het lettertype en de tekstkleur in te stellen voor de apparaatcontext die is gekoppeld aan het eigenaarsvenster.

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

Een bestand openen

Opmerking

Vanaf Windows Vista wordt het dialoogvenster Algemeen bestand vervangen door het dialoogvenster Algemeen item wanneer het wordt gebruikt om een bestand te openen. U wordt aangeraden de dialoogvenster-API voor algemene items te gebruiken in plaats van de dialoogvenster-API Voor algemene bestanden. Zie Het dialoogvenster Algemeen item voor meer informatie.

In dit onderwerp wordt voorbeeldcode beschreven waarin een dialoogvenster Openen wordt weergegeven, zodat een gebruiker het station, de map en de naam van een te openen bestand kan opgeven. De voorbeeldcode initialiseert eerst een OPENFILENAME-structuur en roept vervolgens de functie GetOpenFileName aan om het dialoogvenster weer te geven.

In dit voorbeeld is het lid lpstrFilter een aanwijzer naar een buffer waarmee twee bestandsnaamfilters worden opgegeven die de gebruiker kan selecteren om de weergegeven bestandsnamen te beperken. De buffer bevat een dubbel-nul beëindigde array van tekenreeksen waarin elk paar tekenreeksen een filter specificeert. Het lid nFilterIndex geeft aan dat het eerste patroon wordt gebruikt wanneer het dialoogvenster wordt gemaakt.

In dit voorbeeld worden de OFN_PATHMUSTEXIST en OFN_FILEMUSTEXIST vlaggen ingesteld in het lid Vlaggen . Deze vlaggen zorgen ervoor dat het dialoogvenster controleert of het pad en de bestandsnaam die door de gebruiker zijn opgegeven, daadwerkelijk bestaan.

De functie GetOpenFileName retourneert TRUE als de gebruiker op de knop OK klikt en het opgegeven pad en de bestandsnaam bestaan. In dit geval bevat de buffer die wordt verwezen door het lid lpstrFile het pad en de bestandsnaam. De voorbeeldcode gebruikt deze informatie in een aanroep van de functie om het bestand te openen.

Hoewel in dit voorbeeld de vlag OFN_EXPLORER niet is ingesteld, wordt het dialoogvenster Openen in de standaardverkennerstijl nog steeds weergegeven. Als u echter een hookprocedure of een aangepaste sjabloon wilt opgeven en u de Gebruikersinterface van Explorer wilt gebruiken, moet u de vlag OFN_EXPLORER instellen.

Opmerking

In de programmeertaal C is een tekenreeks tussen aanhalingstekens null-beëindigd.

 

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

Het dialoogvenster Afdrukken weergeven

In dit onderwerp wordt voorbeeldcode beschreven waarin een dialoogvenster Afdrukken wordt weergegeven, zodat een gebruiker opties voor het afdrukken van een document kan selecteren. De voorbeeldcode initialiseert eerst een PRINTDLG-structuur en roept vervolgens de functie PrintDlg aan om het dialoogvenster weer te geven.

In dit voorbeeld wordt de vlag PD_RETURNDC ingesteld in het lid Vlaggen van de PRINTDLG-structuur . Hierdoor retourneert PrintDlg een apparaatcontextgreep naar de geselecteerde printer in het hDC-lid . U kunt de greep gebruiken om uitvoer weer te geven op de printer.

Bij invoer stelt de voorbeeldcode de leden hDevMode en hDevNames in op NULL. Als de functie TRUE retourneert, retourneren deze leden ingangen naar DEVNAMES-structuren die de gebruikersinvoer en informatie over de printer bevatten. U kunt deze informatie gebruiken om de uitvoer voor te bereiden die naar de geselecteerde printer moet worden verzonden.

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

Het eigenschappenvenster Afdrukken gebruiken

In dit onderwerp wordt voorbeeldcode beschreven waarmee een eigenschappenvenster Afdrukken wordt weergegeven, zodat een gebruiker opties voor het afdrukken van een document kan selecteren. De voorbeeldcode initialiseert eerst een PRINTDLGEX-structuur en roept vervolgens de functie PrintDlgEx aan om het eigenschappenvenster weer te geven.

Met de voorbeeldcode wordt de vlag PD_RETURNDC ingesteld in het lid Vlaggen van de PRINTDLG-structuur . Dit zorgt ervoor dat de functie PrintDlgEx een apparaatcontextgreep retourneert naar de geselecteerde printer in het hDC-lid .

Bij invoer stelt de voorbeeldcode de leden hDevMode en hDevNames in op NULL. Als de functie S_OK retourneert, retourneren deze leden ingangen naar DEVNAMES-structuren die de gebruikersinvoer en informatie over de printer bevatten. U kunt deze informatie gebruiken om de uitvoer voor te bereiden die naar de geselecteerde printer moet worden verzonden.

Nadat de afdrukbewerking is voltooid, maakt de voorbeeldcode de buffers DEVMODE, DEVNAMES en PRINTPAGERANGE vrij en roept de functie DeleteDC aan om de apparaatcontext te verwijderen.

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

De afgedrukte pagina instellen

In dit onderwerp wordt voorbeeldcode beschreven waarin een dialoogvenster Pagina-instelling wordt weergegeven, zodat een gebruiker de kenmerken van de afgedrukte pagina kan selecteren, zoals het papiertype, de papierbron, de afdrukstand en de paginamarges. De voorbeeldcode initialiseert eerst een PAGESETUPDLG-structuur en roept vervolgens de functie PageSetupDlg aan om het dialoogvenster weer te geven.

In dit voorbeeld wordt de vlag PSD_MARGINS ingesteld in het lid Vlaggen en wordt het lid rtMargin gebruikt om de initiële margewaarden op te geven. Hiermee stelt u de vlag PSD_INTHOUSANDTHSOFINCHES in om ervoor te zorgen dat in het dialoogvenster margedimensies in duizendtallen van een inch worden weergegeven.

Bij invoer stelt de voorbeeldcode de leden hDevMode en hDevNames in op NULL. Als de functie TRUE retourneert, gebruikt de functie deze leden om ingangen te retourneren naar DEVNAMES-structuren die de gebruikersinvoer en informatie over de printer bevatten. U kunt deze informatie gebruiken om de uitvoer voor te bereiden die naar de geselecteerde printer moet worden verzonden.

In het volgende voorbeeld kan ook een PagePaintHook-hookprocedure worden gebruikt om de inhoud van de voorbeeldpagina aan te passen.

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

In het volgende voorbeeld ziet u een voorbeeld van een PagePaintHook-hookprocedure waarmee de margerechthoek in het voorbeeldpaginagebied wordt gemaakt:

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

Tekst zoeken

In dit onderwerp wordt voorbeeldcode beschreven waarmee een dialoogvenster Zoeken wordt weergegeven en beheerd, zodat de gebruiker de parameters van een zoekbewerking kan opgeven. Het dialoogvenster verzendt berichten naar de vensterprocedure, zodat u de zoekbewerking kunt uitvoeren.

De code voor het weergeven en beheren van een dialoogvenster Vervangen is vergelijkbaar, behalve dat de functie ReplaceText wordt gebruikt om het dialoogvenster weer te geven. Het dialoogvenster Vervangen verzendt ook berichten als reactie op klikken van de gebruiker op de knoppen Vervangen en Alles vervangen .

Als u het dialoogvenster Zoeken of vervangen wilt gebruiken, moet u drie afzonderlijke taken uitvoeren:

  1. Haal een bericht-id op voor het geregistreerde bericht FINDMSGSTRING .
  2. Het dialoogvenster weergeven.
  3. PROCES FINDMSGSTRING-berichten wanneer het dialoogvenster is geopend.

Wanneer u uw toepassing initialiseert, roept u de functie RegisterWindowMessage aan om een bericht-id op te halen voor het geregistreerde bericht FINDMSGSTRING .

UINT uFindReplaceMsg;  // message identifier for FINDMSGSTRING 

uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);

Als u een dialoogvenster Zoeken wilt weergeven, initialiseert u eerst een FINDREPLACE-structuur en roept u vervolgens de functie FindText aan. Houd er rekening mee dat de structuur FINDREPLACE en de buffer voor de zoekreeks een globale of statische variabele moeten zijn, zodat deze niet buiten het bereik valt voordat het dialoogvenster wordt gesloten. U moet het hwndOwner-lid instellen om het venster op te geven dat de geregistreerde berichten ontvangt. Nadat u het dialoogvenster hebt gemaakt, kunt u het verplaatsen of bewerken met behulp van de geretourneerde ingang.

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

Wanneer het dialoogvenster is geopend, moet de hoofdberichtlus een aanroep naar de functie IsDialogMessage bevatten. Geef een handle door aan het dialoogvenster als een parameter in de IsDialogMessage-aanroep. Dit zorgt ervoor dat het dialoogvenster toetsenbordberichten correct verwerkt.

Als u berichten wilt controleren die vanuit het dialoogvenster worden verzonden, moet uw vensterprocedure controleren op het geregistreerde bericht FINDMSGSTRING en de waarden verwerken die zijn doorgegeven in de structuur FINDREPLACE zoals in het volgende voorbeeld.

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