STYLES.C


/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/

/****************************** Module Header *******************************
* Module Name: styles.c
*
* Handles the control styles selection, including the styles dialogs.
*
* Functions:
*
* StylesDialog()
* GenericStylesDlgProc()
* CheckBoxStylesDlgProc()
* RadioButtonStylesDlgProc()
* PushButtonStylesDlgProc()
* ComboBoxStylesDlgProc()
* EditStylesDlgProc()
* ListBoxStylesDlgProc()
* CustomStylesDlgProc()
* DialogStylesDlgProc()
* FontNameEnumFunc()
* PointSizeEnumFunc()
* EnableComboBoxStyles()
* EnableEditStyles()
* EnableListBoxStyles()
* SetCustomStylesField()
* GetCustomStylesField()
* EnableDialogStyles()
* FillFontNameCombo()
* FillPointSizeCombo()
* AddToPointSizeCombo()
* FillLanguageCombo()
* FillSubLanguageCombo()
* CheckStyleBoxes()
* QueryCheckedStyles()
* StylesHelp()
*
* Comments:
*
****************************************************************************/

#include "dlgedit.h"
#include "dlgfuncs.h"
#include "dlgextrn.h"
#include "dialogs.h"


STATICFN VOID EnableComboBoxStyles(HWND hwnd, INT idCtrl);
STATICFN VOID EnableEditStyles(HWND hwnd, INT idCtrl);
STATICFN VOID EnableListBoxStyles(HWND hwnd, INT idCtrl);
STATICFN VOID SetCustomStylesField(HWND hwnd, DWORD flStyle);
STATICFN DWORD GetCustomStylesField(HWND hwnd);
STATICFN VOID EnableDialogStyles(HWND hwnd, INT idCtrl);
STATICFN VOID FillFontNameCombo(HWND hwndDlg);
STATICFN VOID FillPointSizeCombo(HWND hwndDlg, LPTSTR pszFaceName);
STATICFN VOID AddToPointSizeCombo(HWND hwndCombo, INT nPointSize);
STATICFN VOID FillLanguageCombo(HWND hwndDlg);
STATICFN VOID FillSubLanguageCombo(HWND hwndDlg, INT iLang);
STATICFN VOID CheckStyleBoxes(HWND hwnd, INT iClass, DWORD flStyle);
STATICFN VOID QueryCheckedStyles(HWND hwnd, INT iClass, DWORD *pflStyle);
STATICFN VOID StylesHelp(VOID);

/*
* Global pointer to the CTYPE for the control or dialog whose styles
* are being worked on. All the styles dialog procs and workers use
* this pointer.
*/
static NPCTYPE npcStyles;

/*
* Globals that receive the new styles the user selected.
*/
static DWORD flStyleNew;
static DWORD flExtStyleNew;
static LPTSTR pszTextNew;
static DIALOGINFO diNew;



/************************************************************************
* StylesDialog
*
* Displays the appropriate styles dialog for the currently selected
* control. If the user OK's the changes, this function sets the
* style of the control.
*
************************************************************************/

