ReactOS 0.4.15-dev-8419-g7f0e8a3
propsheet.c File Reference
#include <stdarg.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "winnls.h"
#include "commctrl.h"
#include "prsht.h"
#include "comctl32.h"
#include "uxtheme.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "pshpack2.h"
#include "poppack.h"
Include dependency graph for propsheet.c:

Go to the source code of this file.

Classes

struct  MyDLGTEMPLATEEX
 
struct  MyDLGITEMTEMPLATEEX
 
struct  tagPropPageInfo
 
struct  tagPropSheetInfo
 
struct  PADDING_INFO
 

Macros

#define NONAMELESSUNION
 
#define PSP_INTERNAL_UNICODE   0x80000000
 
#define MAX_CAPTION_LENGTH   255
 
#define MAX_TABTEXT_LENGTH   255
 
#define MAX_BUTTONTEXT_LENGTH   64
 
#define INTRNL_ANY_WIZARD   (PSH_WIZARD | PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE)
 
#define WIZARD_PADDING   7
 
#define WIZARD_HEADER_HEIGHT   36
 
#define add_flag(a)   if (dwFlags & a) {strcat(string, #a );strcat(string," ");}
 

Typedefs

typedef struct tagPropPageInfo PropPageInfo
 
typedef struct tagPropSheetInfo PropSheetInfo
 

Functions

static PADDING_INFO PROPSHEET_GetPaddingInfo (HWND hwndDlg)
 
