1834 lines
54 KiB
C
1834 lines
54 KiB
C
/****************************************************************************/
|
|
/* */
|
|
/* Microsoft Confidential */
|
|
/* */
|
|
/* Copyright (c) Microsoft Corp. 1987, 1990 */
|
|
/* All Rights Reserved */
|
|
/* */
|
|
/****************************************************************************/
|
|
/****************************** Module Header *******************************
|
|
* Module Name: styles.c
|
|
*
|
|
* Handles the control styles selection, including the styles dialogs.
|
|
*
|
|
* History:
|
|
*
|
|
****************************************************************************/
|
|
|
|
#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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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. Creating new controls is
|
|
* the safest thing to do to avoid GP-faults later!
|
|
*/
|
|
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 I
|
|
* am relying 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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC GenericStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC CheckBoxStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC RadioButtonStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC PushButtonStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC ComboBoxStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case DID_CBS_OWNERDRAWFIXED:
|
|
case DID_CBS_OWNERDRAWVARIABLE:
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED)
|
|
EnableComboBoxStyles(hwnd,
|
|
GET_WM_COMMAND_ID(wParam, lParam));
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC EditStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case DID_ES_UPPERCASE:
|
|
case DID_ES_LOWERCASE:
|
|
case DID_ES_MULTILINE:
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED)
|
|
EnableEditStyles(hwnd,
|
|
GET_WM_COMMAND_ID(wParam, lParam));
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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);
|
|
EnableWindow(GetDlgItem(hwnd, DID_ES_WANTRETURN), 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);
|
|
EnableWindow(GetDlgItem(hwnd, DID_ES_WANTRETURN), 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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC ListBoxStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
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 (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED)
|
|
EnableListBoxStyles(hwnd,
|
|
GET_WM_COMMAND_ID(wParam, lParam));
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC CustomStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case DID_CUSTOMSTYLESSTYLES:
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == 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 (GET_WM_COMMAND_CMD(wParam, lParam) == 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
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
STATICFN VOID SetCustomStylesField(
|
|
HWND hwnd,
|
|
DWORD flStyle)
|
|
{
|
|
TCHAR szBuf[32];
|
|
|
|
wsprintf(szBuf, L"%#.8lx", flStyle);
|
|
SetDlgItemText(hwnd, DID_CUSTOMSTYLESSTYLES, szBuf);
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* GetCustomStylesField
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
STATICFN DWORD GetCustomStylesField(
|
|
HWND hwnd)
|
|
{
|
|
TCHAR szBuf[CCHTEXTMAX];
|
|
|
|
GetDlgItemText(hwnd, DID_CUSTOMSTYLESSTYLES, szBuf, CCHTEXTMAX);
|
|
|
|
return valtoi(szBuf);
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* DialogStylesDlgProc
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
DIALOGPROC DialogStylesDlgProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LONG 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 (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case DID_WS_BORDER:
|
|
case DID_WS_DLGFRAME:
|
|
case DID_WS_CAPTION:
|
|
case DID_WS_POPUP:
|
|
case DID_WS_CHILD:
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED)
|
|
EnableDialogStyles(hwnd,
|
|
GET_WM_COMMAND_ID(wParam, lParam));
|
|
|
|
return TRUE;
|
|
|
|
case DID_DLGSTYLEFONTNAME:
|
|
/*
|
|
* Did the font name combo change?
|
|
*/
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_EDITCHANGE ||
|
|
GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELCHANGE) {
|
|
/*
|
|
* Get the font name and begin looking for it.
|
|
*/
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == 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 (GET_WM_COMMAND_CMD(wParam, lParam) == 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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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
|
|
*
|
|
* Arguments:
|
|
* HWND hwndDlg - Dialog window handle.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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, 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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
BOOL APIENTRY FontNameEnumFunc(
|
|
CONST LOGFONT *lpLogFont,
|
|
CONST TEXTMETRIC *lpTextMetric,
|
|
DWORD nFontType,
|
|
LPARAM 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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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, 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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
BOOL APIENTRY PointSizeEnumFunc(
|
|
CONST LOGFONT *lpLogFont,
|
|
CONST TEXTMETRIC *lpTextMetric,
|
|
DWORD nFontType,
|
|
LPARAM 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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
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.
|
|
*
|
|
* History:
|
|
*
|
|
************************************************************************/
|
|
|
|
STATICFN VOID StylesHelp(VOID)
|
|
{
|
|
WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT,
|
|
npcStyles->pwcd->HelpContext);
|
|
}
|