Domanda

Sto cercando di salvare un file usando GetSaveFileName e desidero avere un paio di popup in più nella parte inferiore della finestra di dialogo del mio file di salvataggio per consentire all'utente di specificare ulteriori opzioni. Sto cercando di seguire la Documentazione MSDN (in particolare personalizzazione in stile Explorer ) sull'argomento ma non riesco a visualizzare il mio articolo personalizzato. Credo di aver impostato correttamente la struttura OPENFILENAME mentre ricevo chiamate nel mio OFNHookProc . Per quanto ne so è durante il messaggio WM_INITDIALOG che dovrei creare i miei controlli secondari, che è quello che sto facendo:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      dialog, // the window parameter from the OFNHookProc
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

if (settings_popup)
{
    HWND parent = ::GetParent(settings_popup); // for verification
    ::ShowWindow(settings_popup, SW_SHOW);
    ::EnableWindow(settings_popup, true);
}

Restituisco anche 1 dal mio OFNHookProc per il messaggio WM_INITDIALOG e 0 per tutto il resto.

In tutti i miei tentativi di visualizzare la casella combinata nella finestra di dialogo, non viene visualizzato. Cosa mi manca dal mio codice per rendere la casella combinata parte della mia personalizzazione della finestra di dialogo di salvataggio del file?

È stato utile?

Soluzione

Quando si chiama CreateWindowEx () per creare la finestra figlio, è necessario utilizzare GetParent () per ottenere la finestra padre della finestra di dialogo, quindi utilizzare HWND come finestra padre. Non utilizzare la finestra di dialogo stessa come genitore. In altre parole:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      ::GetParent(dialog),
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

Altri suggerimenti

Normalmente quando si aggiungono controlli a una finestra di dialogo comune, questi nuovi controlli si trovano in un modello di finestra di dialogo (come risorsa o in memoria). In questo modo Windows si occupa della posizione.

Se vuoi ancora creare i tuoi controlli in fase di esecuzione, immagino che dovresti anche ridimensionare e posizionare il tuo genitore in WM_INITDIALOG o CDN_INITDONE (tuo genitore è un finestra vuota nella finestra principale) Utilizza uno strumento come WinSpy ++ per " debug " la finestra di dialogo in fase di esecuzione

Passa i tuoi controlli in un modello di risorse di dialogo separato nella lpTemplateName Parametro della struttura OPENFILENAME. Funziona in modo molto semplice e affidabile. È descritto nel collegamento a cui si fa riferimento,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top