static void PROPSHEET_SetTitleW (HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
 
static BOOL PROPSHEET_CanSetCurSel (HWND hwndDlg)
 
static BOOL PROPSHEET_SetCurSel (HWND hwndDlg, int index, int skipdir, HPROPSHEETPAGE hpage)
 
static int PROPSHEET_GetPageIndex (HPROPSHEETPAGE hpage, const PropSheetInfo *psInfo, int original_index)
 
static PADDING_INFO PROPSHEET_GetPaddingInfoWizard (HWND hwndDlg, const PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_DoCommand (HWND hwnd, WORD wID)
 
static BOOL PROPSHEET_RemovePage (HWND hwndDlg, int index, HPROPSHEETPAGE hpage)
 
static INT_PTR CALLBACK PROPSHEET_DialogProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
 WINE_DEFAULT_DEBUG_CHANNEL (propsheet)
 
static WCHARheap_strdupW (const WCHAR *str)
 
static WCHARheap_strdupAtoW (const char *str)
 
static VOID PROPSHEET_UnImplementedFlags (DWORD dwFlags)
 
static void PROPSHEET_GetPageRect (const PropSheetInfo *psInfo, HWND hwndDlg, RECT *rc, LPCPROPSHEETPAGEW ppshpage)
 
static INT PROPSHEET_FindPageByResId (const PropSheetInfo *psInfo, LRESULT resId)
 
static void PROPSHEET_CollectSheetInfoCommon (PropSheetInfo *psInfo, DWORD dwFlags)
 
static void PROPSHEET_CollectSheetInfoA (LPCPROPSHEETHEADERA lppsh, PropSheetInfo *psInfo)
 
static void PROPSHEET_CollectSheetInfoW (LPCPROPSHEETHEADERW lppsh, PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_CollectPageInfo (LPCPROPSHEETPAGEW lppsp, PropSheetInfo *psInfo, int index, BOOL resize)
 
static INT_PTR PROPSHEET_CreateDialog (PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_SizeMismatch (HWND hwndDlg, const PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_AdjustSize (HWND hwndDlg, PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_AdjustSizeWizard (HWND hwndDlg, const PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_AdjustButtons (HWND hwndParent, const PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_AdjustButtonsWizard (HWND hwndParent, const PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_CreateTabControl (HWND hwndParent, const PropSheetInfo *psInfo)
 
static LRESULT CALLBACK PROPSHEET_WizardSubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef)
 
static UINT GetTemplateSize (const DLGTEMPLATE *pTemplate)
 
static BOOL PROPSHEET_CreatePage (HWND hwndParent, int index, const PropSheetInfo *psInfo, LPCPROPSHEETPAGEW ppshpage)
 
static VOID PROPSHEET_LoadWizardBitmaps (PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_ShowPage (HWND hwndDlg, int index, PropSheetInfo *psInfo)
 
static BOOL PROPSHEET_Back (HWND hwndDlg)
 
static BOOL PROPSHEET_Next (HWND hwndDlg)
 
static BOOL PROPSHEET_Finish (HWND hwndDlg)
 
static BOOL PROPSHEET_Apply (HWND hwndDlg, LPARAM lParam)
 
static void PROPSHEET_Cancel (HWND hwndDlg, LPARAM lParam)
 
static void PROPSHEET_Help (HWND hwndDlg)
 
static void PROPSHEET_Changed (HWND hwndDlg, HWND hwndDirtyPage)
 
static void PROPSHEET_UnChanged (HWND hwndDlg, HWND hwndCleanPage)
 
static void PROPSHEET_PressButton (HWND hwndDlg, int buttonID)
 
static void PROPSHEET_SetCurSelId (HWND hwndDlg, int id)
 
static void PROPSHEET_SetTitleA (HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
 
static void PROPSHEET_SetFinishTextA (HWND hwndDlg, LPCSTR lpszText)
 
static void PROPSHEET_SetFinishTextW (HWND hwndDlg, LPCWSTR lpszText)
 
static LRESULT PROPSHEET_QuerySiblings (HWND hwndDlg, WPARAM wParam, LPARAM lParam)
 
static BOOL PROPSHEET_InsertPage (HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage)
 
static BOOL PROPSHEET_AddPage (HWND hwndDlg, HPROPSHEETPAGE hpage)
 
static void PROPSHEET_SetWizButtons (HWND hwndDlg, DWORD dwFlags)
 
static void PROPSHEET_SetHeaderTitleW (HWND hwndDlg, UINT page_index, const WCHAR *title)
 
static void PROPSHEET_SetHeaderTitleA (HWND hwndDlg, UINT page_index, const char *title)
 
static void PROPSHEET_SetHeaderSubTitleW (HWND hwndDlg, UINT page_index, const WCHAR *subtitle)
 
static void PROPSHEET_SetHeaderSubTitleA (HWND hwndDlg, UINT page_index, const char *subtitle)
 
static LRESULT PROPSHEET_HwndToIndex (HWND hwndDlg, HWND hPageDlg)
 
static LRESULT PROPSHEET_IndexToHwnd (HWND hwndDlg, int iPageIndex)
 
static LRESULT PROPSHEET_PageToIndex (HWND hwndDlg, HPROPSHEETPAGE hPage)
 
static LRESULT PROPSHEET_IndexToPage (HWND hwndDlg, int iPageIndex)
 
static LRESULT PROPSHEET_IdToIndex (HWND hwndDlg, int iPageId)
 
static LRESULT PROPSHEET_IndexToId (HWND hwndDlg, int iPageIndex)
 
static LRESULT PROPSHEET_GetResult (HWND hwndDlg)
 
static BOOL PROPSHEET_RecalcPageSizes (HWND hwndDlg)
 
static void PROPSHEET_CleanUp (HWND hwndDlg)
 
static INT do_loop (const PropSheetInfo *psInfo)
 
static INT_PTR PROPSHEET_PropertySheet (PropSheetInfo *psInfo, BOOL unicode)
 
INT_PTR WINAPI PropertySheetA (LPCPROPSHEETHEADERA lppsh)
 
INT_PTR WINAPI PropertySheetW (LPCPROPSHEETHEADERW lppsh)
 
static LPWSTR load_string (HINSTANCE instance, LPCWSTR str)
 
HPROPSHEETPAGE WINAPI CreatePropertySheetPageA (LPCPROPSHEETPAGEA lpPropSheetPage)
 
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW (LPCPROPSHEETPAGEW lpPropSheetPage)
 
BOOL WINAPI DestroyPropertySheetPage (HPROPSHEETPAGE hPropPage)
 
static BOOL PROPSHEET_IsDialogMessage (HWND hwnd, LPMSG lpMsg)
 
static LRESULT PROPSHEET_Paint (HWND hwnd, HDC hdcParam)
 

Variables

static const WCHAR PropSheetInfoStr []
 

Macro Definition Documentation

◆ add_flag

#define add_flag (   a)    if (dwFlags & a) {strcat(string, #a );strcat(string," ");}

Definition at line 198 of file propsheet.c.

◆ INTRNL_ANY_WIZARD

#define INTRNL_ANY_WIZARD   (PSH_WIZARD | PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE)

Definition at line 152 of file propsheet.c.

◆ MAX_BUTTONTEXT_LENGTH

#define MAX_BUTTONTEXT_LENGTH   64

Definition at line 150 of file propsheet.c.

◆ MAX_CAPTION_LENGTH

#define MAX_CAPTION_LENGTH   255

Definition at line 148 of file propsheet.c.

◆ MAX_TABTEXT_LENGTH

#define MAX_TABTEXT_LENGTH   255

Definition at line 149 of file propsheet.c.

◆ NONAMELESSUNION

#define NONAMELESSUNION

Definition at line 55 of file propsheet.c.

◆ PSP_INTERNAL_UNICODE

#define PSP_INTERNAL_UNICODE   0x80000000

Definition at line 146 of file propsheet.c.

◆ WIZARD_HEADER_HEIGHT

#define WIZARD_HEADER_HEIGHT   36

Definition at line 156 of file propsheet.c.

◆ WIZARD_PADDING

#define WIZARD_PADDING   7

Definition at line 155 of file propsheet.c.

Typedef Documentation

◆ PropPageInfo

◆ PropSheetInfo

Function Documentation

◆ CreatePropertySheetPageA()

HPROPSHEETPAGE WINAPI CreatePropertySheetPageA ( LPCPROPSHEETPAGEA  lpPropSheetPage)

Definition at line 2999 of file propsheet.c.

3001{
3002 PROPSHEETPAGEW *ppsp;
3003
3004 if (lpPropSheetPage->dwSize < PROPSHEETPAGEA_V1_SIZE)
3005 return NULL;
3006
3007 /* original data is used for callback notifications */
3008 if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
3009 {
3010 ppsp = Alloc(2 * sizeof(*ppsp));
3011 memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
3012 memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
3013 }
3014 else
3015 {
3016 ppsp = Alloc(sizeof(*ppsp));
3017 memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
3018 }
3019
3020 ppsp->dwFlags &= ~PSP_INTERNAL_UNICODE;
3021
3022 if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
3023 {
3024 if (!IS_INTRESOURCE( ppsp->u.pszTemplate ))
3025 {
3026 int len = strlen(lpPropSheetPage->u.pszTemplate) + 1;
3027 char *template = Alloc( len );
3028
3029 ppsp->u.pszTemplate = (LPWSTR)strcpy( template, lpPropSheetPage->u.pszTemplate );
3030 }
3031 }
3032
3033 if (ppsp->dwFlags & PSP_USEICONID)
3034 {
3035 if (!IS_INTRESOURCE( ppsp->u2.pszIcon ))
3036 ppsp->u2.pszIcon = heap_strdupAtoW( lpPropSheetPage->u2.pszIcon );
3037 }
3038
3039 if (ppsp->dwFlags & PSP_USETITLE)
3040 {
3041 if (IS_INTRESOURCE( ppsp->pszTitle ))
3042 ppsp->pszTitle = load_string( ppsp->hInstance, ppsp->pszTitle );
3043 else
3044 ppsp->pszTitle = heap_strdupAtoW( lpPropSheetPage->pszTitle );
3045 }
3046 else
3047 ppsp->pszTitle = NULL;
3048
3049 if (ppsp->dwFlags & PSP_HIDEHEADER)
3050 ppsp->dwFlags &= ~(PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE);
3051
3052 if (ppsp->dwFlags & PSP_USEHEADERTITLE)
3053 {
3054 if (IS_INTRESOURCE( ppsp->pszHeaderTitle ))
3055 ppsp->pszHeaderTitle = load_string( ppsp->hInstance, ppsp->pszHeaderTitle );
3056 else
3057 ppsp->pszHeaderTitle = heap_strdupAtoW( lpPropSheetPage->pszHeaderTitle );
3058 }
3059 else
3060 ppsp->pszHeaderTitle = NULL;
3061
3062 if (ppsp->dwFlags & PSP_USEHEADERSUBTITLE)
3063 {
3064 if (IS_INTRESOURCE( ppsp->pszHeaderSubTitle ))
3065 ppsp->pszHeaderSubTitle = load_string( ppsp->hInstance, ppsp->pszHeaderSubTitle );
3066 else
3067 ppsp->pszHeaderSubTitle = heap_strdupAtoW( lpPropSheetPage->pszHeaderSubTitle );
3068 }
3069 else
3070 ppsp->pszHeaderSubTitle = NULL;
3071
3072 if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEA_V1_SIZE && ppsp->pfnCallback)
3073 ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
3074
3075 return (HPROPSHEETPAGE)ppsp;
3076}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
PVOID Alloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: main.c:63
#define NULL
Definition: types.h:112
static WCHAR * heap_strdupAtoW(const char *str)
Definition: propsheet.c:186
static LPWSTR load_string(HINSTANCE instance, LPCWSTR str)
Definition: propsheet.c:2949
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
#define PSP_USEICONID
Definition: prsht.h:25
#define PROPSHEETPAGEA_V1_SIZE
Definition: prsht.h:209
#define PSPCB_ADDREF
Definition: prsht.h:171
#define PSP_USETITLE
Definition: prsht.h:26
#define PSP_USECALLBACK
Definition: prsht.h:30
#define PSP_DLGINDIRECT
Definition: prsht.h:23
DWORD dwFlags
Definition: prsht.h:178
LPCSTR pszTemplate
Definition: prsht.h:181
LPCSTR pszIcon
Definition: prsht.h:186
DWORD dwSize
Definition: prsht.h:177
LPCSTR pszTitle
Definition: prsht.h:188
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPCWSTR pszIcon
Definition: prsht.h:223
LPCWSTR pszTemplate
Definition: prsht.h:218
LPCWSTR pszTitle
Definition: prsht.h:225
HINSTANCE hInstance
Definition: prsht.h:216
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by init_functions(), PropertySheetA(), and WINHELP_CreateIndexWindow().

◆ CreatePropertySheetPageW()

HPROPSHEETPAGE WINAPI CreatePropertySheetPageW ( LPCPROPSHEETPAGEW  lpPropSheetPage)

Definition at line 3083 of file propsheet.c.

3084{
3085 PROPSHEETPAGEW *ppsp;
3086
3087 if (lpPropSheetPage->dwSize < PROPSHEETPAGEW_V1_SIZE)
3088 return NULL;
3089
3090 /* original data is used for callback notifications */
3091 if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
3092 {
3093 ppsp = Alloc(2 * sizeof(*ppsp));
3094 memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
3095 memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
3096 }
3097 else
3098 {
3099 ppsp = Alloc(sizeof(*ppsp));
3100 memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
3101 }
3102
3104
3105 if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
3106 {
3107 if (!IS_INTRESOURCE( ppsp->u.pszTemplate ))
3108 ppsp->u.pszTemplate = heap_strdupW( lpPropSheetPage->u.pszTemplate );
3109 }
3110
3111 if ( ppsp->dwFlags & PSP_USEICONID )
3112 {
3113 if (!IS_INTRESOURCE( ppsp->u2.pszIcon ))
3114 ppsp->u2.pszIcon = heap_strdupW( lpPropSheetPage->u2.pszIcon );
3115 }
3116
3117 if (ppsp->dwFlags & PSP_USETITLE)
3118 ppsp->pszTitle = load_string( ppsp->hInstance, ppsp->pszTitle );
3119 else
3120 ppsp->pszTitle = NULL;
3121
3122 if (ppsp->dwFlags & PSP_HIDEHEADER)
3123 ppsp->dwFlags &= ~(PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE);
3124
3125 if (ppsp->dwFlags & PSP_USEHEADERTITLE)
3126 ppsp->pszHeaderTitle = load_string( ppsp->hInstance, ppsp->pszHeaderTitle );
3127 else
3128 ppsp->pszHeaderTitle = NULL;
3129
3130 if (ppsp->dwFlags & PSP_USEHEADERSUBTITLE)
3131 ppsp->pszHeaderSubTitle = load_string( ppsp->hInstance, ppsp->pszHeaderSubTitle );
3132 else
3133 ppsp->pszHeaderSubTitle = NULL;
3134
3135 if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEW_V1_SIZE && ppsp->pfnCallback)
3136 ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
3137
3138 return (HPROPSHEETPAGE)ppsp;
3139}
#define PSP_INTERNAL_UNICODE
Definition: propsheet.c:146
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: propsheet.c:178
#define PROPSHEETPAGEW_V1_SIZE
Definition: prsht.h:246

Referenced by BtrfsPropSheet::AddPages(), BtrfsVolPropSheet::AddPages(), init_functions(), InitializePropertySheetPage(), NetPropPageProvider(), OleCreatePropertyFrameIndirect(), ParallelPortPropPageProvider(), PropertySheetW(), PS2MousePropPageProvider(), SerialPortPropPageProvider(), and SH_CreatePropertySheetPage().

◆ DestroyPropertySheetPage()

BOOL WINAPI DestroyPropertySheetPage ( HPROPSHEETPAGE  hPropPage)

Definition at line 3152 of file propsheet.c.

3153{
3154 PROPSHEETPAGEW *psp = (PROPSHEETPAGEW *)hPropPage;
3155
3156 if (!psp)
3157 return FALSE;
3158
3159 if ((psp->dwFlags & PSP_USECALLBACK) && psp->pfnCallback)
3160 psp->pfnCallback(0, PSPCB_RELEASE, psp + 1);
3161
3162 if (!(psp->dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE( psp->u.pszTemplate ))
3163 Free ((LPVOID)psp->u.pszTemplate);
3164
3165 if ((psp->dwFlags & PSP_USEICONID) && !IS_INTRESOURCE( psp->u2.pszIcon ))
3166 Free ((LPVOID)psp->u2.pszIcon);
3167
3168 if ((psp->dwFlags & PSP_USETITLE) && !IS_INTRESOURCE( psp->pszTitle ))
3169 Free ((LPVOID)psp->pszTitle);
3170
3171 if ((psp->dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE( psp->pszHeaderTitle ))
3172 Free ((LPVOID)psp->pszHeaderTitle);
3173
3174 if ((psp->dwFlags & PSP_USEHEADERSUBTITLE) && !IS_INTRESOURCE( psp->pszHeaderSubTitle ))
3175 Free ((LPVOID)psp->pszHeaderSubTitle);
3176
3177 Free(hPropPage);
3178
3179 return TRUE;
3180}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define PSPCB_RELEASE
Definition: prsht.h:37
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:815

Referenced by AddNetIdPage(), CNetConnectionPropertyUi::AddPages(), CVfdShExt::AddPages(), CLayerUIPropPage::AddPages(), BtrfsPropSheet::AddPages(), BtrfsVolPropSheet::AddPages(), INetCfgComponentPropertyUi_fnMergePropPages(), init_functions(), NetPropPageProvider(), ParallelPortPropPageProvider(), PropertySheetA(), PropertySheetW(), PROPSHEET_CleanUp(), PROPSHEET_RemovePage(), PropSheetExtProc(), PS2MousePropPageProvider(), and SerialPortPropPageProvider().

◆ do_loop()

static INT do_loop ( const PropSheetInfo psInfo)
static

Definition at line 2794 of file propsheet.c.

2795{
2796 MSG msg;
2797 INT ret = -1;
2798 HWND hwnd = psInfo->hwnd;
2799 HWND parent = psInfo->ppshheader.hwndParent;
2800
2801 while(IsWindow(hwnd) && !psInfo->ended && (ret = GetMessageW(&msg, NULL, 0, 0)))
2802 {
2803 if(ret == -1)
2804 break;
2805
2806#ifdef __REACTOS__
2808#else
2809 if(!IsDialogMessageW(hwnd, &msg))
2810#endif
2811 {
2814 }
2815 }
2816
2817 if(ret == 0)
2818 {
2819 PostQuitMessage(msg.wParam);
2820 ret = -1;
2821 }
2822
2823 if(ret != -1)
2824 ret = psInfo->result;
2825
2826 if(parent)
2828
2830 return ret;
2831}
#define msg(x)
Definition: auth_time.c:54
static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg)
Definition: propsheet.c:3185
r parent
Definition: btrfs.c:3010
HWND hwndParent
Definition: prsht.h:295
PROPSHEETHEADERW ppshheader
Definition: propsheet.c:111
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT
Definition: typedefs.h:58
int ret
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
BOOL WINAPI IsWindow(_In_opt_ HWND)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI IsDialogMessageW(_In_ HWND, _In_ LPMSG)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by PROPSHEET_PropertySheet(), and winetest_loop_todo().

◆ GetTemplateSize()

static UINT GetTemplateSize ( const DLGTEMPLATE pTemplate)
static

Definition at line 1209 of file propsheet.c.

1211{
1212 const WORD* p = (const WORD *)pTemplate;
1213 BOOL istemplateex = (((const MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF);
1214 WORD nrofitems;
1215 UINT ret;
1216
1217 if (istemplateex)
1218 {
1219 /* DLGTEMPLATEEX (not defined in any std. header file) */
1220
1221 TRACE("is DLGTEMPLATEEX\n");
1222 p++; /* dlgVer */
1223 p++; /* signature */
1224 p += 2; /* help ID */
1225 p += 2; /* ext style */
1226 p += 2; /* style */
1227 }
1228 else
1229 {
1230 /* DLGTEMPLATE */
1231
1232 TRACE("is DLGTEMPLATE\n");
1233 p += 2; /* style */
1234 p += 2; /* ext style */
1235 }
1236
1237 nrofitems = (WORD)*p; p++; /* nb items */
1238 p++; /* x */
1239 p++; /* y */
1240 p++; /* width */
1241 p++; /* height */
1242
1243 /* menu */
1244 switch ((WORD)*p)
1245 {
1246 case 0x0000:
1247 p++;
1248 break;
1249 case 0xffff:
1250 p += 2;
1251 break;
1252 default:
1253 TRACE("menu %s\n",debugstr_w( p ));
1254 p += lstrlenW( p ) + 1;
1255 break;
1256 }
1257
1258 /* class */
1259 switch ((WORD)*p)
1260 {
1261 case 0x0000:
1262 p++;
1263 break;
1264 case 0xffff:
1265 p += 2; /* 0xffff plus predefined window class ordinal value */
1266 break;
1267 default:
1268 TRACE("class %s\n",debugstr_w( p ));
1269 p += lstrlenW( p ) + 1;
1270 break;
1271 }
1272
1273 /* title */
1274 TRACE("title %s\n",debugstr_w( p ));
1275 p += lstrlenW( p ) + 1;
1276
1277 /* font, if DS_SETFONT set */
1278 if ((DS_SETFONT & ((istemplateex)? ((const MyDLGTEMPLATEEX*)pTemplate)->style :
1279 pTemplate->style)))
1280 {
1281 p+=(istemplateex)?3:1;
1282 TRACE("font %s\n",debugstr_w( p ));
1283 p += lstrlenW( p ) + 1; /* the font name */
1284 }
1285
1286 /* now process the DLGITEMTEMPLATE(EX) structs (plus custom data)
1287 * that are following the DLGTEMPLATE(EX) data */
1288 TRACE("%d items\n",nrofitems);
1289 while (nrofitems > 0)
1290 {
1291 p = (WORD*)(((DWORD_PTR)p + 3) & ~3); /* DWORD align */
1292
1293 /* skip header */
1294 p += (istemplateex ? sizeof(MyDLGITEMTEMPLATEEX) : sizeof(DLGITEMTEMPLATE))/sizeof(WORD);
1295
1296 /* check class */
1297 switch ((WORD)*p)
1298 {
1299 case 0x0000:
1300 p++;
1301 break;
1302 case 0xffff:
1303 TRACE("class ordinal 0x%08x\n",*(const DWORD*)p);
1304 p += 2;
1305 break;
1306 default:
1307 TRACE("class %s\n",debugstr_w( p ));
1308 p += lstrlenW( p ) + 1;
1309 break;
1310 }
1311
1312 /* check title text */
1313 switch ((WORD)*p)
1314 {
1315 case 0x0000:
1316 p++;
1317 break;
1318 case 0xffff:
1319 TRACE("text ordinal 0x%08x\n",*(const DWORD*)p);
1320 p += 2;
1321 break;
1322 default:
1323 TRACE("text %s\n",debugstr_w( p ));
1324 p += lstrlenW( p ) + 1;
1325 break;
1326 }
1327 p += *p / sizeof(WORD) + 1; /* Skip extra data */
1328 --nrofitems;
1329 }
1330
1331 ret = (p - (const WORD*)pTemplate) * sizeof(WORD);
1332 TRACE("%p %p size 0x%08x\n", p, pTemplate, ret);
1333 return ret;
1334}
Arabic default style
Definition: afstyles.h:94
#define lstrlenW
Definition: compat.h:750
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLfloat GLfloat p
Definition: glext.h:8902
#define debugstr_w
Definition: kernel32.h:32
unsigned int UINT
Definition: ndis.h:50
#define TRACE(s)
Definition: solgame.cpp:4
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define DS_SETFONT
Definition: winuser.h:378

Referenced by PROPSHEET_CreatePage().

◆ heap_strdupAtoW()

static WCHAR * heap_strdupAtoW ( const char str)
static

Definition at line 186 of file propsheet.c.

187{
188 WCHAR *ret;
189 INT len;
190
191 len = MultiByteToWideChar(CP_ACP, 0, str, -1, 0, 0);
192 ret = Alloc(len * sizeof(WCHAR));
194
195 return ret;
196}
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
const WCHAR * str
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CreatePropertySheetPageA(), PROPSHEET_SetHeaderSubTitleA(), and PROPSHEET_SetHeaderTitleA().

◆ heap_strdupW()

static WCHAR * heap_strdupW ( const WCHAR str)
static

Definition at line 178 of file propsheet.c.

179{
180 int len = strlenW(str) + 1;
181 WCHAR *ret = Alloc(len * sizeof(WCHAR));
182 strcpyW(ret, str);
183 return ret;
184}
#define strlenW(s)
Definition: unicode.h:34
#define strcpyW(d, s)
Definition: unicode.h:35

Referenced by add_prop(), alloc_global_prop(), alloc_prop(), alloc_vbscode(), APPINFO_SetOption(), BPInternetProtocolSink_ReportProgress(), BPInternetProtocolSink_ReportResult(), cache_authorization(), cache_basic_authorization(), cache_containers_add(), cache_file_available(), create_channelbsc(), create_class_object(), create_req_file(), create_signature_columns_and_data(), create_table(), CreatePropertySheetPageW(), dispid_from_elem_name(), DownloadBSC_Create(), DownloadBSC_OnProgress(), fill_cdromdrive(), fill_diskdrive(), fill_diskpartition(), fill_logicaldisk(), fill_networkadapter(), fill_networkadapterconfig(), fill_operatingsystem(), fill_pnpentity(), fill_printer(), fill_process(), fill_processor(), fill_service(), fill_sid(), fill_videocontroller(), fix_url_value(), FTP_Connect(), FTP_FtpOpenFileW(), FtpCreateDirectoryW(), FtpDeleteFileW(), FtpFindFirstFileW(), FtpGetFileW(), FtpOpenFileW(), FtpPutFileW(), FtpRemoveDirectoryW(), FtpRenameFileW(), FtpSetCurrentDirectoryW(), get_accountname(), get_baseboard_manufacturer(), get_baseboard_product(), get_baseboard_serialnumber(), get_baseboard_version(), get_bios_manufacturer(), get_bios_releasedate(), get_bios_smbiosbiosversion(), get_cmdline(), get_compsysproduct_identifyingnumber(), get_compsysproduct_name(), get_compsysproduct_uuid(), get_compsysproduct_vendor(), get_compsysproduct_version(), get_defaultipgateway(), get_diskdrivetodiskpartition_pairs(), get_dnshostname(), get_dnsserversearchorder(), get_dynamic_prop(), get_filesystem(), get_host_header(), get_ipaddress(), get_ipsubnet(), get_logicaldisktopartition_pairs(), get_referenceddomainname(), get_settingid(), get_systemenclosure_manufacturer(), get_useragent(), get_volumename(), get_volumeserialnumber(), HTMLDOMAttribute_Create(), HTMLElement_clone(), HTMLStyle_put_filter(), HTTP_Connect(), HTTP_DoAuthorization(), HTTP_FixURL(), HTTP_GetResponseHeaders(), HTTP_HttpEndRequestW(), HTTP_HttpOpenRequestW(), HTTP_HttpSendRequestW(), HTTP_InsertCustomHeader(), HTTP_ProcessCookies(), HTTPREQ_SetOption(), HTTPSESSION_SetOption(), init_code(), INTERNET_LoadProxySettings(), INTERNET_SendCallback(), InternetOpenUrlW(), InternetOpenW(), InternetProtocolSink_ReportProgress(), InternetSession_RegisterMimeFilter(), InternetSetOptionW(), is_basic_auth_value(), JScript_AddNamedItem(), MetadataQueryReader_CreateInstance(), mime_available(), MonikerProp_PutProperty(), parse_event_elem(), parse_proxy_url(), PROPSHEET_CollectPageInfo(), PROPSHEET_CollectSheetInfoW(), PROPSHEET_SetHeaderSubTitleW(), PROPSHEET_SetHeaderTitleW(), ProtocolSinkHandler_ReportData(), query_global_option(), register_namespace(), retrieve_cached_authorization(), set_dochost_url(), to_array(), to_longlong(), update_travellog(), VBScript_AddNamedItem(), wbem_services_ExecNotificationQueryAsync(), wbem_services_ExecQueryAsync(), WbemQualifierSet_create(), WbemServices_create(), and WININET_SetAuthorization().

◆ load_string()

static LPWSTR load_string ( HINSTANCE  instance,
LPCWSTR  str 
)
static

Definition at line 2949 of file propsheet.c.

2950{
2951 LPWSTR ret;
2952
2953 if (IS_INTRESOURCE(str))
2954 {
2955 HRSRC hrsrc;
2956 HGLOBAL hmem;
2957 WCHAR *ptr;
2958 WORD i, id = LOWORD(str);
2959 UINT len;
2960
2961 if (!(hrsrc = FindResourceW( instance, MAKEINTRESOURCEW((id >> 4) + 1), (LPWSTR)RT_STRING )))
2962 return NULL;
2963 if (!(hmem = LoadResource( instance, hrsrc ))) return NULL;
2964 if (!(ptr = LockResource( hmem ))) return NULL;
2965 for (i = id & 0x0f; i > 0; i--) ptr += *ptr + 1;
2966 len = *ptr;
2967 if (!len) return NULL;
2968 ret = Alloc( (len + 1) * sizeof(WCHAR) );
2969 if (ret)
2970 {
2971 memcpy( ret, ptr + 1, len * sizeof(WCHAR) );
2972 ret[len] = 0;
2973 }
2974 }
2975 else
2976 {
2977 int len = (strlenW(str) + 1) * sizeof(WCHAR);
2978 ret = Alloc( len );
2979 if (ret) memcpy( ret, str, len );
2980 }
2981 return ret;
2982}
static HINSTANCE instance
Definition: main.c:40
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static PVOID ptr
Definition: dispmode.c:27
#define LOWORD(l)
Definition: pedump.c:82
#define RT_STRING
Definition: pedump.c:368
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by CreatePropertySheetPageA(), and CreatePropertySheetPageW().

◆ PropertySheetA()

INT_PTR WINAPI PropertySheetA ( LPCPROPSHEETHEADERA  lppsh)

Definition at line 2872 of file propsheet.c.

2873{
2874 PropSheetInfo* psInfo = GlobalAlloc(GPTR, sizeof(PropSheetInfo));
2875 UINT i, n;
2876 const BYTE* pByte;
2877
2878 TRACE("(%p)\n", lppsh);
2879
2880 PROPSHEET_CollectSheetInfoA(lppsh, psInfo);
2881
2882 psInfo->proppage = Alloc(sizeof(PropPageInfo) * lppsh->nPages);
2883 pByte = (const BYTE*) psInfo->ppshheader.u3.ppsp;
2884
2885 for (n = i = 0; i < lppsh->nPages; i++, n++)
2886 {
2887 if (!psInfo->usePropPage)
2888 psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i];
2889 else
2890 {
2892 pByte += ((LPCPROPSHEETPAGEA)pByte)->dwSize;
2893 }
2894
2896 psInfo, n, TRUE))
2897 {
2898 if (psInfo->usePropPage)
2900 n--;
2901 psInfo->nPages--;
2902 }
2903 }
2904
2905 return PROPSHEET_PropertySheet(psInfo, FALSE);
2906}
static void PROPSHEET_CollectSheetInfoA(LPCPROPSHEETHEADERA lppsh, PropSheetInfo *psInfo)
Definition: propsheet.c:317
static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp, PropSheetInfo *psInfo, int index, BOOL resize)
Definition: propsheet.c:399
static INT_PTR PROPSHEET_PropertySheet(PropSheetInfo *psInfo, BOOL unicode)
Definition: propsheet.c:2838
HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(LPCPROPSHEETPAGEA lpPropSheetPage)
Definition: propsheet.c:2999
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3152
GLdouble n
Definition: glext.h:7729
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define for
Definition: utility.h:88
const PROPSHEETPAGEA * LPCPROPSHEETPAGEA
Definition: prsht.h:208
LPCPROPSHEETPAGEW ppsp
Definition: prsht.h:308
HPROPSHEETPAGE * phpage
Definition: prsht.h:309
HPROPSHEETPAGE hpage
Definition: propsheet.c:99
PropPageInfo * proppage
Definition: propsheet.c:123
#define GPTR
Definition: winbase.h:296
unsigned char BYTE
Definition: xxhash.c:193

Referenced by init_functions(), and WINHELP_CreateIndexWindow().

◆ PropertySheetW()

INT_PTR WINAPI PropertySheetW ( LPCPROPSHEETHEADERW  lppsh)

Definition at line 2913 of file propsheet.c.

2914{
2915 PropSheetInfo* psInfo = GlobalAlloc(GPTR, sizeof(PropSheetInfo));
2916 UINT i, n;
2917 const BYTE* pByte;
2918
2919 TRACE("(%p)\n", lppsh);
2920
2921 PROPSHEET_CollectSheetInfoW(lppsh, psInfo);
2922
2923 psInfo->proppage = Alloc(sizeof(PropPageInfo) * lppsh->nPages);
2924 pByte = (const BYTE*) psInfo->ppshheader.u3.ppsp;
2925
2926 for (n = i = 0; i < lppsh->nPages; i++, n++)
2927 {
2928 if (!psInfo->usePropPage)
2929 psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i];
2930 else
2931 {
2933 pByte += ((LPCPROPSHEETPAGEW)pByte)->dwSize;
2934 }
2935
2937 psInfo, n, TRUE))
2938 {
2939 if (psInfo->usePropPage)
2941 n--;
2942 psInfo->nPages--;
2943 }
2944 }
2945
2946 return PROPSHEET_PropertySheet(psInfo, TRUE);
2947}
static void PROPSHEET_CollectSheetInfoW(LPCPROPSHEETHEADERW lppsh, PropSheetInfo *psInfo)
Definition: propsheet.c:361
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3083
const PROPSHEETPAGEW * LPCPROPSHEETPAGEW
Definition: prsht.h:245

Referenced by Applet(), CreatePropSheet(), CustomizeLocalePropertySheet(), dialog_viewproperties(), display_cpl_sheets(), EventLogProperties(), INetCfgComponent_fnRaisePropertyUi(), InitApplet(), LaunchAdvancedTcpipSettings(), MmSysApplet(), OleCreatePropertyFrameIndirect(), PropSheetThread(), CZipExtract::runWizard(), SH_ShowPropertiesDialog(), SH_ShowRecycleBinProperties(), show_cert_dialog(), show_edit_cert_properties_dialog(), show_export_ui(), show_import_ui(), ShowAudioPropertySheet(), ShowDrivePropThreadProc(), ShowFolderOptionsDialogThreadProc(), ShowFullControlPanel(), ShowNetConnectionProperties(), ShowPropSheetW(), ShowStatusPropertyDialog(), SpeakerVolume(), SystemApplet(), and wmain().

◆ PROPSHEET_AddPage()

static BOOL PROPSHEET_AddPage ( HWND  hwndDlg,
HPROPSHEETPAGE  hpage 
)
static

Definition at line 2342 of file propsheet.c.

2343{
2344 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2345 TRACE("hwndDlg %p, hpage %p\n", hwndDlg, hpage);
2346 return PROPSHEET_InsertPage(hwndDlg, UlongToPtr(psInfo->nPages), hpage);
2347}
static const WCHAR PropSheetInfoStr[]
Definition: propsheet.c:143
static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage)
Definition: propsheet.c:2248
#define UlongToPtr(u)
Definition: config.h:106
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_AdjustButtons()

static BOOL PROPSHEET_AdjustButtons ( HWND  hwndParent,
const PropSheetInfo psInfo 
)
static

Definition at line 839 of file propsheet.c.

840{
841 HWND hwndButton = GetDlgItem(hwndParent, IDOK);
842 RECT rcSheet;
843 int x, y;
844 int num_buttons = 2;
845 int buttonWidth, buttonHeight;
847
848 if (psInfo->hasApply)
849 num_buttons++;
850
851 if (psInfo->hasHelp)
852 num_buttons++;
853
854 /*
855 * Obtain the size of the buttons.
856 */
857 GetClientRect(hwndButton, &rcSheet);
858 buttonWidth = rcSheet.right;
859 buttonHeight = rcSheet.bottom;
860
861 /*
862 * Get the size of the property sheet.
863 */
864 GetClientRect(hwndParent, &rcSheet);
865
866 /*
867 * All buttons will be at this y coordinate.
868 */
869 y = rcSheet.bottom - (padding.y + buttonHeight);
870
871 /*
872 * Position OK button and make it default.
873 */
874 hwndButton = GetDlgItem(hwndParent, IDOK);
875
876 x = rcSheet.right - ((padding.x + buttonWidth) * num_buttons);
877
878 SetWindowPos(hwndButton, 0, x, y, 0, 0,
880
882
883
884 /*
885 * Position Cancel button.
886 */
887 hwndButton = GetDlgItem(hwndParent, IDCANCEL);
888
889 x += padding.x + buttonWidth;
890
891 SetWindowPos(hwndButton, 0, x, y, 0, 0,
893
894 /*
895 * Position Apply button.
896 */
898
899 if(psInfo->hasApply)
900 x += padding.x + buttonWidth;
901 else
902 ShowWindow(hwndButton, SW_HIDE);
903
904 SetWindowPos(hwndButton, 0, x, y, 0, 0,
906 EnableWindow(hwndButton, FALSE);
907
908 /*
909 * Position Help button.
910 */
911 hwndButton = GetDlgItem(hwndParent, IDHELP);
912
913 x += padding.x + buttonWidth;
914 SetWindowPos(hwndButton, 0, x, y, 0, 0,
916
917 if(!psInfo->hasHelp)
918 ShowWindow(hwndButton, SW_HIDE);
919
920 return TRUE;
921}
#define IDC_APPLY_BUTTON
Definition: comctl32.h:54
static HWND hwndParent
Definition: cryptui.c:300
static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg)
Definition: propsheet.c:1055
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
static const DWORD padding[]
Definition: mciwnd.c:89
#define IDHELP
Definition: resource_2.h:8
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
#define SW_HIDE
Definition: winuser.h:768
#define SWP_NOACTIVATE
Definition: winuser.h:1242
#define DM_SETDEFID
Definition: winuser.h:2099
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define IDCANCEL
Definition: winuser.h:831
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOSIZE
Definition: winuser.h:1245
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:830
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define SWP_NOZORDER
Definition: winuser.h:1247
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_AdjustButtonsWizard()

static BOOL PROPSHEET_AdjustButtonsWizard ( HWND  hwndParent,
const PropSheetInfo psInfo 
)
static

Definition at line 928 of file propsheet.c.

930{
931 HWND hwndButton = GetDlgItem(hwndParent, IDCANCEL);
934 RECT rcSheet;
935 int x, y;
936 int num_buttons = 3;
937 int buttonWidth, buttonHeight, lineHeight, lineWidth;
939
940 if (psInfo->hasHelp)
941 num_buttons++;
942 if (psInfo->hasFinish)
943 num_buttons++;
944
945 /*
946 * Obtain the size of the buttons.
947 */
948 GetClientRect(hwndButton, &rcSheet);
949 buttonWidth = rcSheet.right;
950 buttonHeight = rcSheet.bottom;
951
952 GetClientRect(hwndLine, &rcSheet);
953 lineHeight = rcSheet.bottom;
954
955 /*
956 * Get the size of the property sheet.
957 */
958 GetClientRect(hwndParent, &rcSheet);
959
960 /*
961 * All buttons will be at this y coordinate.
962 */
963 y = rcSheet.bottom - (padding.y + buttonHeight);
964
965 /*
966 * Position the Back button.
967 */
969
970 x = rcSheet.right - ((padding.x + buttonWidth) * (num_buttons - 1)) - buttonWidth;
971
972 SetWindowPos(hwndButton, 0, x, y, 0, 0,
974
975 /*
976 * Position the Next button.
977 */
979
980 x += buttonWidth;
981
982 SetWindowPos(hwndButton, 0, x, y, 0, 0,
984
985 /*
986 * Position the Finish button.
987 */
989
990 if (psInfo->hasFinish)
991 x += padding.x + buttonWidth;
992
993 SetWindowPos(hwndButton, 0, x, y, 0, 0,
995
996 if (!psInfo->hasFinish)
997 ShowWindow(hwndButton, SW_HIDE);
998
999 /*
1000 * Position the Cancel button.
1001 */
1002 hwndButton = GetDlgItem(hwndParent, IDCANCEL);
1003
1004 x += padding.x + buttonWidth;
1005
1006 SetWindowPos(hwndButton, 0, x, y, 0, 0,
1008
1009 /*
1010 * Position Help button.
1011 */
1012 hwndButton = GetDlgItem(hwndParent, IDHELP);
1013
1014 if (psInfo->hasHelp)
1015 {
1016 x += padding.x + buttonWidth;
1017
1018 SetWindowPos(hwndButton, 0, x, y, 0, 0,
1020 }
1021 else
1022 ShowWindow(hwndButton, SW_HIDE);
1023
1024 if (psInfo->ppshheader.dwFlags &
1025 (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE))
1026 padding.x = 0;
1027
1028 /*
1029 * Position and resize the sunken line.
1030 */
1031 x = padding.x;
1032 y = rcSheet.bottom - ((padding.y * 2) + buttonHeight + lineHeight);
1033
1034 lineWidth = rcSheet.right - (padding.x * 2);
1035 SetWindowPos(hwndLine, 0, x, y, lineWidth, 2,
1037
1038 /*
1039 * Position and resize the header sunken line.
1040 */
1041
1042 SetWindowPos(hwndLineHeader, 0, 0, 0, rcSheet.right, 2,
1044 if (!(psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)))
1045 ShowWindow(hwndLineHeader, SW_HIDE);
1046
1047 return TRUE;
1048}
#define IDC_NEXT_BUTTON
Definition: comctl32.h:56
#define IDC_SUNKEN_LINEHEADER
Definition: comctl32.h:59
#define IDC_FINISH_BUTTON
Definition: comctl32.h:57
#define IDC_BACK_BUTTON
Definition: comctl32.h:55
#define IDC_SUNKEN_LINE
Definition: comctl32.h:58
static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo *psInfo)
Definition: propsheet.c:1082
DWORD dwFlags
Definition: prsht.h:294
#define SWP_NOMOVE
Definition: winuser.h:1244

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_AdjustSize()

static BOOL PROPSHEET_AdjustSize ( HWND  hwndDlg,
PropSheetInfo psInfo 
)
static

Definition at line 723 of file propsheet.c.

724{
725 HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
726 HWND hwndButton = GetDlgItem(hwndDlg, IDOK);
727 RECT rc,tabRect;
728 int buttonHeight;
730 RECT units;
731 LONG style;
732
733 /* Get the height of buttons */
734 GetClientRect(hwndButton, &rc);
735 buttonHeight = rc.bottom;
736
737 /*
738 * Biggest page size.
739 */
740 SetRect(&rc, 0, 0, psInfo->width, psInfo->height);
741 MapDialogRect(hwndDlg, &rc);
742
743 /* retrieve the dialog units */
744 units.left = units.right = 4;
745 units.top = units.bottom = 8;
746 MapDialogRect(hwndDlg, &units);
747
748 /*
749 * Resize the tab control.
750 */
751 GetClientRect(hwndTabCtrl,&tabRect);
752
753 SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)&tabRect);
754
755 if ((rc.bottom - rc.top) < (tabRect.bottom - tabRect.top))
756 {
757 rc.bottom = rc.top + tabRect.bottom - tabRect.top;
758 psInfo->height = MulDiv((rc.bottom - rc.top),8,units.top);
759 }
760
761 if ((rc.right - rc.left) < (tabRect.right - tabRect.left))
762 {
763 rc.right = rc.left + tabRect.right - tabRect.left;
764 psInfo->width = MulDiv((rc.right - rc.left),4,units.left);
765 }
766
767 SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, TRUE, (LPARAM)&rc);
768
769 rc.right -= rc.left;
770 rc.bottom -= rc.top;
771 TRACE("setting tab %p, rc (0,0)-(%d,%d)\n",
772 hwndTabCtrl, rc.right, rc.bottom);
773 SetWindowPos(hwndTabCtrl, 0, 0, 0, rc.right, rc.bottom,
775
776 GetClientRect(hwndTabCtrl, &rc);
777
778 TRACE("tab client rc %s\n", wine_dbgstr_rect(&rc));
779
780 rc.right += (padding.x * 2);
781 rc.bottom += buttonHeight + (3 * padding.y);
782
783 style = GetWindowLongW(hwndDlg, GWL_STYLE);
784 if (!(style & WS_CHILD))
786
787 rc.right -= rc.left;
788 rc.bottom -= rc.top;
789
790 /*
791 * Resize the property sheet.
792 */
793 TRACE("setting dialog %p, rc (0,0)-(%d,%d)\n",
794 hwndDlg, rc.right, rc.bottom);
795 SetWindowPos(hwndDlg, 0, 0, 0, rc.right, rc.bottom,
797 return TRUE;
798}
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define IDC_TABCONTROL
Definition: comctl32.h:53
GLfloat units
Definition: glext.h:11727
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
#define WS_CHILD
Definition: pedump.c:617
long LONG
Definition: pedump.c:60
#define TCM_ADJUSTRECT
Definition: commctrl.h:4085
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
LONG_PTR LPARAM
Definition: windef.h:208
BOOL WINAPI MapDialogRect(_In_ HWND, _Inout_ LPRECT)
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
#define GWL_STYLE
Definition: winuser.h:852
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_AdjustSizeWizard()

static BOOL PROPSHEET_AdjustSizeWizard ( HWND  hwndDlg,
const PropSheetInfo psInfo 
)
static

Definition at line 805 of file propsheet.c.

806{
807 HWND hwndLine = GetDlgItem(hwndDlg, IDC_SUNKEN_LINE);
808 RECT rc, lineRect, dialogRect;
809
810 /* Biggest page size */
811 SetRect(&rc, 0, 0, psInfo->width, psInfo->height);
812 MapDialogRect(hwndDlg, &rc);
813
814 TRACE("Biggest page %s\n", wine_dbgstr_rect(&rc));
815
816 /* Add space for the buttons row */
817 GetWindowRect(hwndLine, &lineRect);
818 MapWindowPoints(NULL, hwndDlg, (LPPOINT)&lineRect, 2);
819 GetClientRect(hwndDlg, &dialogRect);
820 rc.bottom += dialogRect.bottom - lineRect.top - 1;
821
822 /* Convert the client coordinates to window coordinates */
824
825 /* Resize the property sheet */
826 TRACE("setting dialog %p, rc (0,0)-(%d,%d)\n",
827 hwndDlg, rc.right, rc.bottom);
828 SetWindowPos(hwndDlg, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
830
831 return TRUE;
832}
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_Apply()

static BOOL PROPSHEET_Apply ( HWND  hwndDlg,
LPARAM  lParam 
)
static

Definition at line 1707 of file propsheet.c.

1708{
1709 int i;
1710 HWND hwndPage;
1711 PSHNOTIFY psn;
1712 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1713
1714 TRACE("active_page %d\n", psInfo->active_page);
1715 if (psInfo->active_page < 0)
1716 return FALSE;
1717
1718 psn.hdr.hwndFrom = hwndDlg;
1719 psn.hdr.idFrom = 0;
1720 psn.lParam = 0;
1721
1722
1723 /*
1724 * Send PSN_KILLACTIVE to the current page.
1725 */
1726 psn.hdr.code = PSN_KILLACTIVE;
1727
1728 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1729
1730 if (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) != FALSE)
1731 return FALSE;
1732
1733 /*
1734 * Send PSN_APPLY to all pages.
1735 */
1736 psn.hdr.code = PSN_APPLY;
1737 psn.lParam = lParam;
1738
1739 for (i = 0; i < psInfo->nPages; i++)
1740 {
1741 hwndPage = psInfo->proppage[i].hwndPage;
1742 if (hwndPage)
1743 {
1744 switch (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))
1745 {
1746 case PSNRET_INVALID:
1747 PROPSHEET_ShowPage(hwndDlg, i, psInfo);
1748 /* fall through */
1750 return FALSE;
1751 }
1752 }
1753 }
1754
1755 if(lParam)
1756 {
1757 psInfo->activeValid = FALSE;
1758 }
1759 else if(psInfo->active_page >= 0)
1760 {
1761 psn.hdr.code = PSN_SETACTIVE;
1762 psn.lParam = 0;
1763 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1764 SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1765 }
1766
1767 return TRUE;
1768}
LPARAM lParam
Definition: combotst.c:139
static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo *psInfo)
Definition: propsheet.c:1523
#define PSNRET_INVALID_NOCHANGEPAGE
Definition: prsht.h:131
#define PSNRET_INVALID
Definition: prsht.h:130
#define PSN_KILLACTIVE
Definition: prsht.h:116
#define PSN_APPLY
Definition: prsht.h:117
#define PSN_SETACTIVE
Definition: prsht.h:115
#define WM_NOTIFY
Definition: richedit.h:61
LPARAM lParam
Definition: prsht.h:331
NMHDR hdr
Definition: prsht.h:330
UINT_PTR idFrom
Definition: winuser.h:3158
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157

Referenced by PROPSHEET_DialogProc(), and PROPSHEET_DoCommand().

◆ PROPSHEET_Back()

static BOOL PROPSHEET_Back ( HWND  hwndDlg)
static

Definition at line 1584 of file propsheet.c.

1585{
1586 PSHNOTIFY psn;
1587 HWND hwndPage;
1588 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1590 int idx;
1591
1592 TRACE("active_page %d\n", psInfo->active_page);
1593 if (psInfo->active_page < 0)
1594 return FALSE;
1595
1596 psn.hdr.code = PSN_WIZBACK;
1597 psn.hdr.hwndFrom = hwndDlg;
1598 psn.hdr.idFrom = 0;
1599 psn.lParam = 0;
1600
1601 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1602
1603 result = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1604 if (result == -1)
1605 return FALSE;
1606 else if (result == 0)
1607 idx = psInfo->active_page - 1;
1608 else
1610
1611 if (idx >= 0 && idx < psInfo->nPages)
1612 {
1613 if (PROPSHEET_CanSetCurSel(hwndDlg))
1614 {
1617 PROPSHEET_SetCurSel(hwndDlg, idx, -1, 0);
1618 }
1619 }
1620 return TRUE;
1621}
unsigned int idx
Definition: utils.c:41
static INT PROPSHEET_FindPageByResId(const PropSheetInfo *psInfo, LRESULT resId)
Definition: propsheet.c:274
static BOOL PROPSHEET_SetCurSel(HWND hwndDlg, int index, int skipdir, HPROPSHEETPAGE hpage)
Definition: propsheet.c:1982
static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg)
Definition: propsheet.c:1943
GLuint64EXT * result
Definition: glext.h:11304
#define PSN_WIZBACK
Definition: prsht.h:120
LONG_PTR LRESULT
Definition: windef.h:209
HWND WINAPI SetFocus(_In_opt_ HWND)

Referenced by PROPSHEET_DoCommand(), and PROPSHEET_PressButton().

◆ PROPSHEET_Cancel()

static void PROPSHEET_Cancel ( HWND  hwndDlg,
LPARAM  lParam 
)
static

Definition at line 1773 of file propsheet.c.

1774{
1775 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1776 HWND hwndPage;
1777 PSHNOTIFY psn;
1778 int i;
1779
1780 TRACE("active_page %d\n", psInfo->active_page);
1781 if (psInfo->active_page < 0)
1782 return;
1783
1784 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1785 psn.hdr.code = PSN_QUERYCANCEL;
1786 psn.hdr.hwndFrom = hwndDlg;
1787 psn.hdr.idFrom = 0;
1788 psn.lParam = 0;
1789
1790 if (SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))
1791 return;
1792
1793 psn.hdr.code = PSN_RESET;
1794 psn.lParam = lParam;
1795
1796 for (i = 0; i < psInfo->nPages; i++)
1797 {
1798 hwndPage = psInfo->proppage[i].hwndPage;
1799
1800 if (hwndPage)
1801 SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1802 }
1803
1804 if (psInfo->isModeless)
1805 {
1806 /* makes PSM_GETCURRENTPAGEHWND return NULL */
1807 psInfo->activeValid = FALSE;
1808 }
1809 else
1810 psInfo->ended = TRUE;
1811}
#define PSN_QUERYCANCEL
Definition: prsht.h:123
#define PSN_RESET
Definition: prsht.h:118

Referenced by PROPSHEET_DialogProc(), and PROPSHEET_DoCommand().

◆ PROPSHEET_CanSetCurSel()

static BOOL PROPSHEET_CanSetCurSel ( HWND  hwndDlg)
static

Definition at line 1943 of file propsheet.c.

1944{
1945 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1946 HWND hwndPage;
1947 PSHNOTIFY psn;
1948 BOOL res = FALSE;
1949
1950 if (!psInfo)
1951 {
1952 res = FALSE;
1953 goto end;
1954 }
1955
1956 TRACE("active_page %d\n", psInfo->active_page);
1957 if (psInfo->active_page < 0)
1958 {
1959 res = TRUE;
1960 goto end;
1961 }
1962
1963 /*
1964 * Notify the current page.
1965 */
1966 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1967 psn.hdr.code = PSN_KILLACTIVE;
1968 psn.hdr.hwndFrom = hwndDlg;
1969 psn.hdr.idFrom = 0;
1970 psn.lParam = 0;
1971
1972 res = !SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1973
1974end:
1975 TRACE("<-- %d\n", res);
1976 return res;
1977}
GLuint GLuint end
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613

Referenced by PROPSHEET_Back(), PROPSHEET_DialogProc(), PROPSHEET_IsDialogMessage(), PROPSHEET_Next(), and PROPSHEET_SetCurSelId().

◆ PROPSHEET_Changed()

static void PROPSHEET_Changed ( HWND  hwndDlg,
HWND  hwndDirtyPage 
)
static

Definition at line 1838 of file propsheet.c.

1839{
1840 int i;
1841 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1842
1843 TRACE("\n");
1844 if (!psInfo) return;
1845 /*
1846 * Set the dirty flag of this page.
1847 */
1848 for (i = 0; i < psInfo->nPages; i++)
1849 {
1850 if (psInfo->proppage[i].hwndPage == hwndDirtyPage)
1851 psInfo->proppage[i].isDirty = TRUE;
1852 }
1853
1854 /*
1855 * Enable the Apply button.
1856 */
1857 if (psInfo->hasApply)
1858 {
1859 HWND hwndApplyBtn = GetDlgItem(hwndDlg, IDC_APPLY_BUTTON);
1860
1861 EnableWindow(hwndApplyBtn, TRUE);
1862 }
1863}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_CleanUp()

static void PROPSHEET_CleanUp ( HWND  hwndDlg)
static

Definition at line 2738 of file propsheet.c.

2739{
2740 int i;
2741 PropSheetInfo* psInfo = RemovePropW(hwndDlg, PropSheetInfoStr);
2742
2743 TRACE("\n");
2744 if (!psInfo) return;
2745 if (!IS_INTRESOURCE(psInfo->ppshheader.pszCaption))
2746 Free ((LPVOID)psInfo->ppshheader.pszCaption);
2747
2748 for (i = 0; i < psInfo->nPages; i++)
2749 {
2750 PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[i].hpage;
2751
2752 /* Unsubclass the page dialog window */
2753 if((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
2754 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
2755 (psp->dwFlags & PSP_HIDEHEADER))
2756 {
2759 }
2760
2761 if(psInfo->proppage[i].hwndPage)
2762 DestroyWindow(psInfo->proppage[i].hwndPage);
2763
2764 if(psp)
2765 {
2766 if (psp->dwFlags & PSP_USETITLE)
2767 Free ((LPVOID)psInfo->proppage[i].pszText);
2768
2770 }
2771 }
2772
2773 DeleteObject(psInfo->hFont);
2774 DeleteObject(psInfo->hFontBold);
2775 /* If we created the bitmaps, destroy them */
2776 if ((psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
2777 (!(psInfo->ppshheader.dwFlags & PSH_USEHBMWATERMARK)) )
2778 DeleteObject(psInfo->ppshheader.u4.hbmWatermark);
2779 if ((psInfo->ppshheader.dwFlags & PSH_HEADER) &&
2780 (!(psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER)) )
2781 DeleteObject(psInfo->ppshheader.u5.hbmHeader);
2782
2783 Free(psInfo->proppage);
2784 Free(psInfo->strPropertiesFor);
2786
2787 GlobalFree(psInfo);
2788}
BOOL WINAPI RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uID)
Definition: commctrl.c:1390
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:928
static LRESULT CALLBACK PROPSHEET_WizardSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef)
Definition: propsheet.c:1187
pKey DeleteObject()
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
LPCWSTR pszCaption
Definition: prsht.h:301
LPCWSTR pszText
Definition: propsheet.c:102
HIMAGELIST hImageList
Definition: propsheet.c:128
LPWSTR strPropertiesFor
Definition: propsheet.c:113
HANDLE WINAPI RemovePropW(_In_ HWND, _In_ LPCWSTR)

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_CollectPageInfo()

static BOOL PROPSHEET_CollectPageInfo ( LPCPROPSHEETPAGEW  lppsp,
PropSheetInfo psInfo,
int  index,
BOOL  resize 
)
static

Definition at line 399 of file propsheet.c.

402{
403 const DLGTEMPLATE* pTemplate;
404 const WORD* p;
406 int width, height;
407
408 if (!lppsp)
409 return FALSE;
410
411 TRACE("\n");
412 psInfo->proppage[index].hpage = (HPROPSHEETPAGE)lppsp;
413 psInfo->proppage[index].hwndPage = 0;
414 psInfo->proppage[index].isDirty = FALSE;
415
416 /*
417 * Process property page flags.
418 */
419 dwFlags = lppsp->dwFlags;
420 psInfo->proppage[index].useCallback = (dwFlags & PSP_USECALLBACK) && (lppsp->pfnCallback);
423
424 /* as soon as we have a page with the help flag, set the sheet flag on */
425 if (psInfo->proppage[index].hasHelp)
426 psInfo->hasHelp = TRUE;
427
428 /*
429 * Process page template.
430 */
432 pTemplate = lppsp->u.pResource;
433 else if(dwFlags & PSP_INTERNAL_UNICODE )
434 {
435 HRSRC hResource = FindResourceW(lppsp->hInstance,
436 lppsp->u.pszTemplate,
438 HGLOBAL hTemplate = LoadResource(lppsp->hInstance,
439 hResource);
440 pTemplate = LockResource(hTemplate);
441 }
442 else
443 {
444 HRSRC hResource = FindResourceA(lppsp->hInstance,
445 (LPCSTR)lppsp->u.pszTemplate,
447 HGLOBAL hTemplate = LoadResource(lppsp->hInstance,
448 hResource);
449 pTemplate = LockResource(hTemplate);
450 }
451
452 /*
453 * Extract the size of the page and the caption.
454 */
455 if (!pTemplate)
456 return FALSE;
457
458 p = (const WORD *)pTemplate;
459
460 if (((const MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
461 {
462 /* DLGTEMPLATEEX (not defined in any std. header file) */
463
464 p++; /* dlgVer */
465 p++; /* signature */
466 p += 2; /* help ID */
467 p += 2; /* ext style */
468 p += 2; /* style */
469 }
470 else
471 {
472 /* DLGTEMPLATE */
473
474 p += 2; /* style */
475 p += 2; /* ext style */
476 }
477
478 p++; /* nb items */
479 p++; /* x */
480 p++; /* y */
481 width = (WORD)*p; p++;
482 height = (WORD)*p; p++;
483
484 if (lppsp->dwFlags & (PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE))
485 psInfo->ppshheader.dwFlags |= PSH_HEADER;
486
487 /* Special calculation for interior wizard pages so the largest page is
488 * calculated correctly. We need to add all the padding and space occupied
489 * by the header so the width and height sums up to the whole wizard client
490 * area. */
491 if ((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
492 (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
493 !(dwFlags & PSP_HIDEHEADER))
494 {
496 width += 2 * WIZARD_PADDING;
497 }
498 if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
499 {
500 height += 2 * WIZARD_PADDING;
501 width += 2 * WIZARD_PADDING;
502 }
503
504 /* remember the largest width and height */
505 if (resize)
506 {
507 if (width > psInfo->width)
508 psInfo->width = width;
509
510 if (height > psInfo->height)
511 psInfo->height = height;
512 }
513
514 /* menu */
515 switch ((WORD)*p)
516 {
517 case 0x0000:
518 p++;
519 break;
520 case 0xffff:
521 p += 2;
522 break;
523 default:
524 p += lstrlenW( p ) + 1;
525 break;
526 }
527
528 /* class */
529 switch ((WORD)*p)
530 {
531 case 0x0000:
532 p++;
533 break;
534 case 0xffff:
535 p += 2;
536 break;
537 default:
538 p += lstrlenW( p ) + 1;
539 break;
540 }
541
542 /* Extract the caption */
543 psInfo->proppage[index].pszText = p;
544 TRACE("Tab %d %s\n",index,debugstr_w( p ));
545
546 if (dwFlags & PSP_USETITLE)
547 {
548 WCHAR szTitle[256];
549 const WCHAR *pTitle;
550 static const WCHAR pszNull[] = { '(','n','u','l','l',')',0 };
551
552 if (IS_INTRESOURCE( lppsp->pszTitle ))
553 {
555 pTitle = szTitle;
556 else if (*p)
557 pTitle = p;
558 else
559 pTitle = pszNull;
560 }
561 else
562 pTitle = lppsp->pszTitle;
563
564 psInfo->proppage[index].pszText = heap_strdupW( pTitle );
565 }
566
567 /*
568 * Build the image list for icons
569 */
571 {
572 HICON hIcon;
573 int icon_cx = GetSystemMetrics(SM_CXSMICON);
574 int icon_cy = GetSystemMetrics(SM_CYSMICON);
575
577 hIcon = LoadImageW(lppsp->hInstance, lppsp->u2.pszIcon, IMAGE_ICON,
578 icon_cx, icon_cy, LR_DEFAULTCOLOR);
579 else
580 hIcon = lppsp->u2.hIcon;
581
582 if ( hIcon )
583 {
584 if (psInfo->hImageList == 0 )
585 psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1);
586
588 }
589
590 }
591
592 return TRUE;
593}
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:33
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
#define WIZARD_HEADER_HEIGHT
Definition: propsheet.c:156
#define WIZARD_PADDING
Definition: propsheet.c:155
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint index
Definition: glext.h:6031
if(dx< 0)
Definition: linetemp.h:194
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
static HICON
Definition: imagelist.c:84
HICON hIcon
Definition: msconfig.c:44
#define RT_DIALOG
Definition: pedump.c:367
#define PSP_HASHELP
Definition: prsht.h:28
#define PSP_USEHICON
Definition: prsht.h:24
#define PSH_WIZARD
Definition: prsht.h:45
#define ImageList_AddIcon(himl, hicon)
Definition: commctrl.h:415
#define ILC_COLOR
Definition: commctrl.h:352
HICON hIcon
Definition: prsht.h:222
LPCDLGTEMPLATE pResource
Definition: prsht.h:219
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IMAGE_ICON
Definition: winuser.h:212
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2247
#define SM_CYSMICON
Definition: winuser.h:1013
#define SM_CXSMICON
Definition: winuser.h:1012
#define LR_DEFAULTCOLOR
Definition: winuser.h:1087
int WINAPI GetSystemMetrics(_In_ int)
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182

Referenced by PropertySheetA(), PropertySheetW(), and PROPSHEET_InsertPage().

◆ PROPSHEET_CollectSheetInfoA()

static void PROPSHEET_CollectSheetInfoA ( LPCPROPSHEETHEADERA  lppsh,
PropSheetInfo psInfo 
)
static

Definition at line 317 of file propsheet.c.

319{
320 DWORD dwSize = min(lppsh->dwSize,sizeof(PROPSHEETHEADERA));
321 DWORD dwFlags = lppsh->dwFlags;
322
323 psInfo->useCallback = (dwFlags & PSH_USECALLBACK )&& (lppsh->pfnCallback);
324
325 memcpy(&psInfo->ppshheader,lppsh,dwSize);
326 TRACE("\n** PROPSHEETHEADER **\ndwSize\t\t%d\ndwFlags\t\t%08x\nhwndParent\t%p\nhInstance\t%p\npszCaption\t'%s'\nnPages\t\t%d\npfnCallback\t%p\n",
327 lppsh->dwSize, lppsh->dwFlags, lppsh->hwndParent, lppsh->hInstance,
328 debugstr_a(lppsh->pszCaption), lppsh->nPages, lppsh->pfnCallback);
329
330 if (lppsh->dwFlags & INTRNL_ANY_WIZARD)
331 psInfo->ppshheader.pszCaption = NULL;
332 else
333 {
334 if (!IS_INTRESOURCE(lppsh->pszCaption))
335 {
336 int len = MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, NULL, 0);
337 WCHAR *caption = Alloc( len*sizeof (WCHAR) );
338
339 MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, caption, len);
340 psInfo->ppshheader.pszCaption = caption;
341 }
342 }
343 psInfo->nPages = lppsh->nPages;
344
346 {
347 TRACE("PSH_USEPSTARTPAGE is on\n");
348 psInfo->active_page = 0;
349 }
350 else
351 psInfo->active_page = lppsh->u2.nStartPage;
352
354}
#define INTRNL_ANY_WIZARD
Definition: propsheet.c:152
static void PROPSHEET_CollectSheetInfoCommon(PropSheetInfo *psInfo, DWORD dwFlags)
Definition: propsheet.c:295
#define debugstr_a
Definition: kernel32.h:31
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define PSH_USEPSTARTPAGE
Definition: prsht.h:46
#define PSH_USECALLBACK
Definition: prsht.h:48
DWORD dwFlags
Definition: prsht.h:259
PFNPROPSHEETCALLBACK pfnCallback
Definition: prsht.h:276
DWORD dwSize
Definition: prsht.h:258
HINSTANCE hInstance
Definition: prsht.h:261
HWND hwndParent
Definition: prsht.h:260
UINT nStartPage
Definition: prsht.h:269
LPCSTR pszCaption
Definition: prsht.h:266

Referenced by PropertySheetA().

◆ PROPSHEET_CollectSheetInfoCommon()

static void PROPSHEET_CollectSheetInfoCommon ( PropSheetInfo psInfo,
DWORD  dwFlags 
)
static

Definition at line 295 of file propsheet.c.

296{
298
299 psInfo->hasHelp = dwFlags & PSH_HASHELP;
300 psInfo->hasApply = !(dwFlags & PSH_NOAPPLYNOW);
302 psInfo->isModeless = dwFlags & PSH_MODELESS;
304 if (psInfo->active_page < 0 || psInfo->active_page >= psInfo->nPages)
305 psInfo->active_page = 0;
306
307 psInfo->result = 0;
308 psInfo->hImageList = 0;
309 psInfo->activeValid = FALSE;
310}
static VOID PROPSHEET_UnImplementedFlags(DWORD dwFlags)
Definition: propsheet.c:204
#define PSH_MODELESS
Definition: prsht.h:50
#define PSH_HASHELP
Definition: prsht.h:49
#define PSH_WIZARDHASFINISH
Definition: prsht.h:44
#define PSH_PROPSHEETPAGE
Definition: prsht.h:43
#define PSH_NOAPPLYNOW
Definition: prsht.h:47

Referenced by PROPSHEET_CollectSheetInfoA(), and PROPSHEET_CollectSheetInfoW().

◆ PROPSHEET_CollectSheetInfoW()

static void PROPSHEET_CollectSheetInfoW ( LPCPROPSHEETHEADERW  lppsh,
PropSheetInfo psInfo 
)
static

Definition at line 361 of file propsheet.c.

363{
364 DWORD dwSize = min(lppsh->dwSize,sizeof(PROPSHEETHEADERW));
365 DWORD dwFlags = lppsh->dwFlags;
366
367 psInfo->useCallback = (dwFlags & PSH_USECALLBACK) && (lppsh->pfnCallback);
368
369 memcpy(&psInfo->ppshheader,lppsh,dwSize);
370 TRACE("\n** PROPSHEETHEADER **\ndwSize\t\t%d\ndwFlags\t\t%08x\nhwndParent\t%p\nhInstance\t%p\npszCaption\t%s\nnPages\t\t%d\npfnCallback\t%p\n",
371 lppsh->dwSize, lppsh->dwFlags, lppsh->hwndParent, lppsh->hInstance, debugstr_w(lppsh->pszCaption), lppsh->nPages, lppsh->pfnCallback);
372
373 if (lppsh->dwFlags & INTRNL_ANY_WIZARD)
374 psInfo->ppshheader.pszCaption = NULL;
375 else
376 {
377 if (!IS_INTRESOURCE(lppsh->pszCaption))
378 psInfo->ppshheader.pszCaption = heap_strdupW( lppsh->pszCaption );
379 }
380 psInfo->nPages = lppsh->nPages;
381
383 {
384 TRACE("PSH_USEPSTARTPAGE is on\n");
385 psInfo->active_page = 0;
386 }
387 else
388 psInfo->active_page = lppsh->u2.nStartPage;
389
391}
HINSTANCE hInstance
Definition: prsht.h:296
DWORD dwSize
Definition: prsht.h:293
PFNPROPSHEETCALLBACK pfnCallback
Definition: prsht.h:311
UINT nStartPage
Definition: prsht.h:304

Referenced by PropertySheetW().

◆ PROPSHEET_CreateDialog()

static INT_PTR PROPSHEET_CreateDialog ( PropSheetInfo psInfo)
static

Definition at line 600 of file propsheet.c.

601{
602 LRESULT ret;
603 LPCVOID template;
604 LPVOID temp = 0;
605 HRSRC hRes;
606 DWORD resSize;
607 WORD resID = IDD_PROPSHEET;
608
609 TRACE("(%p)\n", psInfo);
611 resID = IDD_WIZARD;
612
613 if( psInfo->unicode )
614 {
616 MAKEINTRESOURCEW(resID),
617 (LPWSTR)RT_DIALOG)))
618 return -1;
619 }
620 else
621 {
623 MAKEINTRESOURCEA(resID),
624 (LPSTR)RT_DIALOG)))
625 return -1;
626 }
627
628 if(!(template = LoadResource(COMCTL32_hModule, hRes)))
629 return -1;
630
631 /*
632 * Make a copy of the dialog template.
633 */
634 resSize = SizeofResource(COMCTL32_hModule, hRes);
635
636 temp = Alloc(2 * resSize);
637
638 if (!temp)
639 return -1;
640
641 memcpy(temp, template, resSize);
642
643 if (psInfo->ppshheader.dwFlags & PSH_NOCONTEXTHELP)
644 {
645 if (((MyDLGTEMPLATEEX*)temp)->signature == 0xFFFF)
646 ((MyDLGTEMPLATEEX*)temp)->style &= ~DS_CONTEXTHELP;
647 else
649 }
650 if ((psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) &&
652 {
653 if (((MyDLGTEMPLATEEX*)temp)->signature == 0xFFFF)
654 ((MyDLGTEMPLATEEX*)temp)->style |= DS_CONTEXTHELP;
655 else
657 }
658
659 if (psInfo->useCallback)
661
662 /* NOTE: MSDN states "Returns a positive value if successful, or -1
663 * otherwise for modal property sheets.", but this is wrong. The
664 * actual return value is either TRUE (success), FALSE (cancel) or
665 * -1 (error). */
666 if( psInfo->unicode )
667 {
669 temp, psInfo->ppshheader.hwndParent,
671 if ( !ret ) ret = -1;
672 }
673 else
674 {
676 temp, psInfo->ppshheader.hwndParent,
678 if ( !ret ) ret = -1;
679 }
680
681 Free(temp);
682
683 return ret;
684}
#define IDD_WIZARD
Definition: comctl32.h:51
#define IDD_PROPSHEET
Definition: comctl32.h:50
HMODULE COMCTL32_hModule
Definition: commctrl.c:79
static INT_PTR CALLBACK PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: propsheet.c:3501
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
#define PSCB_PRECREATE
Definition: prsht.h:76
#define PSH_WIZARDCONTEXTHELP
Definition: prsht.h:52
static calc_node_t temp
Definition: rpn_ieee.c:38
int32_t INT_PTR
Definition: typedefs.h:64
CONST void * LPCVOID
Definition: windef.h:191
HWND WINAPI CreateDialogIndirectParamA(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
#define DS_CONTEXTHELP
Definition: winuser.h:371
HWND WINAPI CreateDialogIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)

Referenced by PROPSHEET_PropertySheet().

◆ PROPSHEET_CreatePage()

static BOOL PROPSHEET_CreatePage ( HWND  hwndParent,
int  index,
const PropSheetInfo psInfo,
LPCPROPSHEETPAGEW  ppshpage 
)
static

Definition at line 1344 of file propsheet.c.

1348{
1349 const DLGTEMPLATE* pTemplate;
1350 HWND hwndPage;
1351 DWORD resSize;
1352 DLGTEMPLATE* pTemplateCopy = NULL;
1353
1354 TRACE("index %d\n", index);
1355
1356 if (ppshpage == NULL)
1357 {
1358 return FALSE;
1359 }
1360
1361 if (ppshpage->dwFlags & PSP_DLGINDIRECT)
1362 {
1363 pTemplate = ppshpage->u.pResource;
1364 resSize = GetTemplateSize(pTemplate);
1365 }
1366 else if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE)
1367 {
1368 HRSRC hResource;
1369 HANDLE hTemplate;
1370
1371 hResource = FindResourceW(ppshpage->hInstance,
1372 ppshpage->u.pszTemplate,
1373 (LPWSTR)RT_DIALOG);
1374 if(!hResource)
1375 return FALSE;
1376
1377 resSize = SizeofResource(ppshpage->hInstance, hResource);
1378
1379 hTemplate = LoadResource(ppshpage->hInstance, hResource);
1380 if(!hTemplate)
1381 return FALSE;
1382
1383 pTemplate = LockResource(hTemplate);
1384 /*
1385 * Make a copy of the dialog template to make it writable
1386 */
1387 }
1388 else
1389 {
1390 HRSRC hResource;
1391 HANDLE hTemplate;
1392
1393 hResource = FindResourceA(ppshpage->hInstance,
1394 (LPCSTR)ppshpage->u.pszTemplate,
1395 (LPSTR)RT_DIALOG);
1396 if(!hResource)
1397 return FALSE;
1398
1399 resSize = SizeofResource(ppshpage->hInstance, hResource);
1400
1401 hTemplate = LoadResource(ppshpage->hInstance, hResource);
1402 if(!hTemplate)
1403 return FALSE;
1404
1405 pTemplate = LockResource(hTemplate);
1406 /*
1407 * Make a copy of the dialog template to make it writable
1408 */
1409 }
1410 pTemplateCopy = Alloc(resSize);
1411 if (!pTemplateCopy)
1412 return FALSE;
1413
1414 TRACE("copying pTemplate %p into pTemplateCopy %p (%d)\n", pTemplate, pTemplateCopy, resSize);
1415 memcpy(pTemplateCopy, pTemplate, resSize);
1416
1417 if (((MyDLGTEMPLATEEX*)pTemplateCopy)->signature == 0xFFFF)
1418 {
1419 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
1420 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~DS_MODALFRAME;
1421 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_CAPTION;
1422 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_SYSMENU;
1423 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_POPUP;
1424 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_DISABLED;
1425 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_VISIBLE;
1426 ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_THICKFRAME;
1427
1428 ((MyDLGTEMPLATEEX*)pTemplateCopy)->exStyle |= WS_EX_CONTROLPARENT;
1429 }
1430 else
1431 {
1432 pTemplateCopy->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
1433 pTemplateCopy->style &= ~DS_MODALFRAME;
1434 pTemplateCopy->style &= ~WS_CAPTION;
1435 pTemplateCopy->style &= ~WS_SYSMENU;
1436 pTemplateCopy->style &= ~WS_POPUP;
1437 pTemplateCopy->style &= ~WS_DISABLED;
1438 pTemplateCopy->style &= ~WS_VISIBLE;
1439 pTemplateCopy->style &= ~WS_THICKFRAME;
1440
1441 pTemplateCopy->dwExtendedStyle |= WS_EX_CONTROLPARENT;
1442 }
1443
1444 if (psInfo->proppage[index].useCallback)
1445 (*(ppshpage->pfnCallback))(0, PSPCB_CREATE,
1446 (LPPROPSHEETPAGEW)ppshpage);
1447
1448 if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE)
1449 hwndPage = CreateDialogIndirectParamW(ppshpage->hInstance,
1450 pTemplateCopy,
1451 hwndParent,
1452 ppshpage->pfnDlgProc,
1453 (LPARAM)ppshpage);
1454 else
1455 hwndPage = CreateDialogIndirectParamA(ppshpage->hInstance,
1456 pTemplateCopy,
1457 hwndParent,
1458 ppshpage->pfnDlgProc,
1459 (LPARAM)ppshpage);
1460 /* Free a no more needed copy */
1461 Free(pTemplateCopy);
1462
1463 if(!hwndPage)
1464 return FALSE;
1465
1466 psInfo->proppage[index].hwndPage = hwndPage;
1467
1468 /* Subclass exterior wizard pages */
1469 if((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
1470 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
1471 (ppshpage->dwFlags & PSP_HIDEHEADER))
1472 {
1473#ifdef __REACTOS__
1474 if (psInfo->ppshheader.u4.hbmWatermark)
1475#endif
1477 (DWORD_PTR)ppshpage);
1478 }
1479 if (!(psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD))
1481
1482#ifdef __REACTOS__
1484#endif
1485 return TRUE;
1486}
BOOL WINAPI SetWindowSubclass(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIDSubclass, DWORD_PTR dwRef)
Definition: commctrl.c:1261
static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage)
Definition: propsheet.c:1868
static UINT GetTemplateSize(const DLGTEMPLATE *pTemplate)
Definition: propsheet.c:1209
#define ETDT_ENABLETAB
Definition: dxdiag.c:30
#define WS_TABSTOP
Definition: pedump.c:634
#define PSPCB_CREATE
Definition: prsht.h:38
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
DLGPROC pfnDlgProc
Definition: prsht.h:226
HRESULT WINAPI EnableThemeDialogTexture(_In_ HWND hwnd, _In_ DWORD dwFlags)
Definition: uxthemesupp.c:55
#define WS_EX_CONTROLPARENT
Definition: winuser.h:387
#define DS_CONTROL
Definition: winuser.h:372

Referenced by PROPSHEET_InsertPage(), PROPSHEET_SetCurSel(), and PROPSHEET_ShowPage().

◆ PROPSHEET_CreateTabControl()

static BOOL PROPSHEET_CreateTabControl ( HWND  hwndParent,
const PropSheetInfo psInfo 
)
static

Definition at line 1137 of file propsheet.c.

1139{
1140 HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
1141 TCITEMW item;
1142 int i, nTabs;
1143 int iImage = 0;
1144
1145 TRACE("\n");
1146 item.mask = TCIF_TEXT;
1147 item.cchTextMax = MAX_TABTEXT_LENGTH;
1148
1149 nTabs = psInfo->nPages;
1150
1151 /*
1152 * Set the image list for icons.
1153 */
1154 if (psInfo->hImageList)
1155 {
1156 SendMessageW(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
1157 }
1158
1159 SendMessageW(hwndTabCtrl, WM_SETREDRAW, 0, 0);
1160 for (i = 0; i < nTabs; i++)
1161 {
1162 if ( psInfo->proppage[i].hasIcon )
1163 {
1164 item.mask |= TCIF_IMAGE;
1165 item.iImage = iImage++;
1166 }
1167 else
1168 {
1169 item.mask &= ~TCIF_IMAGE;
1170 }
1171
1172 item.pszText = (LPWSTR) psInfo->proppage[i].pszText;
1173 SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, i, (LPARAM)&item);
1174 }
1175 SendMessageW(hwndTabCtrl, WM_SETREDRAW, 1, 0);
1176
1177 return TRUE;
1178}
#define MAX_TABTEXT_LENGTH
Definition: propsheet.c:149
static ATOM item
Definition: dde.c:856
#define TCM_SETIMAGELIST
Definition: commctrl.h:3965
#define TCM_INSERTITEMW
Definition: commctrl.h:4047
#define TCIF_TEXT
Definition: commctrl.h:3971
#define TCIF_IMAGE
Definition: commctrl.h:3972
#define WM_SETREDRAW
Definition: winuser.h:1616

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_DialogProc()

static INT_PTR CALLBACK PROPSHEET_DialogProc ( HWND  hwnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 3501 of file propsheet.c.

3502{
3503 TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n",
3504 hwnd, uMsg, wParam, lParam);
3505
3506 switch (uMsg)
3507 {
3508 case WM_INITDIALOG:
3509 {
3510 PropSheetInfo* psInfo = (PropSheetInfo*) lParam;
3511 WCHAR* strCaption = Alloc(MAX_CAPTION_LENGTH*sizeof(WCHAR));
3512 HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
3513 int idx;
3514 LOGFONTW logFont;
3515
3516 /* Using PropSheetInfoStr to store extra data doesn't match the native
3517 * common control: native uses TCM_[GS]ETITEM
3518 */
3519 SetPropW(hwnd, PropSheetInfoStr, psInfo);
3520
3521 /*
3522 * psInfo->hwnd is not being used by WINE code - it exists
3523 * for compatibility with "real" Windoze. The same about
3524 * SetWindowLongPtr - WINE is only using the PropSheetInfoStr
3525 * property.
3526 */
3527 psInfo->hwnd = hwnd;
3529
3530 if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
3531 {
3532 /* set up the Next and Back buttons by default */
3534 }
3535
3536 /* Set up fonts */
3538 psInfo->hFont = CreateFontIndirectW (&logFont);
3539 logFont.lfWeight = FW_BOLD;
3540 psInfo->hFontBold = CreateFontIndirectW (&logFont);
3541
3542 /*
3543 * Small icon in the title bar.
3544 */
3545 if ((psInfo->ppshheader.dwFlags & PSH_USEICONID) ||
3546 (psInfo->ppshheader.dwFlags & PSH_USEHICON))
3547 {
3548 HICON hIcon;
3549 int icon_cx = GetSystemMetrics(SM_CXSMICON);
3550 int icon_cy = GetSystemMetrics(SM_CYSMICON);
3551
3552 if (psInfo->ppshheader.dwFlags & PSH_USEICONID)
3554 psInfo->ppshheader.u.pszIcon,
3555 IMAGE_ICON,
3556 icon_cx, icon_cy,
3558 else
3559 hIcon = psInfo->ppshheader.u.hIcon;
3560
3561 SendMessageW(hwnd, WM_SETICON, 0, (LPARAM)hIcon);
3562 }
3563
3564 if (psInfo->ppshheader.dwFlags & PSH_USEHICON)
3565 SendMessageW(hwnd, WM_SETICON, 0, (LPARAM)psInfo->ppshheader.u.hIcon);
3566
3567 psInfo->strPropertiesFor = strCaption;
3568
3570
3572
3574
3575 if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
3576 {
3577 ShowWindow(hwndTabCtrl, SW_HIDE);
3581 }
3582 else
3583 {
3584 if (PROPSHEET_SizeMismatch(hwnd, psInfo))
3585 {
3586 PROPSHEET_AdjustSize(hwnd, psInfo);
3588 }
3590 }
3591#ifdef __REACTOS__
3592 /* Move the window position if necessary */
3593 {
3594 INT dx, dy;
3595 RECT rcInit;
3597 BOOL bMove = FALSE;
3598
3599 GetWindowRect(hwnd, &rcInit);
3600 dx = rcInit.right - rcInit.left;
3601 dy = rcInit.bottom - rcInit.top;
3602
3603 if (IsWindow(hwndParent))
3604 {
3605 WINDOWPLACEMENT wndpl = { sizeof(wndpl) };
3606 bMove = TRUE;
3607
3608 /* hwndParent can be minimized (See Control_ShowAppletInTaskbar).
3609 Use normal position. */
3611 rcInit = wndpl.rcNormalPosition;
3613 {
3614 /* Is it Right-to-Left layout? */
3616 rcInit.left = rcInit.right - dx - GetSystemMetrics(SM_CXSMICON);
3617 else
3619
3620 rcInit.top += GetSystemMetrics(SM_CYSMICON);
3621 }
3622 }
3623 else
3624 {
3625 /* We cannot foresee CW_USEDEFAULT's position without communicating with USER32.
3626 Use a top-level STATIC control to get the proper position. */
3627 HWND hwndDummy = CreateWindowExW(0, WC_STATICW, NULL, 0,
3630 if (hwndDummy)
3631 {
3632 bMove = TRUE;
3633 GetWindowRect(hwndDummy, &rcInit);
3634 DestroyWindow(hwndDummy);
3635 }
3636 }
3637
3638 if (bMove)
3639 {
3640 MONITORINFO mi = { sizeof(mi) };
3641 HMONITOR hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
3642 if (GetMonitorInfo(hMonitor, &mi))
3643 {
3644 /* Try to fit it onto the desktop */
3645 if (mi.rcWork.right < rcInit.left + dx)
3646 rcInit.left = mi.rcWork.right - dx;
3647 if (mi.rcWork.bottom < rcInit.top + dy)
3648 rcInit.top = mi.rcWork.bottom - dy;
3649 if (rcInit.left < mi.rcWork.left)
3650 rcInit.left = mi.rcWork.left;
3651 if (rcInit.top < mi.rcWork.top)
3652 rcInit.top = mi.rcWork.top;
3653 SetWindowPos(hwnd, NULL, rcInit.left, rcInit.top, 0, 0,
3655 }
3656 }
3657 }
3658#endif
3659
3660 if (IS_INTRESOURCE(psInfo->ppshheader.pszCaption) &&
3661 psInfo->ppshheader.hInstance)
3662 {
3663 WCHAR szText[256];
3664
3665 if (LoadStringW(psInfo->ppshheader.hInstance,
3666 (UINT_PTR)psInfo->ppshheader.pszCaption, szText, 255))
3667 PROPSHEET_SetTitleW(hwnd, psInfo->ppshheader.dwFlags, szText);
3668 }
3669 else
3670 {
3672 psInfo->ppshheader.pszCaption);
3673 }
3674
3675
3676 if (psInfo->useCallback)
3677 (*(psInfo->ppshheader.pfnCallback))(hwnd, PSCB_INITIALIZED, 0);
3678
3679 idx = psInfo->active_page;
3680 psInfo->active_page = -1;
3681
3683
3684 /* doing TCM_SETCURSEL seems to be needed even in case of PSH_WIZARD,
3685 * as some programs call TCM_GETCURSEL to get the current selection
3686 * from which to switch to the next page */
3687 SendMessageW(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
3688
3690
3691 /* wizards set their focus during init */
3692 if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
3693 return FALSE;
3694
3695 return TRUE;
3696 }
3697
3698 case WM_PRINTCLIENT:
3699 case WM_PAINT:
3701 return TRUE;
3702
3703 case WM_DESTROY:
3705 return TRUE;
3706
3707 case WM_CLOSE:
3709 return FALSE; /* let DefDlgProc post us WM_COMMAND/IDCANCEL */
3710
3711 case WM_COMMAND:
3713 {
3715
3716 if (!psInfo)
3717 return FALSE;
3718
3719 /* No default handler, forward notification to active page */
3720 if (psInfo->activeValid && psInfo->active_page != -1)
3721 {
3722 HWND hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
3723 SendMessageW(hwndPage, WM_COMMAND, wParam, lParam);
3724 }
3725 }
3726 return TRUE;
3727
3728 case WM_NOTIFY:
3729 {
3730 NMHDR* pnmh = (LPNMHDR) lParam;
3731
3732 if (pnmh->code == TCN_SELCHANGE)
3733 {
3734 int index = SendMessageW(pnmh->hwndFrom, TCM_GETCURSEL, 0, 0);
3736 }
3737
3738 if(pnmh->code == TCN_SELCHANGING)
3739 {
3742 return TRUE;
3743 }
3744
3745 return FALSE;
3746 }
3747
3748 case WM_SYSCOLORCHANGE:
3750 return FALSE;
3751
3753 {
3755 HWND hwndPage = 0;
3756
3757 if (!psInfo)
3758 return FALSE;
3759
3760 if (psInfo->activeValid && psInfo->active_page != -1)
3761 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
3762
3764
3765 return TRUE;
3766 }
3767
3768 case PSM_CHANGED:
3770 return TRUE;
3771
3772 case PSM_UNCHANGED:
3774 return TRUE;
3775
3776 case PSM_GETTABCONTROL:
3777 {
3778 HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
3779
3781
3782 return TRUE;
3783 }
3784
3785 case PSM_SETCURSEL:
3786 {
3787 BOOL msgResult;
3788
3789 msgResult = PROPSHEET_CanSetCurSel(hwnd);
3790 if(msgResult != FALSE)
3791 {
3792 msgResult = PROPSHEET_SetCurSel(hwnd,
3793 (int)wParam,
3794 1,
3796 }
3797
3799
3800 return TRUE;
3801 }
3802
3803 case PSM_CANCELTOCLOSE:
3804 {
3806 HWND hwndOK = GetDlgItem(hwnd, IDOK);
3807 HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
3808
3809 EnableWindow(hwndCancel, FALSE);
3811 SetWindowTextW(hwndOK, buf);
3812
3813 return FALSE;
3814 }
3815
3816 case PSM_RESTARTWINDOWS:
3817 {
3819
3820 if (!psInfo)
3821 return FALSE;
3822
3823 /* reboot system takes precedence over restart windows */
3824 if (psInfo->result != ID_PSREBOOTSYSTEM)
3825 psInfo->result = ID_PSRESTARTWINDOWS;
3826
3827 return TRUE;
3828 }
3829
3830 case PSM_REBOOTSYSTEM:
3831 {
3833
3834 if (!psInfo)
3835 return FALSE;
3836
3837 psInfo->result = ID_PSREBOOTSYSTEM;
3838
3839 return TRUE;
3840 }
3841
3842 case PSM_SETTITLEA:
3844 return TRUE;
3845
3846 case PSM_SETTITLEW:
3848 return TRUE;
3849
3850 case PSM_APPLY:
3851 {
3852 BOOL msgResult = PROPSHEET_Apply(hwnd, 0);
3853
3855
3856 return TRUE;
3857 }
3858
3859 case PSM_QUERYSIBLINGS:
3860 {
3862
3864
3865 return TRUE;
3866 }
3867
3868 case PSM_ADDPAGE:
3869 {
3870 /*
3871 * Note: MSVC++ 6.0 documentation says that PSM_ADDPAGE does not have
3872 * a return value. This is not true. PSM_ADDPAGE returns TRUE
3873 * on success or FALSE otherwise, as specified on MSDN Online.
3874 * Also see the MFC code for
3875 * CPropertySheet::AddPage(CPropertyPage* pPage).
3876 */
3877
3879
3881
3882 return TRUE;
3883 }
3884
3885 case PSM_REMOVEPAGE:
3887 return TRUE;
3888
3890 {
3893 return TRUE;
3894 }
3895
3896 case PSM_PRESSBUTTON:
3898 return TRUE;
3899
3900 case PSM_SETFINISHTEXTA:
3902 return TRUE;
3903
3904 case PSM_SETWIZBUTTONS:
3906 return TRUE;
3907
3908 case PSM_SETCURSELID:
3910 return TRUE;
3911
3912 case PSM_SETFINISHTEXTW:
3914 return FALSE;
3915
3916 case PSM_INSERTPAGE:
3917 {
3920 return TRUE;
3921 }
3922
3923 case PSM_SETHEADERTITLEW:
3925 return TRUE;
3926
3927 case PSM_SETHEADERTITLEA:
3929 return TRUE;
3930
3931 case PSM_SETHEADERSUBTITLEW:
3933 return TRUE;
3934
3935 case PSM_SETHEADERSUBTITLEA:
3937 return TRUE;
3938
3939 case PSM_HWNDTOINDEX:
3940 {
3943 return TRUE;
3944 }
3945
3946 case PSM_INDEXTOHWND:
3947 {
3948 LRESULT msgResult = PROPSHEET_IndexToHwnd(hwnd, (int)wParam);
3950 return TRUE;
3951 }
3952
3953 case PSM_PAGETOINDEX:
3954 {
3957 return TRUE;
3958 }
3959
3960 case PSM_INDEXTOPAGE:
3961 {
3962 LRESULT msgResult = PROPSHEET_IndexToPage(hwnd, (int)wParam);
3964 return TRUE;
3965 }
3966
3967 case PSM_IDTOINDEX:
3968 {
3969 LRESULT msgResult = PROPSHEET_IdToIndex(hwnd, (int)lParam);
3971 return TRUE;
3972 }
3973
3974 case PSM_INDEXTOID:
3975 {
3976 LRESULT msgResult = PROPSHEET_IndexToId(hwnd, (int)wParam);
3978 return TRUE;
3979 }
3980
3981 case PSM_GETRESULT:
3982 {
3983 LRESULT msgResult = PROPSHEET_GetResult(hwnd);
3985 return TRUE;
3986 }
3987
3988 case PSM_RECALCPAGESIZES:
3989 {
3992 return TRUE;
3993 }
3994
3995 default:
3996 return FALSE;
3997 }
3998}
WPARAM wParam
Definition: combotst.c:138
#define IDS_CLOSE
Definition: comctl32.h:61
VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN
Definition: commctrl.c:1586
static LRESULT PROPSHEET_HwndToIndex(HWND hwndDlg, HWND hPageDlg)
Definition: propsheet.c:2604
static void PROPSHEET_SetHeaderSubTitleA(HWND hwndDlg, UINT page_index, const char *subtitle)
Definition: propsheet.c:2590
static LRESULT PROPSHEET_IdToIndex(HWND hwndDlg, int iPageId)
Definition: propsheet.c:2663
static void PROPSHEET_PressButton(HWND hwndDlg, int buttonID)
Definition: propsheet.c:1898
static void PROPSHEET_SetHeaderSubTitleW(HWND hwndDlg, UINT page_index, const WCHAR *subtitle)
Definition: propsheet.c:2568
static void PROPSHEET_SetFinishTextA(HWND hwndDlg, LPCSTR lpszText)
Definition: propsheet.c:2169
static BOOL PROPSHEET_AdjustButtonsWizard(HWND hwndParent, const PropSheetInfo *psInfo)
Definition: propsheet.c:928
static void PROPSHEET_CleanUp(HWND hwndDlg)
Definition: propsheet.c:2738
static BOOL PROPSHEET_AdjustSize(HWND hwndDlg, PropSheetInfo *psInfo)
Definition: propsheet.c:723
static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam)
Definition: propsheet.c:1773
static void PROPSHEET_SetHeaderTitleW(HWND hwndDlg, UINT page_index, const WCHAR *title)
Definition: propsheet.c:2532
static void PROPSHEET_SetCurSelId(HWND hwndDlg, int id)
Definition: propsheet.c:2106
static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam)
Definition: propsheet.c:1707
static BOOL PROPSHEET_AdjustButtons(HWND hwndParent, const PropSheetInfo *psInfo)
Definition: propsheet.c:839
static LRESULT PROPSHEET_IndexToHwnd(HWND hwndDlg, int iPageIndex)
Definition: propsheet.c:2621
static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID)
Definition: propsheet.c:3238
static BOOL PROPSHEET_CreateTabControl(HWND hwndParent, const PropSheetInfo *psInfo)
Definition: propsheet.c:1137
static BOOL PROPSHEET_RecalcPageSizes(HWND hwndDlg)
Definition: propsheet.c:2709
static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage)
Definition: propsheet.c:1838
static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
Definition: propsheet.c:2458
static BOOL PROPSHEET_SizeMismatch(HWND hwndDlg, const PropSheetInfo *psInfo)
Definition: propsheet.c:692
static LRESULT PROPSHEET_IndexToPage(HWND hwndDlg, int iPageIndex)
Definition: propsheet.c:2649
#define MAX_BUTTONTEXT_LENGTH
Definition: propsheet.c:150
static LRESULT PROPSHEET_IndexToId(HWND hwndDlg, int iPageIndex)
Definition: propsheet.c:2681
static BOOL PROPSHEET_RemovePage(HWND hwndDlg, int index, HPROPSHEETPAGE hpage)
Definition: propsheet.c:2352
static BOOL PROPSHEET_AdjustSizeWizard(HWND hwndDlg, const PropSheetInfo *psInfo)
Definition: propsheet.c:805
static void PROPSHEET_SetHeaderTitleA(HWND hwndDlg, UINT page_index, const char *title)
Definition: propsheet.c:2554
static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam)
Definition: propsheet.c:3300
static BOOL PROPSHEET_AddPage(HWND hwndDlg, HPROPSHEETPAGE hpage)
Definition: propsheet.c:2342
static LRESULT PROPSHEET_PageToIndex(HWND hwndDlg, HPROPSHEETPAGE hPage)
Definition: propsheet.c:2637
static LRESULT PROPSHEET_GetResult(HWND hwndDlg)
Definition: propsheet.c:2700
static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
Definition: propsheet.c:2122
static VOID PROPSHEET_LoadWizardBitmaps(PropSheetInfo *psInfo)
Definition: propsheet.c:1493
static void PROPSHEET_SetFinishTextW(HWND hwndDlg, LPCWSTR lpszText)
Definition: propsheet.c:2198
static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg, WPARAM wParam, LPARAM lParam)
Definition: propsheet.c:2227
#define MAX_CAPTION_LENGTH
Definition: propsheet.c:148
static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
Definition: propsheet.c:2139
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
static HDC
Definition: imagelist.c:92
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
#define ID_PSRESTARTWINDOWS
Definition: prsht.h:132
#define PSM_GETTABCONTROL
Definition: prsht.h:80
#define PSM_CHANGED
Definition: prsht.h:164
#define PSM_ISDIALOGMESSAGE
Definition: prsht.h:96
#define PSM_SETWIZBUTTONS
Definition: prsht.h:157
#define PSH_USEHICON
Definition: prsht.h:41
#define PSM_REMOVEPAGE
Definition: prsht.h:166
#define PSM_ADDPAGE
Definition: prsht.h:165
#define PSM_UNCHANGED
Definition: prsht.h:159
#define PSWIZB_NEXT
Definition: prsht.h:154
#define PSM_GETCURRENTPAGEHWND
Definition: prsht.h:81
#define PSM_RESTARTWINDOWS
Definition: prsht.h:163
#define PSWIZB_BACK
Definition: prsht.h:153
#define PSM_SETTITLEA
Definition: prsht.h:168
#define PSM_SETCURSELID
Definition: prsht.h:104
#define PSM_SETTITLEW
Definition: prsht.h:169
#define PSM_SETFINISHTEXTW
Definition: prsht.h:105
#define PSM_SETFINISHTEXTA
Definition: prsht.h:106
#define PSM_CANCELTOCLOSE
Definition: prsht.h:161
#define ID_PSREBOOTSYSTEM
Definition: prsht.h:133
#define PSH_USEICONID
Definition: prsht.h:42
#define PSCB_INITIALIZED
Definition: prsht.h:75
#define PSM_APPLY
Definition: prsht.h:158
#define PSM_SETCURSEL
Definition: prsht.h:167
#define PSM_PRESSBUTTON
Definition: prsht.h:100
#define PSM_REBOOTSYSTEM
Definition: prsht.h:162
#define PSM_QUERYSIBLINGS
Definition: prsht.h:160
#define TCM_GETCURSEL
Definition: commctrl.h:4062
#define TCN_SELCHANGING
Definition: commctrl.h:4133
#define TCN_SELCHANGE
Definition: commctrl.h:4132
#define TCM_SETCURSEL
Definition: commctrl.h:4065
#define WC_STATICW
Definition: commctrl.h:4680
#define WM_PRINTCLIENT
Definition: richedit.h:70
LONG lfWeight
Definition: dimm.idl:63
LPCWSTR pszIcon
Definition: prsht.h:299
RECT rcNormalPosition
Definition: winuser.h:3295
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1384
static MONITORINFO mi
Definition: win.c:7338
#define PSM_GETRESULT
Definition: window.cpp:1319
#define FW_BOLD
Definition: wingdi.h:378
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define WM_PAINT
Definition: winuser.h:1620
#define GetMonitorInfo
Definition: winuser.h:5800
#define WM_CLOSE
Definition: winuser.h:1621
#define DWLP_USER
Definition: winuser.h:872
#define GetWindowLongPtrW
Definition: winuser.h:4829
BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT *)
#define WM_COMMAND
Definition: winuser.h:1740
#define WM_INITDIALOG
Definition: winuser.h:1739
#define SPI_GETICONTITLELOGFONT
Definition: winuser.h:1380
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1626
BOOL WINAPI IsIconic(_In_ HWND)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
struct tagNMHDR * LPNMHDR
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define CW_USEDEFAULT
Definition: winuser.h:225
#define DWLP_MSGRESULT
Definition: winuser.h:870
#define WM_DESTROY
Definition: winuser.h:1609
#define SetWindowLongPtrW
Definition: winuser.h:5355
#define WS_EX_RTLREADING
Definition: winuser.h:402
BOOL WINAPI IsWindowVisible(_In_ HWND)
#define GWL_EXSTYLE
Definition: winuser.h:851
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by PROPSHEET_CreateDialog().