VOID StylesDialog(VOID)
{
NPCTYPE npc;
HWND hwndOld;
INT fDlgResult;
BOOL fChanged = FALSE;
BOOL fFontChanged = FALSE;
TCHAR szClassNew[CCHTEXTMAX];
TCHAR szMenuNew[CCHTEXTMAX];
TCHAR szTextNew[CCHTEXTMAX];

/*
* Quit if nothing was selected, or if we are in translate mode.
*/
if (!gnpcSel || gfTranslateMode)
return;

/*
* Set globals that the styles dialogs and worker routines will use.
*/
npcStyles = gnpcSel;
flStyleNew = npcStyles->flStyle;
flExtStyleNew = npcStyles->flExtStyle;

if (npcStyles->text)
NameOrdCpy(szTextNew, npcStyles->text);
else
*szTextNew = CHAR_NULL;

pszTextNew = szTextNew;

/*
* Set some other globals if this is the dialog instead of a control.
*/
if (gfDlgSelected) {
diNew.fResFlags = gcd.di.fResFlags;
diNew.wLanguage = gcd.di.wLanguage;
diNew.DataVersion = gcd.di.DataVersion;
diNew.Version = gcd.di.Version;
diNew.Characteristics = gcd.di.Characteristics;

lstrcpy(diNew.szFontName, gcd.di.szFontName);
diNew.nPointSize = gcd.di.nPointSize;

diNew.pszClass = szClassNew;
if (gcd.di.pszClass)
NameOrdCpy(szClassNew, gcd.di.pszClass);
else
*szClassNew = CHAR_NULL;

diNew.pszMenu = szMenuNew;
if (gcd.di.pszMenu)
NameOrdCpy(szMenuNew, gcd.di.pszMenu);
else
*szMenuNew = CHAR_NULL;
}

/*
* Is this a custom control that has a styles proc to use?
*/
if (npcStyles->pwcd->iType == W_CUSTOM && npcStyles->pwcd->lpfnStyle) {
fDlgResult = CallCustomStyle(npcStyles, &flStyleNew, &flExtStyleNew,
szTextNew);
}
else {
/*
* Show the appropriate styles dialog.
*/
fDlgResult = DlgBox(npcStyles->pwcd->idStylesDialog,
(WNDPROC)npcStyles->pwcd->pfnStylesDlgProc);
}

if (fDlgResult == IDOK) {
/*
* Now go through and determine if anything was really changed.
*/
if (npcStyles->flStyle != flStyleNew ||
npcStyles->flExtStyle != flExtStyleNew ||
NameOrdCmp(npcStyles->text ?
npcStyles->text : szEmpty, szTextNew) != 0)
fChanged = TRUE;

/*
* If this is the dialog, check if some other things were changed.
*/
if (gfDlgSelected) {
if (gcd.di.fResFlags != diNew.fResFlags ||
gcd.di.wLanguage != diNew.wLanguage ||
NameOrdCmp(gcd.di.pszClass ?
gcd.di.pszClass : szEmpty, diNew.pszClass) != 0 ||
NameOrdCmp(gcd.di.pszMenu ?
gcd.di.pszMenu : szEmpty, diNew.pszMenu) != 0)
fChanged = TRUE;

if (lstrcmp(gcd.di.szFontName, diNew.szFontName) != 0 ||
(*diNew.szFontName &&
gcd.di.nPointSize != diNew.nPointSize))
fChanged = fFontChanged = TRUE;
}
}

/*
* Did something change?
*/
if (fChanged) {
if (gfDlgSelected) {
hwndOld = npcStyles->hwnd;
CreateControl(npcStyles, pszTextNew, flStyleNew, flExtStyleNew,
npcStyles->id, &npcStyles->rc, (HWND)NULL, &diNew);

/*
* Create all the control windows in the new dialog.
* They must be created (not just moved over by changing
* the parent and owner) because some controls have
* allocated memory on the old dialogs heap, and this
* heap will become invalid after the old dialog
* is destroyed below.
*/
for (npc = npcHead; npc; npc = npc->npcNext) {
/*
* If this is an icon control and the dialog font
* was just changed, we need to resize the control
* based on the new default icon size.
*/
if (npc->pwcd->iType == W_ICON && fFontChanged) {
npc->rc.right = npc->rc.left + awcd[W_ICON].cxDefault;
npc->rc.bottom = npc->rc.top + awcd[W_ICON].cyDefault;
}

CreateControl(npc, npc->text, npc->flStyle, npc->flExtStyle,
npc->id, &npc->rc, (HWND)NULL, NULL);
}

/*
* Now move all the drag windows over to the new dialog.
* This must be done after creating all the controls
* because of the touchy Z-order that the drag windows
* and the controls must have for painting and selection
* of the drag windows to work properly. Note that we
* rely on SetParent to add the window at
* the TOP in Z-order.
*/
for (npc = npcHead; npc; npc = npc->npcNext) {
SetParent(npc->hwndDrag, npcStyles->hwnd);

/*
* Adjust the position of the drag window.
*/
SizeDragToControl(npc);
}

ShowWindow(npcStyles->hwnd, SW_SHOWNA);
ToolboxOnTop();
DestroyWindow(hwndOld);
}
else {
hwndOld = npcStyles->hwnd;

if (CreateControl(npcStyles, pszTextNew, flStyleNew, flExtStyleNew,
npcStyles->id, &npcStyles->rc, hwndOld, NULL)) {
/*
* Get rid of the old control window.
*/
DestroyWindow(hwndOld);

/*
* Adjust the size and position of its drag window.
*/
SizeDragToControl(npcStyles);
}
}

gfResChged = gfDlgChanged = TRUE;
ShowFileStatus(FALSE);
StatusUpdate();
StatusSetEnable();
}
}



/************************************************************************
* GenericStylesDlgProc
*
* Dialog procedure for styles.
*
************************************************************************/

DIALOGPROC GenericStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);
EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* CheckBoxStylesDlgProc
*
* Dialog procedure for checkboxes.
*
************************************************************************/

DIALOGPROC CheckBoxStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
DWORD dwType;
BOOL f3State;
BOOL fAuto;

switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

dwType = npcStyles->flStyle & BS_ALL;
if (dwType == BS_AUTOCHECKBOX || dwType == BS_AUTO3STATE)
CheckDlgButton(hwnd, DID_BS_AUTOXXX, 1);

if (dwType == BS_3STATE || dwType == BS_AUTO3STATE)
CheckDlgButton(hwnd, DID_BS_3STATE, 1);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);

fAuto = IsDlgButtonChecked(hwnd, DID_BS_AUTOXXX);
f3State = IsDlgButtonChecked(hwnd, DID_BS_3STATE);
flStyleNew &= ~BS_ALL;
if (fAuto) {
if (f3State)
flStyleNew |= BS_AUTO3STATE;
else
flStyleNew |= BS_AUTOCHECKBOX;
}
else {
if (f3State)
flStyleNew |= BS_3STATE;
else
flStyleNew |= BS_CHECKBOX;
}

EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* RadioButtonStylesDlgProc
*
* Dialog box procedure for radio buttons.
*
************************************************************************/

DIALOGPROC RadioButtonStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

if ((npcStyles->flStyle & BS_ALL) == BS_AUTORADIOBUTTON)
CheckDlgButton(hwnd, DID_BS_AUTOXXX, 1);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);

flStyleNew &= ~BS_ALL;
if (IsDlgButtonChecked(hwnd, DID_BS_AUTOXXX))
flStyleNew |= BS_AUTORADIOBUTTON;
else
flStyleNew |= BS_RADIOBUTTON;

EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* PushButtonStylesDlgProc
*
* We do not normally allow more than one default push button in a
* dialog. but if this button is already a default button, we must
* allow them to change it to a normal one, even if there is already
* another default button in the dialog. Note that this condition
* would normally never happen, unless they read in a res file with
* this condition already.
*
************************************************************************/

DIALOGPROC PushButtonStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
NPCTYPE npc;

switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

/*
* Only test for possibly disabling the "default"
* checkbox if the current control does not have the
* "default" style. If it does, we must always allow
* them to turn it off.
*/
if ((npcStyles->flStyle & BS_ALL) != BS_DEFPUSHBUTTON) {
/*
* Loop through all the controls. If any pushbutton
* is found with the "default" style, we disable the
* "Default" checkbox in the styles dialog.
*/
for (npc = npcHead; npc; npc = npc->npcNext)
if ((npc->pwcd->iType == W_PUSHBUTTON) &&
(npc->flStyle & BS_ALL) == BS_DEFPUSHBUTTON) {
EnableWindow(GetDlgItem(hwnd, DID_BS_DEFPUSHBUTTON),
FALSE);
break;
}
}

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);

EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* ComboBoxStylesDlgProc
*
* Dialog procedure for combo boxes.
*
************************************************************************/

DIALOGPROC ComboBoxStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

EnableComboBoxStyles(hwnd, 0);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case DID_CBS_OWNERDRAWFIXED:
case DID_CBS_OWNERDRAWVARIABLE:
if (HIWORD(wParam) == BN_CLICKED)
EnableComboBoxStyles(hwnd,
LOWORD(wParam));

return TRUE;

case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);
EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* EnableComboBoxStyles
*
* Checks/unchecks, disables/enables various checkboxes that are
* mutually exclusive and/or dependant for the Combo Box Styles dialog.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT idCtrl - ID of the control that was clicked on.
*
************************************************************************/

STATICFN VOID EnableComboBoxStyles(
HWND hwnd,
INT idCtrl)
{
BOOL fFixedChecked;
BOOL fVariableChecked;

fFixedChecked = IsDlgButtonChecked(hwnd, DID_CBS_OWNERDRAWFIXED);
fVariableChecked = IsDlgButtonChecked(hwnd, DID_CBS_OWNERDRAWVARIABLE);

if (fFixedChecked || fVariableChecked) {
EnableWindow(GetDlgItem(hwnd, DID_CBS_HASSTRINGS), TRUE);
}
else {
EnableWindow(GetDlgItem(hwnd, DID_CBS_HASSTRINGS), FALSE);
CheckDlgButton(hwnd, DID_CBS_HASSTRINGS, 0);
}

switch (idCtrl) {
case DID_CBS_OWNERDRAWFIXED:
if (fFixedChecked)
CheckDlgButton(hwnd, DID_CBS_OWNERDRAWVARIABLE, 0);

break;

case DID_CBS_OWNERDRAWVARIABLE:
if (fVariableChecked)
CheckDlgButton(hwnd, DID_CBS_OWNERDRAWFIXED, 0);

break;
}
}



/************************************************************************
* EditStylesDlgProc
*
* Dialog procedure for edit boxes.
*
************************************************************************/

DIALOGPROC EditStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

EnableEditStyles(hwnd, 0);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case DID_ES_UPPERCASE:
case DID_ES_LOWERCASE:
case DID_ES_MULTILINE:
if (HIWORD(wParam) == BN_CLICKED)
EnableEditStyles(hwnd,
LOWORD(wParam));

return TRUE;

case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);
EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* EnableEditStyles
*
* Checks/unchecks, disables/enables various checkboxes that are
* mutually exclusive and/or dependant for the Edit Field Styles dialog.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT idCtrl - ID of the control that was clicked on.
*
************************************************************************/

STATICFN VOID EnableEditStyles(
HWND hwnd,
INT idCtrl)
{
if (IsDlgButtonChecked(hwnd, DID_ES_MULTILINE)) {
EnableWindow(GetDlgItem(hwnd, DID_ES_CENTER), TRUE);
EnableWindow(GetDlgItem(hwnd, DID_ES_RIGHT), TRUE);
EnableWindow(GetDlgItem(hwnd, DID_WS_VSCROLL), TRUE);
EnableWindow(GetDlgItem(hwnd, DID_ES_AUTOVSCROLL), TRUE);
EnableWindow(GetDlgItem(hwnd, DID_WS_HSCROLL), TRUE);
}
else {
EnableWindow(GetDlgItem(hwnd, DID_ES_CENTER), FALSE);
EnableWindow(GetDlgItem(hwnd, DID_ES_RIGHT), FALSE);
EnableWindow(GetDlgItem(hwnd, DID_WS_VSCROLL), FALSE);
EnableWindow(GetDlgItem(hwnd, DID_ES_AUTOVSCROLL), FALSE);
EnableWindow(GetDlgItem(hwnd, DID_WS_HSCROLL), FALSE);

CheckDlgButton(hwnd, DID_ES_LEFT, 1);
CheckDlgButton(hwnd, DID_ES_CENTER, 0);
CheckDlgButton(hwnd, DID_ES_RIGHT, 0);
CheckDlgButton(hwnd, DID_WS_VSCROLL, 0);
CheckDlgButton(hwnd, DID_ES_AUTOVSCROLL, 0);
CheckDlgButton(hwnd, DID_WS_HSCROLL, 0);
}

if (idCtrl == DID_ES_UPPERCASE) {
if (IsDlgButtonChecked(hwnd, DID_ES_UPPERCASE))
CheckDlgButton(hwnd, DID_ES_LOWERCASE, 0);
}
else if (idCtrl == DID_ES_LOWERCASE) {
if (IsDlgButtonChecked(hwnd, DID_ES_LOWERCASE))
CheckDlgButton(hwnd, DID_ES_UPPERCASE, 0);
}
}



/************************************************************************
* ListBoxStylesDlgProc
*
* Dialog procedure for list boxes.
*
************************************************************************/

DIALOGPROC ListBoxStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, npcStyles->pwcd->iClass,
npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

EnableListBoxStyles(hwnd, 0);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case DID_LBS_STANDARD:
case DID_LBS_NOTIFY:
case DID_LBS_SORT:
case DID_WS_VSCROLL:
case DID_WS_BORDER:
case DID_LBS_MULTIPLESEL:
case DID_LBS_EXTENDEDSEL:
case DID_LBS_OWNERDRAWFIXED:
case DID_LBS_OWNERDRAWVARIABLE:
case DID_LBS_NODATA:
case DID_LBS_HASSTRINGS:
if (HIWORD(wParam) == BN_CLICKED)
EnableListBoxStyles(hwnd,
LOWORD(wParam));

return TRUE;

case IDOK:
QueryCheckedStyles(hwnd, npcStyles->pwcd->iClass,
&flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);
EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* EnableListBoxStyles
*
* Checks/unchecks, disables/enables various checkboxes that are
* mutually exclusive and/or dependant for the List Box Styles dialog.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT idCtrl - ID of the control that was clicked on.
*
************************************************************************/

