2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Display Control Panel
4 * FILE: dll/cpl/desk/advmon.c
5 * PURPOSE: Advanced monitor/display settings
10 #define MAX_ADVANCED_PAGES 32
13 PropSheetAddPage(HPROPSHEETPAGE hpage
, LPARAM lParam
)
15 PROPSHEETHEADER
*ppsh
= (PROPSHEETHEADER
*)lParam
;
16 if (ppsh
!= NULL
&& ppsh
->nPages
< MAX_ADVANCED_PAGES
)
18 ppsh
->phpage
[ppsh
->nPages
++] = hpage
;
26 InitPropSheetPage(PROPSHEETHEADER
*ppsh
, WORD idDlg
, DLGPROC DlgProc
, LPARAM lParam
)
31 if (ppsh
->nPages
< MAX_ADVANCED_PAGES
)
33 ZeroMemory(&psp
, sizeof(psp
));
34 psp
.dwSize
= sizeof(psp
);
35 psp
.dwFlags
= PSP_DEFAULT
;
36 psp
.hInstance
= hApplet
;
37 psp
.pszTemplate
= MAKEINTRESOURCE(idDlg
);
38 psp
.pfnDlgProc
= DlgProc
;
41 hPage
= CreatePropertySheetPage(&psp
);
44 return PropSheetAddPage(hPage
, (LPARAM
)ppsh
);
52 BuildAdvPropTitle(IDataObject
*pdo
, LPTSTR lpBuffer
, DWORD dwBufferLen
)
54 UINT uiMonitorName
, uiDisplayName
;
55 LPTSTR lpMonitorName
, lpDisplayName
;
56 TCHAR szFormatBuff
[32];
58 if (!LoadString(hApplet
, IDS_ADVANCEDTITLEFMT
, szFormatBuff
, sizeof(szFormatBuff
) / sizeof(szFormatBuff
[0])))
60 szFormatBuff
[0] = _T('\0');
63 uiMonitorName
= RegisterClipboardFormat(DESK_EXT_MONITORNAME
);
64 uiDisplayName
= RegisterClipboardFormat(DESK_EXT_DISPLAYNAME
);
66 lpMonitorName
= QueryDeskCplString(pdo
, uiMonitorName
);
67 lpDisplayName
= QueryDeskCplString(pdo
, uiDisplayName
);
69 _sntprintf(lpBuffer
, dwBufferLen
, szFormatBuff
, lpMonitorName
, lpDisplayName
);
71 if (lpMonitorName
!= NULL
)
72 LocalFree((HLOCAL
)lpMonitorName
);
73 if (lpDisplayName
!= NULL
)
74 LocalFree((HLOCAL
)lpDisplayName
);
78 typedef HPSXA (WINAPI
* CPSEAE
)(HKEY
,LPCWSTR
,UINT
,IDataObject
*);
81 DisplayAdvancedSettings(HWND hWndParent
, PDISPLAY_DEVICE_ENTRY DisplayDevice
)
84 HPROPSHEETPAGE hpsp
[MAX_ADVANCED_PAGES
];
86 HPSXA hpsxaDev
, hpsxaDisp
;
89 HMODULE hShell32
= NULL
;
90 CPSEAE msvc_SHCreatePropSheetExtArrayEx
;
92 /* silence gcc warning */
93 msvc_SHCreatePropSheetExtArrayEx
= NULL
;
95 /* FIXME: Build the "%s and %s" caption string for the monitor and adapter name */
96 szCaption
[0] = _T('\0');
98 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
99 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
100 psh
.dwFlags
= PSH_PROPTITLE
;
101 psh
.hwndParent
= hWndParent
;
102 psh
.hInstance
= hApplet
;
103 psh
.pszCaption
= szCaption
;
106 InitPropSheetPage(&psh
, IDD_ADVANCED_GENERAL
, AdvGeneralPageProc
, (LPARAM
)DisplayDevice
);
108 pdo
= CreateDevSettings(DisplayDevice
);
111 BuildAdvPropTitle(pdo
, szCaption
, sizeof(szCaption
) / sizeof(szCaption
[0]));
114 hShell32
= LoadLibrary(_T("shell32.dll"));
117 msvc_SHCreatePropSheetExtArrayEx
= (CPSEAE
)GetProcAddress(hShell32
, (LPCSTR
)194);
118 hpsxaDev
= msvc_SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Device"), MAX_ADVANCED_PAGES
- psh
.nPages
, pdo
);
120 hpsxaDev
= SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Device"), MAX_ADVANCED_PAGES
- psh
.nPages
, pdo
);
122 if (hpsxaDev
!= NULL
)
123 SHAddFromPropSheetExtArray(hpsxaDev
, PropSheetAddPage
, (LPARAM
)&psh
);
126 hpsxaDisp
= msvc_SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Device"), MAX_ADVANCED_PAGES
- psh
.nPages
, pdo
);
128 hpsxaDisp
= SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Display"), MAX_ADVANCED_PAGES
- psh
.nPages
, pdo
);
130 if (hpsxaDisp
!= NULL
)
131 SHAddFromPropSheetExtArray(hpsxaDisp
, PropSheetAddPage
, (LPARAM
)&psh
);
133 Ret
= (LONG
)(PropertySheet(&psh
) != -1);
135 if (hpsxaDisp
!= NULL
)
136 SHDestroyPropSheetExtArray(hpsxaDisp
);
138 if (hpsxaDev
!= NULL
)
139 SHDestroyPropSheetExtArray(hpsxaDev
);
141 IDataObject_Release(pdo
);
144 FreeLibrary(hShell32
);