◆ PROPSHEET_DoCommand()

static BOOL PROPSHEET_DoCommand ( HWND  hwnd,
WORD  wID 
)
static

Definition at line 3238 of file propsheet.c.

3239{
3240
3241 switch (wID) {
3242
3243 case IDOK:
3244 case IDC_APPLY_BUTTON:
3245 {
3246 HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
3247
3248 if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
3249 break;
3250
3251 if (wID == IDOK)
3252 {
3254
3255 /* don't overwrite ID_PSRESTARTWINDOWS or ID_PSREBOOTSYSTEM */
3256 if (psInfo->result == 0)
3257 psInfo->result = IDOK;
3258
3259 if (psInfo->isModeless)
3260 psInfo->activeValid = FALSE;
3261 else
3262 psInfo->ended = TRUE;
3263 }
3264 else
3265 EnableWindow(hwndApplyBtn, FALSE);
3266
3267 break;
3268 }
3269
3270 case IDC_BACK_BUTTON:
3272 break;
3273
3274 case IDC_NEXT_BUTTON:
3276 break;
3277
3278 case IDC_FINISH_BUTTON:
3280 break;
3281
3282 case IDCANCEL:
3284 break;
3285
3286 case IDHELP:
3288 break;
3289
3290 default:
3291 return FALSE;
3292 }
3293
3294 return TRUE;
3295}
static BOOL PROPSHEET_Finish(HWND hwndDlg)
Definition: propsheet.c:1669
static BOOL PROPSHEET_Next(HWND hwndDlg)
Definition: propsheet.c:1626
static void PROPSHEET_Help(HWND hwndDlg)
Definition: propsheet.c:1816
static BOOL PROPSHEET_Back(HWND hwndDlg)
Definition: propsheet.c:1584