STATICFN VOID EnableListBoxStyles(
HWND hwnd,
INT idCtrl)
{
WORD fCheckState;
BOOL fFixedChecked;
BOOL fVariableChecked;

fFixedChecked = IsDlgButtonChecked(hwnd, DID_LBS_OWNERDRAWFIXED);
fVariableChecked = IsDlgButtonChecked(hwnd, DID_LBS_OWNERDRAWVARIABLE);

if (fFixedChecked || fVariableChecked) {
EnableWindow(GetDlgItem(hwnd, DID_LBS_HASSTRINGS), TRUE);
}
else {
EnableWindow(GetDlgItem(hwnd, DID_LBS_HASSTRINGS), FALSE);
CheckDlgButton(hwnd, DID_LBS_HASSTRINGS, 0);
}

EnableWindow(GetDlgItem(hwnd, DID_LBS_NODATA), fFixedChecked);

switch (idCtrl) {
case DID_LBS_STANDARD:
fCheckState = (WORD)(IsDlgButtonChecked(hwnd, DID_LBS_STANDARD)
? 1 : 0);
CheckDlgButton(hwnd, DID_LBS_NOTIFY, fCheckState);
CheckDlgButton(hwnd, DID_LBS_SORT, fCheckState);
CheckDlgButton(hwnd, DID_WS_VSCROLL, fCheckState);
CheckDlgButton(hwnd, DID_WS_BORDER, fCheckState);

if (fCheckState)
CheckDlgButton(hwnd, DID_LBS_NODATA, 0);

break;

case DID_LBS_OWNERDRAWFIXED:
if (fFixedChecked)
CheckDlgButton(hwnd, DID_LBS_OWNERDRAWVARIABLE, 0);
else
CheckDlgButton(hwnd, DID_LBS_NODATA, 0);

break;

case DID_LBS_OWNERDRAWVARIABLE:
if (fVariableChecked) {
CheckDlgButton(hwnd, DID_LBS_OWNERDRAWFIXED, 0);
CheckDlgButton(hwnd, DID_LBS_NODATA, 0);
EnableWindow(GetDlgItem(hwnd, DID_LBS_NODATA), FALSE);
}

break;

case DID_LBS_MULTIPLESEL:
if (IsDlgButtonChecked(hwnd, DID_LBS_MULTIPLESEL))
CheckDlgButton(hwnd, DID_LBS_EXTENDEDSEL, 0);

break;

case DID_LBS_EXTENDEDSEL:
if (IsDlgButtonChecked(hwnd, DID_LBS_EXTENDEDSEL))
CheckDlgButton(hwnd, DID_LBS_MULTIPLESEL, 0);

break;

case DID_LBS_NODATA:
if (IsDlgButtonChecked(hwnd, DID_LBS_NODATA)) {
CheckDlgButton(hwnd, DID_LBS_SORT, 0);
CheckDlgButton(hwnd, DID_LBS_HASSTRINGS, 0);
CheckDlgButton(hwnd, DID_LBS_STANDARD, 0);
}

break;

case DID_LBS_HASSTRINGS:
if (IsDlgButtonChecked(hwnd, DID_LBS_HASSTRINGS))
CheckDlgButton(hwnd, DID_LBS_NODATA, 0);

break;

default:
if (!IsDlgButtonChecked(hwnd, DID_LBS_NOTIFY) ||
!IsDlgButtonChecked(hwnd, DID_LBS_SORT) ||
!IsDlgButtonChecked(hwnd, DID_WS_VSCROLL) ||
!IsDlgButtonChecked(hwnd, DID_WS_BORDER))
fCheckState = 0;
else
fCheckState = 1;

CheckDlgButton(hwnd, DID_LBS_STANDARD, fCheckState);

if (IsDlgButtonChecked(hwnd, DID_LBS_SORT) ||

IsDlgButtonChecked(hwnd, DID_LBS_HASSTRINGS)) 
CheckDlgButton(hwnd, DID_LBS_NODATA, 0);

break;
}
}



/************************************************************************
* CustomStylesDlgProc
*
* Dialog procedure for custom controls.
*
************************************************************************/

DIALOGPROC CustomStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
SetDlgItemText(hwnd, DID_CUSTOMSTYLESCLASS,
npcStyles->pwcd->pszClass);
SendDlgItemMessage(hwnd, DID_CUSTOMSTYLESSTYLES, EM_LIMITTEXT,
CCHHEXLONGMAX, 0L);
SetCustomStylesField(hwnd, npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case DID_CUSTOMSTYLESSTYLES:
if (HIWORD(wParam) == EN_CHANGE) {
flStyleNew = GetCustomStylesField(hwnd);
CheckStyleBoxes(hwnd, IC_WINDOW, flStyleNew);
}

break;

case DID_WS_VISIBLE:
case DID_WS_DISABLED:
case DID_WS_GROUP:
case DID_WS_TABSTOP:
if (HIWORD(wParam) == BN_CLICKED) {
flStyleNew = GetCustomStylesField(hwnd);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);
SetCustomStylesField(hwnd, flStyleNew);
}

break;

case IDOK:
flStyleNew = GetCustomStylesField(hwnd);

EndDialog(hwnd, IDOK);

return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* SetCustomStylesField
*
* Sets the style bits in a custom control.
*
* Arguments:
* HWND hwnd - handle to the custom control
* DWORD flStyle - style of the custom control
*
************************************************************************/

STATICFN VOID SetCustomStylesField(
HWND hwnd,
DWORD flStyle)
{
TCHAR szBuf[32];

wsprintf(szBuf, L"%#.8lx", flStyle);
SetDlgItemText(hwnd, DID_CUSTOMSTYLESSTYLES, szBuf);
}



