ReactOS  0.4.14-dev-55-g2da92ac
folder_options.cpp
Go to the documentation of this file.
1 /*
2  * Folder Options
3  *
4  * Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
5  * Copyright 2016-2018 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #include "precomp.h"
23 
25 
26 // Folder Options:
27 // CLASSKEY = HKEY_CLASSES_ROOT\CLSID\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
28 
30 // strings
31 
32 // path to shell32
33 LPCWSTR g_pszShell32 = L"%SystemRoot%\\system32\\shell32.dll";
34 
35 // the space characters
36 LPCWSTR g_pszSpace = L" \t\n\r\f\v";
37 
39 // utility functions
40 
42 {
43  BITMAPINFO bi;
44  LPVOID pvBits;
45 
46  ZeroMemory(&bi, sizeof(bi));
47  bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
48  bi.bmiHeader.biWidth = cx;
49  bi.bmiHeader.biHeight = cy;
50  bi.bmiHeader.biPlanes = 1;
51  bi.bmiHeader.biBitCount = 24;
53 
54  HBITMAP hbm = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
55  return hbm;
56 }
57 
59 {
61  if (!hDC)
62  return NULL;
63 
65  if (!hbm)
66  {
67  DeleteDC(hDC);
68  return NULL;
69  }
70 
71  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
72  {
73  RECT rc = { 0, 0, cx, cy };
74  FillRect(hDC, &rc, HBRUSH(COLOR_3DFACE + 1));
75  if (hIcon)
76  {
77  DrawIconEx(hDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
78  }
79  }
80  SelectObject(hDC, hbmOld);
81  DeleteDC(hDC);
82 
83  return hbm;
84 }
85 
87 {
88  INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
89  INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
90 
91  HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
92  if (hbm == NULL)
93  return NULL; // failure
94 
95  RECT Rect, BoxRect;
96  SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
97  BoxRect = Rect;
98  InflateRect(&BoxRect, -1, -1);
99 
100  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
101  {
103  if (bCheck)
104  uState |= DFCS_CHECKED;
105  if (!bEnabled)
106  uState |= DFCS_INACTIVE;
107  DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
108  }
109  SelectObject(hDC, hbmOld);
110 
111  return hbm; // success
112 }
113 
115 {
116  INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
117  INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
118 
119  HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
120  if (hbm == NULL)
121  return NULL; // failure
122 
123  RECT Rect, BoxRect;
124  SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
125  BoxRect = Rect;
126  InflateRect(&BoxRect, -1, -1);
127 
128  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
129  {
131  FillRect(hDC, &BoxRect, HBRUSH(GetStockObject(BLACK_BRUSH)));
132  }
133  SelectObject(hDC, hbmOld);
134 
135  return hbm; // success
136 }
137 
139 {
140  INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
141  INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
142 
143  HBITMAP hbm = Create24BppBitmap(hDC, cxSmallIcon, cySmallIcon);
144  if (hbm == NULL)
145  return NULL; // failure
146 
147  RECT Rect, BoxRect;
148  SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
149  BoxRect = Rect;
150  InflateRect(&BoxRect, -1, -1);
151 
152  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
153  {
155  if (bCheck)
156  uState |= DFCS_CHECKED;
157  if (!bEnabled)
158  uState |= DFCS_INACTIVE;
159  DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
160  }
161  SelectObject(hDC, hbmOld);
162 
163  return hbm; // success
164 }
165 
167 {
168  INT cxSmallIcon = GetSystemMetrics(SM_CXSMICON);
169  INT cySmallIcon = GetSystemMetrics(SM_CYSMICON);
170 
171  HBITMAP hbm = CreateBitmap(cxSmallIcon, cySmallIcon, 1, 1, NULL);
172  if (hbm == NULL)
173  return NULL; // failure
174 
175  RECT Rect, BoxRect;
176  SetRect(&Rect, 0, 0, cxSmallIcon, cySmallIcon);
177  BoxRect = Rect;
178  InflateRect(&BoxRect, -1, -1);
179 
180  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
181  {
184  DrawFrameControl(hDC, &BoxRect, DFC_BUTTON, uState);
185  }
186  SelectObject(hDC, hbmOld);
187 
188  return hbm; // success
189 }
190 
192 
193 // CMSGlobalFolderOptionsStub --- The owner window of Folder Options.
194 // This window hides taskbar button of Folder Options.
195 class CMSGlobalFolderOptionsStub : public CWindowImpl<CMSGlobalFolderOptionsStub>
196 {
197 public:
198  DECLARE_WND_CLASS_EX(_T("MSGlobalFolderOptionsStub"), 0, COLOR_WINDOWTEXT)
199 
201  END_MSG_MAP()
202 };
203 
205 
206 EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj);
207 
208 static int CALLBACK
210 {
211  // NOTE: This callback is needed to set large icon correctly.
212  HICON hIcon;
213  switch (uMsg)
214  {
215  case PSCB_INITIALIZED:
216  {
218  SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
219  break;
220  }
221  }
222  return 0;
223 }
224 
225 static VOID
227 {
228  PROPSHEETHEADERW pinfo;
229  HPROPSHEETPAGE hppages[3];
230  HPROPSHEETPAGE hpage;
231  UINT num_pages = 0;
232  WCHAR szOptions[100];
233 
235  if (hpage)
236  hppages[num_pages++] = hpage;
237 
239  if (hpage)
240  hppages[num_pages++] = hpage;
241 
243  if (hpage)
244  hppages[num_pages++] = hpage;
245 
246  szOptions[0] = 0;
247  LoadStringW(shell32_hInstance, IDS_FOLDER_OPTIONS, szOptions, _countof(szOptions));
248  szOptions[_countof(szOptions) - 1] = 0;
249 
250  // the stub window to hide taskbar button
254  if (!stub.Create(NULL, NULL, NULL, style, exstyle))
255  {
256  ERR("stub.Create failed\n");
257  return;
258  }
259 
260  memset(&pinfo, 0x0, sizeof(PROPSHEETHEADERW));
261  pinfo.dwSize = sizeof(PROPSHEETHEADERW);
262  pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_USEICONID | PSH_USECALLBACK;
263  pinfo.hwndParent = stub;
264  pinfo.nPages = num_pages;
265  pinfo.phpage = hppages;
267  pinfo.pszCaption = szOptions;
268  pinfo.pfnCallback = PropSheetProc;
269 
270  PropertySheetW(&pinfo);
271 
272  stub.DestroyWindow();
273 }
274 
275 static VOID
277 {
278  switch(fOptions)
279  {
280  case 0:
282  break;
283 
284  case 1:
285  // show taskbar options dialog
286  FIXME("notify explorer to show taskbar options dialog");
287  //PostMessage(GetShellWindow(), WM_USER+22, fOptions, 0);
288  break;
289 
290  default:
291  FIXME("unrecognized options id %d\n", fOptions);
292  }
293 }
294 
295 /*************************************************************************
296  * Options_RunDLL (SHELL32.@)
297  */
300 {
302 }
303 
304 /*************************************************************************
305  * Options_RunDLLA (SHELL32.@)
306  */
309 {
311 }
312 
313 /*************************************************************************
314  * Options_RunDLLW (SHELL32.@)
315  */
318 {
320 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
static int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
#define WS_DISABLED
Definition: pedump.c:621
HWND hwndParent
Definition: prsht.h:277
#define DFCS_FLAT
Definition: winuser.h:510
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
static HICON
Definition: imagelist.c:84
#define DFC_BUTTON
Definition: winuser.h:476
#define IDI_SHELL_FOLDER_OPTIONS
Definition: shresdef.h:573
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1471
GLint x0
Definition: linetemp.h:95
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define DFCS_CHECKED
Definition: winuser.h:504
Definition: ftp_var.h:139
LPCWSTR g_pszShell32
HBITMAP CreateRadioMask(HDC hDC)
#define _countof(array)
Definition: fontsub.cpp:30
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
static VOID ShowFolderOptionsDialog(HWND hWnd, HINSTANCE hInst)
static VOID Options_RunDLLCommon(HWND hWnd, HINSTANCE hInst, int fOptions, DWORD nCmdShow)
static HDC
Definition: imagelist.c:92
#define DFCS_INACTIVE
Definition: winuser.h:502
#define CALLBACK
Definition: compat.h:27
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
Definition: atlwin.h:1876
HWND hWnd
Definition: settings.c:17
Definition: stubgen.c:11
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define ZeroMemory
Definition: winbase.h:1635
#define SM_CYSMICON
Definition: winuser.h:1003
#define WHITE_BRUSH
Definition: wingdi.h:901
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
struct _PROPSHEETHEADERW PROPSHEETHEADERW
#define PSH_USECALLBACK
Definition: prsht.h:48
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:56
HBITMAP CreateCheckMask(HDC hDC)
EXTERN_C VOID WINAPI Options_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow)
HBITMAP Create24BppBitmap(HDC hDC, INT cx, INT cy)
struct _stub stub
#define COLOR_3DFACE
Definition: winuser.h:919
#define PSH_USEICONID
Definition: prsht.h:42
HINSTANCE shell32_hInstance
Definition: misc.cpp:82
LPCWSTR pszCaption
Definition: prsht.h:283
unsigned int BOOL
Definition: ntddk_ex.h:94
HBITMAP CreateCheckImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
#define FIXME(fmt,...)
Definition: debug.h:110
DWORD biCompression
Definition: amvideo.idl:35
PFNPROPSHEETCALLBACK pfnCallback
Definition: prsht.h:293
LPCWSTR g_pszSpace
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2902
const char * LPCSTR
Definition: xmlstorage.h:183
#define BLACK_BRUSH
Definition: wingdi.h:895
#define WS_CAPTION
Definition: pedump.c:624
#define _T(x)
Definition: vfdio.h:22
__wchar_t WCHAR
Definition: xmlstorage.h:180
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:1997
#define END_MSG_MAP()
Definition: atlwin.h:1789
#define COLOR_WINDOWTEXT
Definition: winuser.h:911
WINE_DEFAULT_DEBUG_CHANNEL(fprop)
#define DFCS_MONO
Definition: winuser.h:511
#define WINAPI
Definition: msvc.h:8
LPCWSTR pszIcon
Definition: prsht.h:281
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD dwSize
Definition: prsht.h:275
DWORD dwFlags
Definition: prsht.h:276
#define SM_CXSMICON
Definition: winuser.h:1002
INT_PTR CALLBACK FolderOptionsFileTypesDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:1664
static const WCHAR L[]
Definition: oid.c:1250
#define IDD_FOLDER_OPTIONS_GENERAL
Definition: shresdef.h:335
HBITMAP CreateRadioImage(HDC hDC, BOOL bCheck, BOOL bEnabled)
#define DI_NORMAL
Definition: wingdi.h:72
EXTERN_C VOID WINAPI Options_RunDLL(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
#define IDS_FOLDER_OPTIONS
Definition: resource.h:129
#define IDD_FOLDER_OPTIONS_FILETYPES
Definition: shresdef.h:337
HPROPSHEETPAGE * phpage
Definition: prsht.h:291
#define ERR(fmt,...)
Definition: debug.h:109
#define DFCS_BUTTONCHECK
Definition: winuser.h:496
static HDC hDC
Definition: 3dtext.c:33
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
HINSTANCE hInst
Definition: dxdiag.c:13
#define IDD_FOLDER_OPTIONS_VIEW
Definition: shresdef.h:336
#define PSCB_INITIALIZED
Definition: prsht.h:75
BOOL WINAPI DeleteDC(_In_ HDC)
INT_PTR CALLBACK FolderOptionsViewDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: view.cpp:934
HICON hIcon
Definition: msconfig.c:44
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:197
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
unsigned int UINT
Definition: ndis.h:50
EXTERN_C VOID WINAPI Options_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow)
INT WINAPI StrToIntW(LPCWSTR lpString)
Definition: string.c:411
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1770
_Out_opt_ int * cx
Definition: commctrl.h:570
HBITMAP BitmapFromIcon(HICON hIcon, INT cx, INT cy)
EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
static HBITMAP
Definition: button.c:44
INT WINAPI StrToIntA(LPCSTR lpszStr)
Definition: string.c:374
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HPROPSHEETPAGE SH_CreatePropertySheetPage(LPCSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
#define DFCS_BUTTONRADIOMASK
Definition: winuser.h:498
#define DIB_RGB_COLORS
Definition: wingdi.h:366
#define EXTERN_C
Definition: basetyps.h:12
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
Arabic default style
Definition: afstyles.h:93
#define memset(x, y, z)
Definition: compat.h:39
INT_PTR CALLBACK FolderOptionsGeneralDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: general.cpp:365
#define BI_RGB
Definition: precomp.h:34
LPARAM lParam
Definition: combotst.c:139
#define DFCS_BUTTONRADIOIMAGE
Definition: winuser.h:497
struct Rect Rect
#define ICON_BIG
Definition: tnclass.cpp:51
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)