Referenced by PROPSHEET_DialogProc(), and PROPSHEET_PressButton().

◆ PROPSHEET_FindPageByResId()

static INT PROPSHEET_FindPageByResId ( const PropSheetInfo psInfo,
LRESULT  resId 
)
static

Definition at line 274 of file propsheet.c.

275{
276 INT i;
277
278 for (i = 0; i < psInfo->nPages; i++)
279 {
281
282 /* Fixme: if resource ID is a string shall we use strcmp ??? */
283 if (lppsp->u.pszTemplate == (LPVOID)resId)
284 break;
285 }
286
287 return i;
288}

Referenced by PROPSHEET_Back(), PROPSHEET_Next(), PROPSHEET_SetCurSel(), and PROPSHEET_SetCurSelId().

◆ PROPSHEET_Finish()

static BOOL PROPSHEET_Finish ( HWND  hwndDlg)
static

Definition at line 1669 of file propsheet.c.

1670{
1671 PSHNOTIFY psn;
1672 HWND hwndPage;
1673 LRESULT msgResult = 0;
1674 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1675
1676 TRACE("active_page %d\n", psInfo->active_page);
1677 if (psInfo->active_page < 0)
1678 return FALSE;
1679
1680 psn.hdr.code = PSN_WIZFINISH;
1681 psn.hdr.hwndFrom = hwndDlg;
1682 psn.hdr.idFrom = 0;
1683 psn.lParam = 0;
1684
1685 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1686
1687 msgResult = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1688
1689 TRACE("msg result %ld\n", msgResult);
1690
1691 if (msgResult != 0)
1692 return FALSE;
1693
1694 if (psInfo->result == 0)
1695 psInfo->result = IDOK;
1696 if (psInfo->isModeless)
1697 psInfo->activeValid = FALSE;
1698 else
1699 psInfo->ended = TRUE;
1700
1701 return TRUE;
1702}
#define PSN_WIZFINISH
Definition: prsht.h:122