/************************************************************************
* GetCustomStylesField
*
* Gets the style bits of a custom control.
*
* Arguments:
* HWND hwnd - handle to the custom control.
*
* Returns:
*
* The style bits specified for the custom control.
*
************************************************************************/

STATICFN DWORD GetCustomStylesField(
HWND hwnd)
{
TCHAR szBuf[CCHTEXTMAX];

GetDlgItemText(hwnd, DID_CUSTOMSTYLESSTYLES, szBuf, CCHTEXTMAX);

return valtoi(szBuf);
}



/************************************************************************
* DialogStylesDlgProc
*
* Dialog procedure for a dialog box.
*
************************************************************************/

DIALOGPROC DialogStylesDlgProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
DWORD flResFlagsNew;
INT nPointSize;
INT iLang;
INT iSubLang;
TCHAR szFontName[LF_FACESIZE];
INT nIndex;

switch (msg) {
case WM_INITDIALOG:
CheckStyleBoxes(hwnd, IC_RESFLAGS, (DWORD)diNew.fResFlags);
CheckStyleBoxes(hwnd, IC_DIALOG, npcStyles->flStyle);
CheckStyleBoxes(hwnd, IC_WINDOW, npcStyles->flStyle);

if (IsDlgButtonChecked(hwnd, DID_WS_CAPTION)) {
CheckDlgButton(hwnd, DID_WS_BORDER, 1);
CheckDlgButton(hwnd, DID_WS_DLGFRAME, 1);
}

FillFontNameCombo(hwnd);
FillLanguageCombo(hwnd);

if (IsOrd(diNew.pszClass))
SetDlgItemInt(hwnd, DID_DLGSTYLECLASS,
OrdID(diNew.pszClass), FALSE);
else
SetDlgItemText(hwnd, DID_DLGSTYLECLASS, diNew.pszClass);

if (IsOrd(diNew.pszMenu))
SetDlgItemInt(hwnd, DID_DLGSTYLEMENU,
OrdID(diNew.pszMenu), FALSE);
else
SetDlgItemText(hwnd, DID_DLGSTYLEMENU, diNew.pszMenu);

EnableDialogStyles(hwnd, 0);

CenterWindow(hwnd);

return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam)) {
case DID_WS_BORDER:
case DID_WS_DLGFRAME:
case DID_WS_CAPTION:
case DID_WS_POPUP:
case DID_WS_CHILD:
if (HIWORD(wParam) == BN_CLICKED)
EnableDialogStyles(hwnd,
LOWORD(wParam));

return TRUE;

case DID_DLGSTYLEFONTNAME:
/*
* Did the font name combo change?
*/
if (HIWORD(wParam) == CBN_EDITCHANGE ||
HIWORD(wParam) == CBN_SELCHANGE) {
/*
* Get the font name and begin looking for it.
*/
if (HIWORD(wParam) == CBN_EDITCHANGE) {
/*
* The edit field was typed into. Get the
* new text from there.
*/
GetDlgItemText(hwnd, DID_DLGSTYLEFONTNAME,
szFontName, LF_FACESIZE);
}
else {
/*
* A new string was selected from the list
* box. Get it from the list box, because
* at this point the new text is not yet set
* into the edit control!
*/
nIndex = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLEFONTNAME, CB_GETCURSEL, 0, 0L);

if (nIndex != CB_ERR)
SendDlgItemMessage(hwnd,
DID_DLGSTYLEFONTNAME, CB_GETLBTEXT,
nIndex, (DWORD)szFontName);
else
*szFontName = CHAR_NULL;
}

FillPointSizeCombo(hwnd, szFontName);
}

return TRUE;

case DID_DLGSTYLELANG:
/*
* Did the language combo change?
*/
if (HIWORD(wParam) == CBN_SELCHANGE) {
nIndex = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLELANG, CB_GETCURSEL, 0, 0L);
iLang = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLELANG, CB_GETITEMDATA, nIndex, 0);
FillSubLanguageCombo(hwnd, iLang);
}

return TRUE;

case IDOK:
/*
* If they have entered a font name and an empty
* or zero point size, display an error.
*/
nPointSize = GetDlgItemInt(
hwnd, DID_DLGSTYLEPOINTSIZE, NULL, FALSE);
if (!nPointSize &&
SendDlgItemMessage(hwnd,
DID_DLGSTYLEFONTNAME, WM_GETTEXTLENGTH, 0, 0L)) {
Message(MSG_ZEROPOINTSIZE);
SetFocus(GetDlgItem(hwnd, DID_DLGSTYLEPOINTSIZE));
return TRUE;
}

GetDlgItemText(hwnd, DID_DLGSTYLEFONTNAME,
diNew.szFontName, LF_FACESIZE);
diNew.nPointSize = nPointSize;

/*
* Get the Language.
*/
nIndex = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLELANG, CB_GETCURSEL, 0, 0L);
iLang = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLELANG, CB_GETITEMDATA,
nIndex, 0);
nIndex = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLESUBLANG, CB_GETCURSEL, 0, 0L);
iSubLang = (INT)SendDlgItemMessage(hwnd,
DID_DLGSTYLESUBLANG, CB_GETITEMDATA,
nIndex, 0);
diNew.wLanguage = MAKELANGID(gaLangTable[iLang].wPrimary,
gaLangTable[iLang].asl[iSubLang].wSubLang);

/*
* Get the resource flags. We need to use a temporary
* long variable because QueryCheckedStyles requires
* a long.
*/
flResFlagsNew = diNew.fResFlags;
QueryCheckedStyles(hwnd, IC_RESFLAGS, &flResFlagsNew);
diNew.fResFlags = (WORD)flResFlagsNew;

QueryCheckedStyles(hwnd, IC_DIALOG, &flStyleNew);
QueryCheckedStyles(hwnd, IC_WINDOW, &flStyleNew);

