Egendefinerte dialogbokser

Et program kan opprette egendefinerte dialogbokser ved hjelp av en programdefinert vindusklasse for dialogbokser i stedet for å bruke forhåndsdefinerte dialogboksen boksen klasse. Programmer vanligvis bruker denne metoden når en dialogboks er deres hovedvinduet, men det er også nyttig for å lage modal og ikke-sperrende dialogbokser for programmer som har standard overlappende vinduer.

Programdefinert Vindusklassen lar programmet til å definere en vindusprosedyre for dialogboksen boksen og prosessen meldingene før du sender dem til dialogboksen boksen prosedyre. Du kan også definere en klasse-ikonet, en klasse bakgrunnen pensel og en klasse-meny for dialogboksen programmet. Programmet må registrere Vindusklassen før du prøver å opprette en dialogboks, og må oppgi malen i boksen i dialogboksen med atom verdien eller navnet på Vindusklassen.

Mange programmer oppretter en ny dialogboksen boksen klasse ved første henter klasseinformasjon for forhåndsdefinerte dialogboksen boksen klasse, og den sendes til funksjonen GetClassInfo , som fyller en WNDCLASS struktur med informasjonen. Programmet endrer enkeltmedlemmer i strukturen, for eksempel klasse, pensel, og ikonet, og deretter registrerer den nye klassen ved hjelp av funksjonen RegisterClass . Hvis et program fyller WNDCLASS strukturen på egen hånd, må det setter cbWndExtra -medlemmet til DLGWINDOWEXTRA, som er antall ekstra byte systemet krever for hver dialogboks. Hvis et program bruker også ekstra byte for hver dialogboks, må de være utenfor de ekstra bytene som kreves av systemet.

Vinduet fremgangsmåten for den egendefinerte dialogboksen har samme parametere og krav som alle andre prosedyrer i vinduet. I motsetning til andre vinduet prosedyrer, men må vindusprosedyre for denne dialogboksen kalle DefDlgProc funksjonen i stedet for funksjonen DefWindowProc for noen meldinger det ikke behandler. DefDlgProc utfører samme standardmeldingen behandling som vinduet fremgangsmåten for den forhåndsdefinerte dialogboksen, som inneholder ringer dialogboksen boksen prosedyre.

Et program kan også opprette egendefinerte dialogbokser ved delklassifisere vindusprosedyre i forhåndsdefinerte dialogboksen. Funksjonen SetWindowLong kan et program angi adressen til vinduet fremgangsmåten for et gitt vindu. Programmet kan også forsøke å underklasse ved hjelp av SetClassLong -funksjonen, men gjør så påvirker alle dialogboksene i systemet, ikke bare de som tilhører programmet.

Programmer som oppretter egendefinerte dialogbokser noen ganger gi et grensesnitt for alternative tastatur for dialogboksene. Dette kan bety programmet kaller funksjonen IsDialogMessage ikke og behandler alle tastaturinndata i vinduet egendefinerte fremgangsmåten i stedet for ikke-sperrende dialogbokser. I slike tilfeller, kan programmet bruke WM_NEXTDLGCTL meldingen for å minimere koden er nødvendig å flytte inndata fokus fra en kontroll til en annen. Denne meldingen når den sendes til DefDlgProc, flyttes fokuset inndata til en angitt kontroll og oppdaterer utseendet til kontroller, for eksempel bevegelige rammen for standard-knapp, eller angi en automatisk alternativknappen.