Referenced by PROPSHEET_DoCommand(), and PROPSHEET_PressButton().

◆ PROPSHEET_GetPaddingInfo()

static PADDING_INFO PROPSHEET_GetPaddingInfo ( HWND  hwndDlg)
static

Definition at line 1055 of file propsheet.c.

1056{
1057 HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABCONTROL);
1058 RECT rcTab;
1060
1061 GetWindowRect(hwndTab, &rcTab);
1062 MapWindowPoints( 0, hwndDlg, (POINT *)&rcTab, 2 );
1063
1064 padding.x = rcTab.left;
1065 padding.y = rcTab.top;
1066
1067 return padding;
1068}

Referenced by PROPSHEET_AdjustButtons(), and PROPSHEET_AdjustSize().

◆ PROPSHEET_GetPaddingInfoWizard()

static PADDING_INFO PROPSHEET_GetPaddingInfoWizard ( HWND  hwndDlg,
const PropSheetInfo psInfo 
)
static

Definition at line 1082 of file propsheet.c.

1084{
1086 RECT rc;
1087 HWND hwndControl;
1088 INT idButton;
1089 POINT ptButton, ptLine;
1090
1091 TRACE("\n");
1092 if (psInfo->hasHelp)
1093 {
1094 idButton = IDHELP;
1095 }
1096 else
1097 {
1098 if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
1099 {
1100 idButton = IDC_NEXT_BUTTON;
1101 }
1102 else
1103 {
1104 /* hopefully this is ok */
1105 idButton = IDCANCEL;
1106 }
1107 }
1108
1109 hwndControl = GetDlgItem(hwndDlg, idButton);
1110 GetWindowRect(hwndControl, &rc);
1111 MapWindowPoints( 0, hwndDlg, (POINT *)&rc, 2 );
1112 ptButton.x = rc.left;
1113 ptButton.y = rc.top;
1114
1115 /* Line */
1116 hwndControl = GetDlgItem(hwndDlg, IDC_SUNKEN_LINE);
1117 GetWindowRect(hwndControl, &rc);
1118 MapWindowPoints( 0, hwndDlg, (POINT *)&rc, 2 );
1119 ptLine.x = rc.left;
1120 ptLine.y = rc.bottom;
1121
1122 padding.y = ptButton.y - ptLine.y;
1123
1124 if (padding.y < 0)
1125 ERR("padding negative ! Please report this !\n");
1126
1127 /* this is most probably not correct, but the best we have now */
1128 padding.x = padding.y;
1129 return padding;
1130}
#define ERR(fmt,...)
Definition: precomp.h:57
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48