/*
* Set the DS_SETFONT style, if they specified
* a font.
*/
if (*diNew.szFontName)
flStyleNew |= DS_SETFONT;
else
flStyleNew &= ~DS_SETFONT;

GetDlgItemText(hwnd, DID_DLGSTYLECLASS,
diNew.pszClass, CCHTEXTMAX);

/*
* Convert the class to an ordinal, if necessary.
*/
StrToNameOrd(diNew.pszClass, FALSE);

GetDlgItemText(hwnd, DID_DLGSTYLEMENU,
diNew.pszMenu, CCHTEXTMAX);

/*
* Convert the menu name to an ordinal, if necessary.
*/
StrToNameOrd(diNew.pszMenu, FALSE);

/*
* If they just removed the caption style,
* clear the dialog's caption text at the
* same time.
*/
if ((npcStyles->flStyle & WS_CAPTION) == WS_CAPTION &&
(flStyleNew & WS_CAPTION) != WS_CAPTION)
*pszTextNew = CHAR_NULL;

EndDialog(hwnd, IDOK);
return TRUE;

case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
return TRUE;

case IDHELP:
StylesHelp();
break;
}

return FALSE;

default:
return FALSE;
}
}



/************************************************************************
* EnableDialogStyles
*
* Checks and unchecks various checkboxes that are mutually exclusive
* for the Dialog Styles dialog.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT idCtrl - ID of the control that was clicked on.
*
************************************************************************/

STATICFN VOID EnableDialogStyles(
HWND hwnd,
INT idCtrl)
{
switch (idCtrl) {
case DID_WS_CAPTION:
if (IsDlgButtonChecked(hwnd, DID_WS_CAPTION)) {
CheckDlgButton(hwnd, DID_WS_BORDER, 1);
CheckDlgButton(hwnd, DID_WS_DLGFRAME, 1);
}
else {
CheckDlgButton(hwnd, DID_WS_BORDER, 0);
CheckDlgButton(hwnd, DID_WS_DLGFRAME, 0);
}

break;

case DID_WS_BORDER:
case DID_WS_DLGFRAME:
if (IsDlgButtonChecked(hwnd, DID_WS_BORDER) &&
IsDlgButtonChecked(hwnd, DID_WS_DLGFRAME))
CheckDlgButton(hwnd, DID_WS_CAPTION, 1);
else
CheckDlgButton(hwnd, DID_WS_CAPTION, 0);

break;

case DID_WS_CHILD:
if (IsDlgButtonChecked(hwnd, DID_WS_CHILD))
CheckDlgButton(hwnd, DID_WS_POPUP, 0);

break;

case DID_WS_POPUP:
if (IsDlgButtonChecked(hwnd, DID_WS_POPUP))
CheckDlgButton(hwnd, DID_WS_CHILD, 0);

break;
}
}



/************************************************************************
* FillFontNameCombo
*
* Fills combo box with available fonts for dialog.
*
* Arguments:
* HWND hwndDlg - Dialog window handle.
*
************************************************************************/

STATICFN VOID FillFontNameCombo(
HWND hwndDlg)
{
HDC hDC;
HWND hwndCombo;
TCHAR szName1[LF_FACESIZE];
TCHAR szName2[LF_FACESIZE];
LPTSTR pszName;
LPTSTR pszNameLast;
LPTSTR pszNameTemp;
INT iIndex;
INT iItems;

hwndCombo = GetDlgItem(hwndDlg, DID_DLGSTYLEFONTNAME);

if (hDC = GetDC(ghwndMain)) {
EnumFonts(hDC, NULL, (FONTENUMPROC) FontNameEnumFunc, (LPARAM)&hwndCombo);
ReleaseDC(ghwndMain, hDC);
}

/*
* Strip out any duplicate names in the combobox. This routine
* relies on the items being sorted first.
*/
iItems = (INT)SendMessage(hwndCombo, CB_GETCOUNT, 0, 0);
*szName1 = CHAR_NULL;
*szName2 = CHAR_NULL;
pszName = szName1;
pszNameLast = szName2;
for (iIndex = 0; iIndex < iItems;) {
/*
* Get the text of the next item.
*/
SendMessage(hwndCombo, CB_GETLBTEXT, iIndex, (DWORD)pszName);

/*
* If it matches the previous item, delete it. Otherwise,
* flip the buffers to save the current items text and
* go on to the next item.
*/
if (lstrcmp(pszName, pszNameLast) == 0) {
SendMessage(hwndCombo, CB_DELETESTRING, iIndex, 0);
iItems--;
}
else {
pszNameTemp = pszNameLast;
pszNameLast = pszName;
pszName = pszNameTemp;
iIndex++;
}
}

/*
* Initialize the font fields. The order the fields are set
* is important, because setting the face name clears out the
* point size combo.
*/
SetDlgItemText(hwndDlg, DID_DLGSTYLEFONTNAME, diNew.szFontName);
FillPointSizeCombo(hwndDlg, diNew.szFontName);
}



/************************************************************************
* FontNameEnumFunc
*
* Enumeration function that adds all the font face names to the
* Font Face Name combo box in the Dialog Styles dialog.
*
* Arguments:
* LPLOGFONT lpLogFont - pointer to font structure
* LPTEXTMETRIC lpTextMetric - pointer to textmetric struct for font
* INT nFontType - type of font
* LPVOID lpData - font data
*
************************************************************************/

BOOL APIENTRY FontNameEnumFunc(
LPLOGFONT lpLogFont,
LPTEXTMETRIC lpTextMetric,
INT nFontType,
LPVOID lpData)
{
/*
* Add this name to the combo box.
*/
SendMessage(*((LPHWND)lpData), CB_ADDSTRING, 0,
(DWORD)lpLogFont->lfFaceName);

/*
* Keep on going...
*/
return TRUE;
}