Referenced by PROPSHEET_AdjustButtonsWizard().

◆ PROPSHEET_GetPageIndex()

static int PROPSHEET_GetPageIndex ( HPROPSHEETPAGE  hpage,
const PropSheetInfo psInfo,
int  original_index 
)
static

Definition at line 2722 of file propsheet.c.

2723{
2724 int index;
2725
2726 TRACE("page %p index %d\n", page, original_index);
2727
2728 for (index = 0; index < psInfo->nPages; index++)
2729 if (psInfo->proppage[index].hpage == page)
2730 return index;
2731
2732 return original_index;
2733}
Definition: module.h:576

Referenced by PROPSHEET_InsertPage(), PROPSHEET_PageToIndex(), PROPSHEET_RemovePage(), and PROPSHEET_SetCurSel().

◆ PROPSHEET_GetPageRect()

static void PROPSHEET_GetPageRect ( const PropSheetInfo psInfo,
HWND  hwndDlg,
RECT rc,
LPCPROPSHEETPAGEW  ppshpage 
)
static

Definition at line 230 of file propsheet.c.

232{
233 if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) {
234 HWND hwndChild;
235 RECT r;
236
237 if (((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
238 (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
239 !(ppshpage->dwFlags & PSP_HIDEHEADER)) ||
240 (psInfo->ppshheader.dwFlags & PSH_WIZARD))
241 {
242 rc->left = rc->top = WIZARD_PADDING;
243 }
244 else
245 {
246 rc->left = rc->top = 0;
247 }
248 rc->right = psInfo->width - rc->left;
249 rc->bottom = psInfo->height - rc->top;
250 MapDialogRect(hwndDlg, rc);
251
252 if ((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
253 (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
254 !(ppshpage->dwFlags & PSP_HIDEHEADER))
255 {
256 hwndChild = GetDlgItem(hwndDlg, IDC_SUNKEN_LINEHEADER);
257 GetClientRect(hwndChild, &r);
258 MapWindowPoints(hwndChild, hwndDlg, (LPPOINT) &r, 2);
259 rc->top += r.bottom + 1;
260 }
261 } else {
262 HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
263 GetClientRect(hwndTabCtrl, rc);
264 SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)rc);
265 MapWindowPoints(hwndTabCtrl, hwndDlg, (LPPOINT)rc, 2);
266 }
267}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Referenced by PROPSHEET_SetCurSel().

◆ PROPSHEET_GetResult()

static LRESULT PROPSHEET_GetResult ( HWND  hwndDlg)
static

Definition at line 2700 of file propsheet.c.

2701{
2702 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2703 return psInfo->result;
2704}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_Help()

static void PROPSHEET_Help ( HWND  hwndDlg)
static

Definition at line 1816 of file propsheet.c.

1817{
1818 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1819 HWND hwndPage;
1820 PSHNOTIFY psn;
1821
1822 TRACE("active_page %d\n", psInfo->active_page);
1823 if (psInfo->active_page < 0)
1824 return;
1825
1826 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1827 psn.hdr.code = PSN_HELP;
1828 psn.hdr.hwndFrom = hwndDlg;
1829 psn.hdr.idFrom = 0;
1830 psn.lParam = 0;
1831
1832 SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1833}
#define PSN_HELP
Definition: prsht.h:119

Referenced by PROPSHEET_DoCommand().

◆ PROPSHEET_HwndToIndex()

static LRESULT PROPSHEET_HwndToIndex ( HWND  hwndDlg,
HWND  hPageDlg 
)
static

Definition at line 2604 of file propsheet.c.

2605{
2606 int index;
2607 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2608
2609 TRACE("(%p, %p)\n", hwndDlg, hPageDlg);
2610
2611 for (index = 0; index < psInfo->nPages; index++)
2612 if (psInfo->proppage[index].hwndPage == hPageDlg)
2613 return index;
2614 WARN("%p not found\n", hPageDlg);
2615 return -1;
2616}
#define WARN(fmt,...)
Definition: precomp.h:61

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_IdToIndex()

static LRESULT PROPSHEET_IdToIndex ( HWND  hwndDlg,
int  iPageId 
)
static

Definition at line 2663 of file propsheet.c.

2664{
2665 int index;
2667 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2668 TRACE("(%p, %d)\n", hwndDlg, iPageId);
2669 for (index = 0; index < psInfo->nPages; index++) {
2670 psp = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
2671 if (psp->u.pszTemplate == MAKEINTRESOURCEW(iPageId))
2672 return index;
2673 }
2674
2675 return -1;
2676}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_IndexToHwnd()

static LRESULT PROPSHEET_IndexToHwnd ( HWND  hwndDlg,
int  iPageIndex 
)
static

Definition at line 2621 of file propsheet.c.

2622{
2623 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2624 TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
2625 if (!psInfo)
2626 return 0;
2627 if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
2628 WARN("%d out of range.\n", iPageIndex);
2629 return 0;
2630 }
2631 return (LRESULT)psInfo->proppage[iPageIndex].hwndPage;
2632}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_IndexToId()