/************************************************************************
* FillPointSizeCombo
*
* This function fills the Point Size combobox with the point sizes
* that are available for the given face name. It should be called
* whenever the Font Name combobox is changed to keep them in sync.
*
* Arguments:
* HWND hwndDlg - Dialog window handle.
* LPTSTR pszFaceName - Face name for the selected font.
*
************************************************************************/

STATICFN VOID FillPointSizeCombo(
HWND hwndDlg,
LPTSTR pszFaceName)
{
HDC hDC;
HWND hwndCombo;

hwndCombo = GetDlgItem(hwndDlg, DID_DLGSTYLEPOINTSIZE);
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0L);

if (*pszFaceName && (hDC = GetDC(ghwndMain))) {
EnumFonts(hDC, pszFaceName, (FONTENUMPROC) PointSizeEnumFunc, (LPARAM)&hwndCombo);
ReleaseDC(ghwndMain, hDC);
}

/*
* Select a default one. This is the point size that is currently
* selected if the face name is the current one, or else it is the
* first point size in the list.
*/
if (gcd.fFontSpecified && lstrcmp(pszFaceName, gcd.di.szFontName) == 0)
SetDlgItemInt(hwndDlg, DID_DLGSTYLEPOINTSIZE, gcd.di.nPointSize, FALSE);
else
SendDlgItemMessage(hwndDlg, DID_DLGSTYLEPOINTSIZE,
CB_SETCURSEL, 0, 0L);
}



/************************************************************************
* PointSizeEnumFunc
*
* Enumeration function that adds all the point sizes to the
* Pt. Size combo box in the Dialog Styles dialog.
*
* Arguments:
* LPLOGFONT lpLogFont - pointer to font structure
* LPTEXTMETRIC lpTextMetric - pointer to textmetric struct for font
* INT nFontType - type of font
* LPVOID lpData - font data
*
************************************************************************/

BOOL APIENTRY PointSizeEnumFunc(
LPLOGFONT lpLogFont,
LPTEXTMETRIC lpTextMetric,
INT nFontType,
LPVOID lpData)
{
HWND hwndCombo;
INT nPointSize;

hwndCombo = *((LPHWND)lpData);

if (nFontType == RASTER_FONTTYPE) {
/*
* Convert the pixels to point size. Note that because of the
* definition of the tmHeight field, the tmInternalLeading has
* to be subtracted from it before converting to get the proper
* font point size. This is done automatically by the Windows
* CreateFont call if you pass in a nHeight parameter that is
* negative, so be aware of this when doing the reverse calculation
* to create a font of the proper height!
*/
nPointSize = PixelsToPointSize(
lpTextMetric->tmHeight - lpTextMetric->tmInternalLeading);

AddToPointSizeCombo(hwndCombo, nPointSize);
}
else {
/*
* For scalable (TrueType, ATM or vector) fonts, add the
* common point sizes. This list was pulled out of the
( commdlg.dll Font dialog.
*/
AddToPointSizeCombo(hwndCombo, 8);
AddToPointSizeCombo(hwndCombo, 9);
AddToPointSizeCombo(hwndCombo, 10);
AddToPointSizeCombo(hwndCombo, 11);
AddToPointSizeCombo(hwndCombo, 12);
AddToPointSizeCombo(hwndCombo, 14);
AddToPointSizeCombo(hwndCombo, 16);
AddToPointSizeCombo(hwndCombo, 18);
AddToPointSizeCombo(hwndCombo, 20);
AddToPointSizeCombo(hwndCombo, 22);
AddToPointSizeCombo(hwndCombo, 24);
AddToPointSizeCombo(hwndCombo, 26);
AddToPointSizeCombo(hwndCombo, 28);
AddToPointSizeCombo(hwndCombo, 36);
AddToPointSizeCombo(hwndCombo, 48);
AddToPointSizeCombo(hwndCombo, 72);
}

/*
* Keep on going...
*/
return TRUE;
}



/************************************************************************
* AddToPointSizeCombo
*
* This function adds a point size to the point size combobox.
* It does not allow duplicate point sizes, and the sizes will
* be inserted in order.
*
* Arguments:
* HWND hwndCombo - The combobox window handle.
* INT nPointSize - The point size to add.
*
************************************************************************/

STATICFN VOID AddToPointSizeCombo(
HWND hwndCombo,
INT nPointSize)
{
TCHAR szPointSize[31];
INT nPoints2;
INT iIndex;
INT iIndexAdd;
INT iItems;

iItems = (INT)SendMessage(hwndCombo, CB_GETCOUNT, 0, 0);
for (iIndex = 0, iIndexAdd = -1; iIndex < iItems; iIndex++) {
nPoints2 = (INT)SendMessage(hwndCombo, CB_GETITEMDATA, iIndex, 0);

if (nPoints2 == nPointSize) {
/*
* A duplicate was found. Skip this one.
*/
return;
}
else if (nPoints2 > nPointSize) {
iIndexAdd = iIndex;
break;
}
}

/*
* Add this point size to the combo box.
*/
itoaw(nPointSize, szPointSize, 10);
iIndex = (INT)SendMessage(hwndCombo, CB_INSERTSTRING,
iIndexAdd, (DWORD)szPointSize);
SendMessage(hwndCombo, CB_SETITEMDATA, iIndex, (DWORD)nPointSize);
}



/************************************************************************
* FillLanguageCombo
*
* This function fills the Language combobox with the known languages.
*
* Arguments:
* HWND hwndDlg - Dialog window handle.
*
************************************************************************/

STATICFN VOID FillLanguageCombo(
HWND hwndDlg)
{
HWND hwndCombo;
INT i;
INT iIndex;
INT iSel;
INT iLang;
WORD wPrimary;

hwndCombo = GetDlgItem(hwndDlg, DID_DLGSTYLELANG);
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0L);

for (i = 0; i < gcLanguages; i++) {
iIndex = (INT)SendMessage(hwndCombo, CB_ADDSTRING,
0, (DWORD)ids(gaLangTable[i].idsLangDesc));
SendMessage(hwndCombo, CB_SETITEMDATA, iIndex, (DWORD)i);
}