static LRESULT PROPSHEET_IndexToId ( HWND  hwndDlg,
int  iPageIndex 
)
static

Definition at line 2681 of file propsheet.c.

2682{
2683 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2685 TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
2686 if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
2687 WARN("%d out of range.\n", iPageIndex);
2688 return 0;
2689 }
2690 psp = (LPCPROPSHEETPAGEW)psInfo->proppage[iPageIndex].hpage;
2691 if (psp->dwFlags & PSP_DLGINDIRECT || !IS_INTRESOURCE(psp->u.pszTemplate)) {
2692 return 0;
2693 }
2694 return (LRESULT)psp->u.pszTemplate;
2695}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_IndexToPage()

static LRESULT PROPSHEET_IndexToPage ( HWND  hwndDlg,
int  iPageIndex 
)
static

Definition at line 2649 of file propsheet.c.

2650{
2651 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2652 TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
2653 if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
2654 WARN("%d out of range.\n", iPageIndex);
2655 return 0;
2656 }
2657 return (LRESULT)psInfo->proppage[iPageIndex].hpage;
2658}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_InsertPage()

static BOOL PROPSHEET_InsertPage ( HWND  hwndDlg,
HPROPSHEETPAGE  hpageInsertAfter,
HPROPSHEETPAGE  hpage 
)
static

Definition at line 2248 of file propsheet.c.

2249{
2250 PropSheetInfo *psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2251 PropPageInfo *ppi, *prev_ppi = psInfo->proppage;
2252 HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
2254 TCITEMW item;
2255 int index;
2256
2257 TRACE("hwndDlg %p, hpageInsertAfter %p, hpage %p\n", hwndDlg, hpageInsertAfter, hpage);
2258
2259 if (IS_INTRESOURCE(hpageInsertAfter))
2260 index = LOWORD(hpageInsertAfter);
2261 else
2262 {
2263 index = PROPSHEET_GetPageIndex(hpageInsertAfter, psInfo, -1);
2264 if (index < 0)
2265 {
2266 TRACE("Could not find page to insert after!\n");
2267 return FALSE;
2268 }
2269 index++;
2270 }
2271
2272 if (index > psInfo->nPages)
2273 index = psInfo->nPages;
2274
2275 ppi = Alloc(sizeof(PropPageInfo) * (psInfo->nPages + 1));
2276 if (!ppi)
2277 return FALSE;
2278
2279 /*
2280 * Fill in a new PropPageInfo entry.
2281 */
2282 if (index > 0)
2283 memcpy(ppi, prev_ppi, index * sizeof(PropPageInfo));
2284 memset(&ppi[index], 0, sizeof(PropPageInfo));
2285 if (index < psInfo->nPages)
2286 memcpy(&ppi[index + 1], &prev_ppi[index], (psInfo->nPages - index) * sizeof(PropPageInfo));
2287 psInfo->proppage = ppi;
2288
2289 if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, index, FALSE))
2290 {
2291 psInfo->proppage = prev_ppi;
2292 Free(ppi);
2293 return FALSE;
2294 }
2295
2296 psInfo->proppage[index].hpage = hpage;
2297
2298 if (ppsp->dwFlags & PSP_PREMATURE)
2299 {
2300 /* Create the page but don't show it */
2301 if (!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppsp))
2302 {
2303 psInfo->proppage = prev_ppi;
2304 Free(ppi);
2305 return FALSE;
2306 }
2307 }
2308
2309 Free(prev_ppi);
2310 psInfo->nPages++;
2311 if (index <= psInfo->active_page)
2312 psInfo->active_page++;
2313
2314 /*
2315 * Add a new tab to the tab control.
2316 */
2317 item.mask = TCIF_TEXT;
2318 item.pszText = (LPWSTR) psInfo->proppage[index].pszText;
2319 item.cchTextMax = MAX_TABTEXT_LENGTH;
2320
2321 if (psInfo->hImageList)
2322 SendMessageW(hwndTabControl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
2323
2324 if (psInfo->proppage[index].hasIcon)
2325 {
2326 item.mask |= TCIF_IMAGE;
2327 item.iImage = index;
2328 }
2329
2330 SendMessageW(hwndTabControl, TCM_INSERTITEMW, index, (LPARAM)&item);
2331
2332 /* If it is the only page - show it */
2333 if (psInfo->nPages == 1)
2334 PROPSHEET_SetCurSel(hwndDlg, 0, 1, 0);
2335
2336 return TRUE;
2337}
static BOOL PROPSHEET_CreatePage(HWND hwndParent, int index, const PropSheetInfo *psInfo, LPCPROPSHEETPAGEW ppshpage)
Definition: propsheet.c:1344
static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE hpage, const PropSheetInfo *psInfo, int original_index)
Definition: propsheet.c:2722
static LONG active_page
Definition: propsheet.c:37
#define PSP_PREMATURE
Definition: prsht.h:31
#define memset(x, y, z)
Definition: compat.h:39

Referenced by PROPSHEET_AddPage(), and PROPSHEET_DialogProc().

◆ PROPSHEET_IsDialogMessage()

static BOOL PROPSHEET_IsDialogMessage ( HWND  hwnd,
LPMSG  lpMsg 
)
static

Definition at line 3185 of file propsheet.c.

3186{
3188
3189 TRACE("\n");
3190 if (!psInfo || (hwnd != lpMsg->hwnd && !IsChild(hwnd, lpMsg->hwnd)))
3191 return FALSE;
3192
3193 if (lpMsg->message == WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0x8000))
3194 {
3195 int new_page = 0;
3196 INT dlgCode = SendMessageW(lpMsg->hwnd, WM_GETDLGCODE, 0, (LPARAM)lpMsg);
3197
3198 if (!(dlgCode & DLGC_WANTMESSAGE))
3199 {
3200 switch (lpMsg->wParam)
3201 {
3202 case VK_TAB:
3203 if (GetKeyState(VK_SHIFT) & 0x8000)
3204 new_page = -1;
3205 else
3206 new_page = 1;
3207 break;
3208
3209 case VK_NEXT: new_page = 1; break;
3210 case VK_PRIOR: new_page = -1; break;
3211 }
3212 }
3213
3214 if (new_page)
3215 {
3217 {
3218 new_page += psInfo->active_page;
3219
3220 if (new_page < 0)
3221 new_page = psInfo->nPages - 1;
3222 else if (new_page >= psInfo->nPages)
3223 new_page = 0;
3224
3225 PROPSHEET_SetCurSel(hwnd, new_page, 1, 0);
3226 }
3227
3228 return TRUE;
3229 }
3230 }
3231
3232 return IsDialogMessageW(hwnd, lpMsg);
3233}
UINT message
Definition: winuser.h:3115
HWND hwnd
Definition: winuser.h:3114
WPARAM wParam
Definition: winuser.h:3116
#define VK_TAB
Definition: winuser.h:2199
#define VK_CONTROL
Definition: winuser.h:2203
#define VK_NEXT
Definition: winuser.h:2221
BOOL WINAPI IsChild(_In_ HWND, _In_ HWND)
#define VK_SHIFT
Definition: winuser.h:2202
#define DLGC_WANTMESSAGE
Definition: winuser.h:2613
#define VK_PRIOR
Definition: winuser.h:2220
#define WM_KEYDOWN
Definition: winuser.h:1715
#define WM_GETDLGCODE
Definition: winuser.h:1689
SHORT WINAPI GetKeyState(_In_ int)

Referenced by do_loop(), and PROPSHEET_DialogProc().

◆ PROPSHEET_LoadWizardBitmaps()

static VOID PROPSHEET_LoadWizardBitmaps ( PropSheetInfo psInfo)
static

Definition at line 1493 of file propsheet.c.

1494{
1495 if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD))
1496 {
1497 /* if PSH_USEHBMWATERMARK is not set, load the resource from pszbmWatermark
1498 and put the HBITMAP in hbmWatermark. Thus all the rest of the code always
1499 considers hbmWatermark as valid. */
1500 if ((psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
1501 !(psInfo->ppshheader.dwFlags & PSH_USEHBMWATERMARK))
1502 {
1503 psInfo->ppshheader.u4.hbmWatermark =
1504 CreateMappedBitmap(psInfo->ppshheader.hInstance, (INT_PTR)psInfo->ppshheader.u4.pszbmWatermark, 0, NULL, 0);
1505 }
1506
1507 /* Same behavior as for watermarks */
1508 if ((psInfo->ppshheader.dwFlags & PSH_HEADER) &&
1509 !(psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER))
1510 {
1511 psInfo->ppshheader.u5.hbmHeader =
1512 CreateMappedBitmap(psInfo->ppshheader.hInstance, (INT_PTR)psInfo->ppshheader.u5.pszbmHeader, 0, NULL, 0);
1513 }
1514 }
1515}
HBITMAP WINAPI CreateMappedBitmap(HINSTANCE hInstance, INT_PTR idBitmap, UINT wFlags, LPCOLORMAP lpColorMap, INT iNumMaps)
Definition: commctrl.c:998

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_Next()

static BOOL PROPSHEET_Next ( HWND  hwndDlg)
static

Definition at line 1626 of file propsheet.c.

1627{
1628 PSHNOTIFY psn;
1629 HWND hwndPage;
1630 LRESULT msgResult = 0;
1631 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1632 int idx;
1633
1634 TRACE("active_page %d\n", psInfo->active_page);
1635 if (psInfo->active_page < 0)
1636 return FALSE;
1637
1638 psn.hdr.code = PSN_WIZNEXT;
1639 psn.hdr.hwndFrom = hwndDlg;
1640 psn.hdr.idFrom = 0;
1641 psn.lParam = 0;
1642
1643 hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
1644
1645 msgResult = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
1646 if (msgResult == -1)
1647 return FALSE;
1648 else if (msgResult == 0)
1649 idx = psInfo->active_page + 1;
1650 else
1651 idx = PROPSHEET_FindPageByResId(psInfo, msgResult);
1652
1653 if (idx < psInfo->nPages )
1654 {
1655 if (PROPSHEET_CanSetCurSel(hwndDlg) != FALSE)
1656 {
1659 PROPSHEET_SetCurSel(hwndDlg, idx, 1, 0);
1660 }
1661 }
1662
1663 return TRUE;
1664}
#define PSN_WIZNEXT
Definition: prsht.h:121

Referenced by PROPSHEET_DoCommand(), and PROPSHEET_PressButton().

◆ PROPSHEET_PageToIndex()

static LRESULT PROPSHEET_PageToIndex ( HWND  hwndDlg,
HPROPSHEETPAGE  hPage 
)
static

Definition at line 2637 of file propsheet.c.

2638{
2639 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2640
2641 TRACE("(%p, %p)\n", hwndDlg, hPage);
2642
2643 return PROPSHEET_GetPageIndex(hPage, psInfo, -1);
2644}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_Paint()

static LRESULT PROPSHEET_Paint ( HWND  hwnd,
HDC  hdcParam 
)
static

Definition at line 3300 of file propsheet.c.

3301{
3303 PAINTSTRUCT ps;
3304 HDC hdc, hdcSrc;
3305 BITMAP bm;
3306 HBITMAP hbmp;
3307 HPALETTE hOldPal = 0;
3308 int offsety = 0;
3309 HBRUSH hbr;
3310 RECT r, rzone;
3311 LPCPROPSHEETPAGEW ppshpage;
3312 WCHAR szBuffer[256];
3313 int nLength;
3314
3315 hdc = hdcParam ? hdcParam : BeginPaint(hwnd, &ps);
3316 if (!hdc) return 1;
3317
3319
3320 if (psInfo->ppshheader.dwFlags & PSH_USEHPLWATERMARK)
3321 hOldPal = SelectPalette(hdc, psInfo->ppshheader.hplWatermark, FALSE);
3322
3323 if (psInfo->active_page < 0)
3324 ppshpage = NULL;
3325 else
3326 ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[psInfo->active_page].hpage;
3327
3328 if ( (ppshpage && !(ppshpage->dwFlags & PSP_HIDEHEADER)) &&
3329 (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
3330 (psInfo->ppshheader.dwFlags & PSH_HEADER) )
3331 {
3332 HWND hwndLineHeader = GetDlgItem(hwnd, IDC_SUNKEN_LINEHEADER);
3333 HFONT hOldFont;
3334 COLORREF clrOld = 0;
3335 int oldBkMode = 0;
3336
3337 GetClientRect(hwndLineHeader, &r);
3338 MapWindowPoints(hwndLineHeader, hwnd, (LPPOINT) &r, 2);
3339 SetRect(&rzone, 0, 0, r.right + 1, r.top - 1);
3340
3341 hOldFont = SelectObject(hdc, psInfo->hFontBold);
3342
3343#ifdef __REACTOS__
3344 if (psInfo->ppshheader.u5.hbmHeader)
3345#else
3346 if (psInfo->ppshheader.dwFlags & PSH_USEHBMHEADER)
3347#endif
3348 {
3349 hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u5.hbmHeader);
3350
3351 GetObjectW(psInfo->ppshheader.u5.hbmHeader, sizeof(BITMAP), &bm);
3352 if (psInfo->ppshheader.dwFlags & PSH_WIZARD97_OLD)
3353 {
3354 /* Fill the unoccupied part of the header with color of the
3355 * left-top pixel, but do it only when needed.
3356 */
3357 if (bm.bmWidth < r.right || bm.bmHeight < r.bottom)
3358 {
3359 hbr = CreateSolidBrush(GetPixel(hdcSrc, 0, 0));
3360 r = rzone;
3361 if (bm.bmWidth < r.right)
3362 {
3363 r.left = bm.bmWidth;
3364 FillRect(hdc, &r, hbr);
3365 }
3366 if (bm.bmHeight < r.bottom)
3367 {
3368 r.left = 0;
3369 r.top = bm.bmHeight;
3370 FillRect(hdc, &r, hbr);
3371 }
3372 DeleteObject(hbr);
3373 }
3374
3375 /* Draw the header itself. */
3376 BitBlt(hdc, 0, 0, bm.bmWidth, min(bm.bmHeight, rzone.bottom),
3377 hdcSrc, 0, 0, SRCCOPY);
3378 }
3379 else
3380 {
3381 int margin;
3383 FillRect(hdc, &rzone, hbr);
3384
3385 /* Draw the header bitmap. It's always centered like a
3386 * common 49 x 49 bitmap. */
3387 margin = (rzone.bottom - 49) / 2;
3388 BitBlt(hdc, rzone.right - 49 - margin, margin,
3389 min(bm.bmWidth, 49), min(bm.bmHeight, 49),
3390 hdcSrc, 0, 0, SRCCOPY);
3391
3392 /* NOTE: Native COMCTL32 draws a white stripe over the bitmap
3393 * if its height is smaller than 49 pixels. Because the reason
3394 * for this bug is unknown the current code doesn't try to
3395 * replicate it. */
3396 }
3397
3399 }
3400
3401 clrOld = SetTextColor (hdc, 0x00000000);
3402 oldBkMode = SetBkMode (hdc, TRANSPARENT);
3403
3404 if (ppshpage->dwFlags & PSP_USEHEADERTITLE) {
3405 SetRect(&r, 20, 10, 0, 0);
3406 if (!IS_INTRESOURCE(ppshpage->pszHeaderTitle))
3407 DrawTextW(hdc, ppshpage->pszHeaderTitle, -1, &r, DT_LEFT | DT_SINGLELINE | DT_NOCLIP);
3408 else
3409 {
3410 nLength = LoadStringW(ppshpage->hInstance, (UINT_PTR)ppshpage->pszHeaderTitle,
3411 szBuffer, 256);
3412 if (nLength != 0)
3413 {
3415 }
3416 }
3417 }
3418
3419 if (ppshpage->dwFlags & PSP_USEHEADERSUBTITLE) {
3420 SelectObject(hdc, psInfo->hFont);
3421 SetRect(&r, 40, 25, rzone.right - 69, rzone.bottom);
3422#ifdef __REACTOS__
3423 if (!IS_INTRESOURCE(ppshpage->pszHeaderSubTitle))
3424#else
3425 if (!IS_INTRESOURCE(ppshpage->pszHeaderTitle))
3426#endif
3427 DrawTextW(hdc, ppshpage->pszHeaderSubTitle, -1, &r, DT_LEFT | DT_WORDBREAK);
3428 else
3429 {
3430 nLength = LoadStringW(ppshpage->hInstance, (UINT_PTR)ppshpage->pszHeaderSubTitle,
3431 szBuffer, 256);
3432 if (nLength != 0)
3433 {
3434 DrawTextW(hdc, szBuffer, nLength, &r, DT_LEFT | DT_WORDBREAK);
3435 }
3436 }
3437 }
3438
3439 offsety = rzone.bottom + 2;
3440
3441 SetTextColor(hdc, clrOld);
3442 SetBkMode(hdc, oldBkMode);
3443 SelectObject(hdc, hOldFont);
3444 }
3445
3446 if ( (ppshpage && (ppshpage->dwFlags & PSP_HIDEHEADER)) &&
3447 (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
3448#ifdef __REACTOS__
3449 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
3450 (psInfo->ppshheader.u4.hbmWatermark) )
3451#else
3452 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) )
3453#endif
3454 {
3455 HWND hwndLine = GetDlgItem(hwnd, IDC_SUNKEN_LINE);
3456
3457 GetClientRect(hwndLine, &r);
3458 MapWindowPoints(hwndLine, hwnd, (LPPOINT) &r, 2);
3459 SetRect(&rzone, 0, 0, r.right, r.top - 1);
3460
3462 FillRect(hdc, &rzone, hbr);
3463
3464 GetObjectW(psInfo->ppshheader.u4.hbmWatermark, sizeof(BITMAP), &bm);
3465 hbmp = SelectObject(hdcSrc, psInfo->ppshheader.u4.hbmWatermark);
3466
3467 /* The watermark is truncated to a width of 164 pixels */
3468 r.right = min(r.right, 164);
3469 BitBlt(hdc, 0, offsety, min(bm.bmWidth, r.right),
3470 min(bm.bmHeight, r.bottom), hdcSrc, 0, 0, SRCCOPY);
3471
3472 /* If the bitmap is not big enough, fill the remaining area
3473 with the color of pixel (0,0) of bitmap - see MSDN */
3474 if (r.top > bm.bmHeight) {
3475 r.bottom = r.top - 1;
3476 r.top = bm.bmHeight;
3477 r.left = 0;
3478 r.right = bm.bmWidth;
3479 hbr = CreateSolidBrush(GetPixel(hdcSrc, 0, 0));
3480 FillRect(hdc, &r, hbr);
3481 DeleteObject(hbr);
3482 }
3483
3485 }
3486
3487 if (psInfo->ppshheader.dwFlags & PSH_USEHPLWATERMARK)
3488 SelectPalette(hdc, hOldPal, FALSE);
3489
3491
3492 if (!hdcParam) EndPaint(hwnd, &ps);
3493
3494 return 0;
3495}
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
HBITMAP hbmp
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
Definition: bl.h:1331
_In_ DWORD nLength
Definition: wincon.h:473
DWORD COLORREF
Definition: windef.h:300
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define TRANSPARENT
Definition: wingdi.h:950
#define SRCCOPY
Definition: wingdi.h:333
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI DeleteDC(_In_ HDC)
#define COLOR_WINDOW
Definition: winuser.h:918
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define DT_SINGLELINE
Definition: winuser.h:540
#define DT_NOCLIP
Definition: winuser.h:536
#define DT_LEFT
Definition: winuser.h:534
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define DT_WORDBREAK
Definition: winuser.h:544
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
static HDC hdcSrc
Definition: xlate.c:32

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_PressButton()

static void PROPSHEET_PressButton ( HWND  hwndDlg,
int  buttonID 
)
static

Definition at line 1898 of file propsheet.c.

1899{
1900 TRACE("buttonID %d\n", buttonID);
1901 switch (buttonID)
1902 {
1903 case PSBTN_APPLYNOW:
1905 break;
1906 case PSBTN_BACK:
1907 PROPSHEET_Back(hwndDlg);
1908 break;
1909 case PSBTN_CANCEL:
1910 PROPSHEET_DoCommand(hwndDlg, IDCANCEL);
1911 break;
1912 case PSBTN_FINISH:
1913 PROPSHEET_Finish(hwndDlg);
1914 break;
1915 case PSBTN_HELP:
1916 PROPSHEET_DoCommand(hwndDlg, IDHELP);
1917 break;
1918 case PSBTN_NEXT:
1919 PROPSHEET_Next(hwndDlg);
1920 break;
1921 case PSBTN_OK:
1922 PROPSHEET_DoCommand(hwndDlg, IDOK);
1923 break;
1924 default:
1925 FIXME("Invalid button index %d\n", buttonID);
1926 }
1927}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define PSBTN_CANCEL
Definition: prsht.h:151
#define PSBTN_FINISH
Definition: prsht.h:148
#define PSBTN_NEXT
Definition: prsht.h:147
#define PSBTN_BACK
Definition: prsht.h:146
#define PSBTN_APPLYNOW
Definition: prsht.h:150
#define PSBTN_HELP
Definition: prsht.h:152
#define PSBTN_OK
Definition: prsht.h:149

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_PropertySheet()

static INT_PTR PROPSHEET_PropertySheet ( PropSheetInfo psInfo,
BOOL  unicode 
)
static

Definition at line 2838 of file propsheet.c.

2839{
2840 INT_PTR bRet = 0;
2841 HWND parent = NULL;
2842 if (psInfo->active_page >= psInfo->nPages) psInfo->active_page = 0;
2843 TRACE("startpage: %d of %d pages\n", psInfo->active_page, psInfo->nPages);
2844
2845 psInfo->unicode = unicode;
2846 psInfo->ended = FALSE;
2847
2848 if(!psInfo->isModeless)
2849 {
2850 parent = psInfo->ppshheader.hwndParent;
2852 }
2853 bRet = PROPSHEET_CreateDialog(psInfo);
2854 if(!psInfo->isModeless)
2855 bRet = do_loop(psInfo);
2856 return bRet;
2857}
static INT_PTR PROPSHEET_CreateDialog(PropSheetInfo *psInfo)
Definition: propsheet.c:600
static INT do_loop(const PropSheetInfo *psInfo)
Definition: propsheet.c:2794

Referenced by PropertySheetA(), and PropertySheetW().

◆ PROPSHEET_QuerySiblings()

static LRESULT PROPSHEET_QuerySiblings ( HWND  hwndDlg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 2227 of file propsheet.c.

2229{
2230 int i = 0;
2231 HWND hwndPage;
2232 LRESULT msgResult = 0;
2233 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2234
2235 while ((i < psInfo->nPages) && (msgResult == 0))
2236 {
2237 hwndPage = psInfo->proppage[i].hwndPage;
2238 msgResult = SendMessageW(hwndPage, PSM_QUERYSIBLINGS, wParam, lParam);
2239 i++;
2240 }
2241
2242 return msgResult;
2243}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_RecalcPageSizes()

static BOOL PROPSHEET_RecalcPageSizes ( HWND  hwndDlg)
static

Definition at line 2709 of file propsheet.c.

2710{
2711 FIXME("(%p): stub\n", hwndDlg);
2712 return FALSE;
2713}

Referenced by PROPSHEET_DialogProc().

◆ PROPSHEET_RemovePage()

static BOOL PROPSHEET_RemovePage ( HWND  hwndDlg,
int  index,
HPROPSHEETPAGE  hpage 
)
static

Definition at line 2352 of file propsheet.c.

2355{
2356 PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
2357 HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
2358 PropPageInfo* oldPages;
2359
2360 TRACE("index %d, hpage %p\n", index, hpage);
2361 if (!psInfo) {
2362 return FALSE;
2363 }
2364
2365 index = PROPSHEET_GetPageIndex(hpage, psInfo, index);
2366
2367 /* Make sure that index is within range */
2368 if (index < 0 || index >= psInfo->nPages)
2369 {
2370 TRACE("Could not find page to remove!\n");
2371 return FALSE;
2372 }
2373
2374 TRACE("total pages %d removing page %d active page %d\n",
2375 psInfo->nPages, index, psInfo->active_page);
2376 /*
2377 * Check if we're removing the active page.
2378 */
2379 if (index == psInfo->active_page)
2380 {
2381 if (psInfo->nPages > 1)
2382 {
2383 if (index > 0)
2384 {
2385 /* activate previous page */
2386 PROPSHEET_SetCurSel(hwndDlg, index - 1, -1, 0);
2387 }
2388 else
2389 {
2390 /* activate the next page */
2391 PROPSHEET_SetCurSel(hwndDlg, index + 1, 1, 0);
2392 psInfo->active_page = index;
2393 }
2394 }
2395 else
2396 {
2397 psInfo->active_page = -1;
2398 if (!psInfo->isModeless)
2399 {
2400 psInfo->ended = TRUE;
2401 return TRUE;
2402 }
2403 }
2404 }
2405 else if (index < psInfo->active_page)
2406 psInfo->active_page--;
2407
2408 /* Unsubclass the page dialog window */
2409 if((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD) &&
2410 (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
2411 ((PROPSHEETPAGEW*)psInfo->proppage[index].hpage)->dwFlags & PSP_HIDEHEADER))
2412 {
2415 }
2416
2417 /* Destroy page dialog window */
2419
2420 /* Free page resources */
2421 if(psInfo->proppage[index].hpage)
2422 {
2424
2425 if (psp->dwFlags & PSP_USETITLE)
2426 Free ((LPVOID)psInfo->proppage[index].pszText);
2427
2429 }
2430
2431 /* Remove the tab */
2432 SendMessageW(hwndTabControl, TCM_DELETEITEM, index, 0);
2433
2434 oldPages = psInfo->proppage;
2435 psInfo->nPages--;
2436 psInfo->proppage = Alloc(sizeof(PropPageInfo) * psInfo->nPages);
2437
2438 if (index > 0)
2439 memcpy(&psInfo->proppage[0], &oldPages[0], index * sizeof(PropPageInfo));
2440
2441 if (index < psInfo->nPages)
2442 memcpy(&psInfo->proppage[index], &oldPages[index + 1],
2443 (psInfo->nPages - index) * sizeof(PropPageInfo));
2444
2445 Free(oldPages);
2446
2447 return FALSE;
2448}
#define TCM_DELETEITEM
Definition: commctrl.h:4053

Referenced by PROPSHEET_DialogProc(), and PROPSHEET_SetCurSel().

◆ PROPSHEET_SetCurSel()

static BOOL PROPSHEET_SetCurSel ( HWND  hwndDlg,
int  index,
int  skipdir,
HPROPSHEETPAGE  hpage 
)
static

Definition at line 1982 of file propsheet.c.

1987{
1988 PropSheetInfo* psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
1989 HWND hwndHelp = GetDlgItem(hwndDlg, IDHELP);
1990 HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
1991
1992 TRACE("index %d, skipdir %d, hpage %p\n", index, skipdir, hpage);
1993
1994 index = PROPSHEET_GetPageIndex(hpage, psInfo, index);
1995
1996 if (index < 0 || index >= psInfo->nPages)
1997 {
1998 TRACE("Could not find page to select!\n");
1999 return FALSE;
2000 }
2001
2002 /* unset active page while doing this transition. */
2003 if (psInfo->active_page != -1)
2004 ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE);
2005 psInfo->active_page = -1;
2006
2007 while (1) {
2008 int result;
2009 PSHNOTIFY psn;
2010 RECT rc;
2012
2013 if (hwndTabControl)
2014 SendMessageW(hwndTabControl, TCM_SETCURSEL, index, 0);
2015
2016 psn.hdr.code = PSN_SETACTIVE;
2017 psn.hdr.hwndFrom = hwndDlg;
2018 psn.hdr.idFrom = 0;
2019 psn.lParam = 0;
2020
2021 if (!psInfo->proppage[index].hwndPage) {
2022 if(!PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage)) {
2023 PROPSHEET_RemovePage(hwndDlg, index, NULL);
2024 if(index >= psInfo->nPages)
2025 index--;
2026 if(index < 0)
2027 return FALSE;
2028 continue;
2029 }
2030 }
2031
2032 /* Resize the property sheet page to the fit in the Tab control
2033 * (for regular property sheets) or to fit in the client area (for
2034 * wizards).
2035 * NOTE: The resizing happens every time the page is selected and
2036 * not only when it's created (some applications depend on it). */
2037 PROPSHEET_GetPageRect(psInfo, hwndDlg, &rc, ppshpage);
2038 TRACE("setting page %p, rc (%s) w=%d, h=%d\n",
2039 psInfo->proppage[index].hwndPage, wine_dbgstr_rect(&rc),
2040 rc.right - rc.left, rc.bottom - rc.top);
2042 rc.left, rc.top,
2043 rc.right - rc.left, rc.bottom - rc.top, 0);
2044
2045 result = SendMessageW(psInfo->proppage[index].hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
2046 if (!result)
2047 break;
2048 if (result == -1) {
2049 index+=skipdir;
2050 if (index < 0) {
2051 index = 0;
2052 WARN("Tried to skip before first property sheet page!\n");
2053 break;
2054 }
2055 if (index >= psInfo->nPages) {
2056 WARN("Tried to skip after last property sheet page!\n");
2057 index = psInfo->nPages-1;
2058 break;
2059 }
2060 }
2061 else if (result != 0)
2062 {
2063 int old_index = index;
2065 if(index >= psInfo->nPages) {
2066 index = old_index;
2067 WARN("Tried to skip to nonexistent page by res id\n");
2068 break;
2069 }
2070 continue;
2071 }
2072 }
2073
2074 /* Invalidate the header area */
2075 if ( (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
2076 (psInfo->ppshheader.dwFlags & PSH_HEADER) )
2077 {
2078 HWND hwndLineHeader = GetDlgItem(hwndDlg, IDC_SUNKEN_LINEHEADER);
2079 RECT r;
2080
2081 GetClientRect(hwndLineHeader, &r);
2082 MapWindowPoints(hwndLineHeader, hwndDlg, (LPPOINT) &r, 2);
2083 SetRect(&r, 0, 0, r.right + 1, r.top - 1);
2084
2085 InvalidateRect(hwndDlg, &r, TRUE);
2086 }
2087
2088 /*
2089 * Display the new page.
2090 */
2091 PROPSHEET_ShowPage(hwndDlg, index, psInfo);
2092
2093 if (psInfo->proppage[index].hasHelp)
2094 EnableWindow(hwndHelp, TRUE);
2095 else
2096 EnableWindow(hwndHelp, FALSE);
2097
2098 return TRUE;
2099}