wPrimary = (WORD)PRIMARYLANGID(diNew.wLanguage);
for (i = 0, iSel = 0; i < gcLanguages; i++) {
iLang = (INT)SendMessage(hwndCombo, CB_GETITEMDATA, i, 0);

if (gaLangTable[iLang].wPrimary == wPrimary) {
iSel = i;
break;
}
}

SendMessage(hwndCombo, CB_SETCURSEL, iSel, 0L);

FillSubLanguageCombo(hwndDlg,
(INT)SendMessage(hwndCombo, CB_GETITEMDATA, iSel, 0));
}



/************************************************************************
* FillSubLanguageCombo
*
* This function fills the Sub-Language combobox with the sub-languages
* for the specified language.
*
* Arguments:
* HWND hwndDlg - Dialog window handle.
* INT iLang - Index to the language in the language table.
*
************************************************************************/

STATICFN VOID FillSubLanguageCombo(
HWND hwndDlg,
INT iLang)
{
HWND hwndCombo;
INT i;
INT iIndex;
INT iSel = 0;
WORD wSubLang;

hwndCombo = GetDlgItem(hwndDlg, DID_DLGSTYLESUBLANG);
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0L);

for (i = 0; i < gaLangTable[iLang].cSubLangs; i++) {
iIndex = (INT)SendMessage(hwndCombo, CB_ADDSTRING, 0,
(DWORD)ids(gaLangTable[iLang].asl[i].idsSubLangDesc));
SendMessage(hwndCombo, CB_SETITEMDATA, iIndex, (DWORD)i);
}

/*
* Is this the language set for the dialog? If so, find the
* sublanguage and make that the default.
*/
if (gaLangTable[iLang].wPrimary == (WORD)PRIMARYLANGID(diNew.wLanguage)) {
wSubLang = SUBLANGID(diNew.wLanguage);
for (i = 0; i < gaLangTable[iLang].cSubLangs; i++) {
iIndex = (INT)SendMessage(hwndCombo, CB_GETITEMDATA, i, 0);
if (wSubLang == gaLangTable[iLang].asl[iIndex].wSubLang) {
iSel = i;
break;
}
}
}

SendMessage(hwndCombo, CB_SETCURSEL, iSel, 0L);
}



/************************************************************************
* CheckStyleBoxes
*
* This function takes the given style and checks the appropriate
* check boxes and radio buttons in the styles dialog. The iClass
* determines the lookup table to use.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT iClass - Control class (determines the style lookup table).
* DWORD flStyle - Style of the control.
*
************************************************************************/

STATICFN VOID CheckStyleBoxes(
HWND hwnd,
INT iClass,
DWORD flStyle)
{
register INT i;
PCLASSSTYLE pcs;
HWND hwndControl;
DWORD flStyleMask;

i = acsd[iClass].cClassStyles;
pcs = acsd[iClass].pacs;

while (i--) {
/*
* Is there a DID_* defined for this style?
*/
if (pcs->idControl) {
/*
* Does the dialog have a control with this id?
*/
if (hwndControl = GetDlgItem(hwnd, pcs->idControl)) {
flStyleMask =
pcs->flStyleMask ? pcs->flStyleMask : pcs->flStyle;

/*
* If there is a match, check the box. Otherwise,
* uncheck it.
*/
SendMessage(hwndControl, BM_SETCHECK,
((flStyle & flStyleMask) == pcs->flStyle) ? 1 : 0,
0L);
}
}

pcs++;
}
}



/************************************************************************
* QueryCheckedStyles
*
* This function returns the new style that the user has selected from
* dialog. It reads all the checkboxes and builds up the style.
* Upon entry, the DWORD that is at pflStyle should be set to the
* original style for the control. Chosen bits will be masked off
* and set as appropriate. This allows bits that are not settable
* from within this styles dialog to be left untouched.
*
* Arguments:
* HWND hwnd - Dialog window handle.
* INT iClass - Control class (determines the style lookup table).
* DWORD *pflStyle - Where to return the style of the control. What
* this points to should initially have the original
* styles of the control.
*
************************************************************************/

STATICFN VOID QueryCheckedStyles(
HWND hwnd,
INT iClass,
DWORD *pflStyle)
{
register INT i;
PCLASSSTYLE pcs;
HWND hwndControl;
DWORD flStyleMask;
DWORD flStyle;

/*
* The first step is to strip off all bits that may be changed by
* the current dialog.
*/
flStyle = *pflStyle;
i = acsd[iClass].cClassStyles;
pcs = acsd[iClass].pacs;
while (i--) {
/*
* Is this a style that is settable by a dialog, and does the
* current dialog have this style control?
*/
if (pcs->idControl && GetDlgItem(hwnd, pcs->idControl)) {
flStyleMask =
pcs->flStyleMask ? pcs->flStyleMask : pcs->flStyle;

/*
* Strip off all bits in the mask for this style.
*/
flStyle &= ~flStyleMask;
}

pcs++;
}

/*
* Now we go through all bits that may be set and set any that the
* user has selected.
*/
i = acsd[iClass].cClassStyles;
pcs = acsd[iClass].pacs;
while (i--) {
if (pcs->idControl &&
(hwndControl = GetDlgItem(hwnd, pcs->idControl))) {
if (SendMessage(hwndControl, BM_GETCHECK, 0, 0L))
flStyle |= pcs->flStyle;
}

pcs++;
}

*pflStyle = flStyle;
}



/************************************************************************
* StylesHelp
*
* This function shows the appropriate help context from any of the
* styles dialogs. It uses the type of control in npcStyles to
* determine what help to show.
*
************************************************************************/

STATICFN VOID StylesHelp(VOID)
{
WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT,
npcStyles->pwcd->HelpContext);
}