3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Display Control Panel
5 * FILE: lib/cpl/desk/background.c
6 * PURPOSE: Background property page
8 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
9 * Alexey Minnekhanov (minlexx@rambler.ru)
14 #define MAX_BACKGROUNDS 100
16 #define PLACEMENT_CENTER 0
17 #define PLACEMENT_STRETCH 1
18 #define PLACEMENT_TILE 2
22 BOOL bWallpaper
; /* Is this background a wallpaper */
24 TCHAR szFilename
[MAX_PATH
];
25 TCHAR szDisplayName
[256];
29 typedef struct _GLOBAL_DATA
31 BackgroundItem backgroundItems
[MAX_BACKGROUNDS
];
33 PDIBITMAP pWallpaperBitmap
;
35 int placementSelection
;
36 int backgroundSelection
;
38 COLORREF backgroundDesktopColor
;
39 COLORREF custom_colors
[16];
41 int listViewItemCount
;
46 } GLOBAL_DATA
, *PGLOBAL_DATA
;
50 /* Add the images in the C:\ReactOS directory and the current wallpaper if any */
52 AddListViewItems(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
)
56 TCHAR szSearchPath
[MAX_PATH
];
57 TCHAR szFileTypes
[MAX_PATH
];
64 TCHAR wallpaperFilename
[MAX_PATH
];
65 DWORD bufferSize
= sizeof(wallpaperFilename
);
66 DWORD varType
= REG_SZ
;
69 BackgroundItem
*backgroundItem
= NULL
;
70 TCHAR separators
[] = TEXT(";");
72 HWND hwndBackgroundList
;
75 hwndBackgroundList
= GetDlgItem(hwndDlg
, IDC_BACKGROUND_LIST
);
77 GetClientRect(hwndBackgroundList
, &clientRect
);
79 /* Add a new column to the list */
80 ZeroMemory(&dummy
, sizeof(LV_COLUMN
));
81 dummy
.mask
= LVCF_SUBITEM
| LVCF_WIDTH
;
83 dummy
.cx
= (clientRect
.right
- clientRect
.left
) - GetSystemMetrics(SM_CXVSCROLL
);
84 (void)ListView_InsertColumn(hwndBackgroundList
, 0, &dummy
);
86 /* Add the "None" item */
87 backgroundItem
= &pGlobalData
->backgroundItems
[pGlobalData
->listViewItemCount
];
88 backgroundItem
->bWallpaper
= FALSE
;
91 backgroundItem
->szDisplayName
,
92 sizeof(backgroundItem
->szDisplayName
) / sizeof(TCHAR
));
94 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
95 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
96 listItem
.state
= LVIS_SELECTED
;
97 listItem
.pszText
= backgroundItem
->szDisplayName
;
99 listItem
.iItem
= pGlobalData
->listViewItemCount
;
100 listItem
.lParam
= pGlobalData
->listViewItemCount
;
102 (void)ListView_InsertItem(hwndBackgroundList
, &listItem
);
103 ListView_SetItemState(hwndBackgroundList
, pGlobalData
->listViewItemCount
, LVIS_SELECTED
, LVIS_SELECTED
);
105 pGlobalData
->listViewItemCount
++;
107 /* Add current wallpaper if any */
108 RegOpenKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS
, ®Key
);
110 result
= RegQueryValueEx(regKey
, TEXT("Wallpaper"), 0, &varType
, (LPBYTE
)wallpaperFilename
, &bufferSize
);
111 if ((result
== ERROR_SUCCESS
) && (_tcslen(wallpaperFilename
) > 0))
113 himl
= (HIMAGELIST
)SHGetFileInfo(wallpaperFilename
,
117 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
|
124 (void)ListView_SetImageList(hwndBackgroundList
, himl
, LVSIL_SMALL
);
127 backgroundItem
= &pGlobalData
->backgroundItems
[pGlobalData
->listViewItemCount
];
129 backgroundItem
->bWallpaper
= TRUE
;
131 _tcscpy(backgroundItem
->szDisplayName
, sfi
.szDisplayName
);
132 p
= _tcsrchr(backgroundItem
->szDisplayName
, _T('.'));
135 _tcscpy(backgroundItem
->szFilename
, wallpaperFilename
);
137 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
138 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
139 listItem
.state
= LVIS_SELECTED
;
140 listItem
.pszText
= backgroundItem
->szDisplayName
;
141 listItem
.iImage
= sfi
.iIcon
;
142 listItem
.iItem
= pGlobalData
->listViewItemCount
;
143 listItem
.lParam
= pGlobalData
->listViewItemCount
;
145 (void)ListView_InsertItem(hwndBackgroundList
, &listItem
);
146 ListView_SetItemState(hwndBackgroundList
, pGlobalData
->listViewItemCount
, LVIS_SELECTED
, LVIS_SELECTED
);
148 pGlobalData
->listViewItemCount
++;
154 /* Add all the images in the C:\ReactOS directory. */
156 LoadString(hApplet
, IDS_SUPPORTED_EXT
, szFileTypes
, sizeof(szFileTypes
) / sizeof(TCHAR
));
158 token
= _tcstok(szFileTypes
, separators
);
159 while (token
!= NULL
)
161 GetWindowsDirectory(szSearchPath
, MAX_PATH
);
162 _tcscat(szSearchPath
, TEXT("\\"));
163 _tcscat(szSearchPath
, token
);
165 hFind
= FindFirstFile(szSearchPath
, &fd
);
166 while (hFind
!= INVALID_HANDLE_VALUE
)
168 /* Don't add any hidden bitmaps */
169 if ((fd
.dwFileAttributes
& FILE_ATTRIBUTE_HIDDEN
) == 0)
171 TCHAR filename
[MAX_PATH
];
173 GetWindowsDirectory(filename
, MAX_PATH
);
175 _tcscat(filename
, TEXT("\\"));
176 _tcscat(filename
, fd
.cFileName
);
178 himl
= (HIMAGELIST
)SHGetFileInfo(filename
,
182 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
|
190 (void)ListView_SetImageList(hwndBackgroundList
, himl
, LVSIL_SMALL
);
193 backgroundItem
= &pGlobalData
->backgroundItems
[pGlobalData
->listViewItemCount
];
195 backgroundItem
->bWallpaper
= TRUE
;
197 _tcscpy(backgroundItem
->szDisplayName
, sfi
.szDisplayName
);
198 p
= _tcsrchr(backgroundItem
->szDisplayName
, _T('.'));
201 _tcscpy(backgroundItem
->szFilename
, filename
);
203 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
204 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
205 listItem
.pszText
= backgroundItem
->szDisplayName
;
207 listItem
.iImage
= sfi
.iIcon
;
208 listItem
.iItem
= pGlobalData
->listViewItemCount
;
209 listItem
.lParam
= pGlobalData
->listViewItemCount
;
211 (void)ListView_InsertItem(hwndBackgroundList
, &listItem
);
213 pGlobalData
->listViewItemCount
++;
216 if(!FindNextFile(hFind
, &fd
))
217 hFind
= INVALID_HANDLE_VALUE
;
220 token
= _tcstok(NULL
, separators
);
226 InitBackgroundDialog(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
)
231 DWORD bufferSize
= sizeof(szBuffer
);
232 DWORD varType
= REG_SZ
;
236 pGlobalData
->backgroundDesktopColor
= GetSysColor(COLOR_BACKGROUND
);
238 AddListViewItems(hwndDlg
, pGlobalData
);
240 LoadString(hApplet
, IDS_CENTER
, szString
, sizeof(szString
) / sizeof(TCHAR
));
241 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_INSERTSTRING
, PLACEMENT_CENTER
, (LPARAM
)szString
);
243 LoadString(hApplet
, IDS_STRETCH
, szString
, sizeof(szString
) / sizeof(TCHAR
));
244 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_INSERTSTRING
, PLACEMENT_STRETCH
, (LPARAM
)szString
);
246 LoadString(hApplet
, IDS_TILE
, szString
, sizeof(szString
) / sizeof(TCHAR
));
247 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_INSERTSTRING
, PLACEMENT_TILE
, (LPARAM
)szString
);
249 /* Load the default settings from the registry */
250 result
= RegOpenKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS
, ®Key
);
251 if (result
!= ERROR_SUCCESS
)
253 /* reg key open failed; maybe it does not exist? create it! */
254 DWORD dwDisposition
= 0;
255 result
= RegCreateKeyEx( HKEY_CURRENT_USER
, TEXT("Control Panel\\Desktop"), 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
,
256 ®Key
, &dwDisposition
);
257 /* now the key must be created & opened and regKey points to opened key */
258 /* On error result will not contain ERROR_SUCCESS. I don't know how to handle */
262 result
= RegQueryValueEx(regKey
, TEXT("WallpaperStyle"), 0, &varType
, (LPBYTE
)szBuffer
, &bufferSize
);
263 if (result
== ERROR_SUCCESS
)
265 if (_ttoi(szBuffer
) == 0)
267 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_SETCURSEL
, PLACEMENT_CENTER
, 0);
268 pGlobalData
->placementSelection
= PLACEMENT_CENTER
;
271 if (_ttoi(szBuffer
) == 2)
273 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_SETCURSEL
, PLACEMENT_STRETCH
, 0);
274 pGlobalData
->placementSelection
= PLACEMENT_STRETCH
;
279 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_SETCURSEL
, PLACEMENT_CENTER
, 0);
280 pGlobalData
->placementSelection
= PLACEMENT_CENTER
;
283 result
= RegQueryValueEx(regKey
, TEXT("TileWallpaper"), 0, &varType
, (LPBYTE
)szBuffer
, &bufferSize
);
284 if (result
== ERROR_SUCCESS
)
286 if (_ttoi(szBuffer
) == 1)
288 SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_SETCURSEL
, PLACEMENT_TILE
, 0);
289 pGlobalData
->placementSelection
= PLACEMENT_TILE
;
295 pGlobalData
->hBitmap
= (HBITMAP
) LoadImage(hApplet
, MAKEINTRESOURCE(IDC_MONITOR
), IMAGE_BITMAP
, 0, 0, LR_LOADTRANSPARENT
);
296 if (pGlobalData
->hBitmap
!= NULL
)
298 GetObject(pGlobalData
->hBitmap
, sizeof(BITMAP
), &bitmap
);
300 pGlobalData
->cxSource
= bitmap
.bmWidth
;
301 pGlobalData
->cySource
= bitmap
.bmHeight
;
307 OnColorButton(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
)
309 /* Load custom colors from Registry */
311 LONG res
= ERROR_SUCCESS
;
314 res
= RegCreateKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Appearance"), 0, NULL
, 0,
315 KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
);
316 /* Now the key is either created or opened existing, if res == ERROR_SUCCESS */
317 if (res
== ERROR_SUCCESS
)
320 DWORD dwType
= REG_BINARY
;
321 DWORD cbData
= sizeof(pGlobalData
->custom_colors
);
322 res
= RegQueryValueEx(hKey
, TEXT("CustomColors"), NULL
, &dwType
,
323 (LPBYTE
)pGlobalData
->custom_colors
, &cbData
);
328 /* Launch ChooseColor() dialog */
330 cc
.lStructSize
= sizeof(CHOOSECOLOR
);
331 cc
.hwndOwner
= hwndDlg
;
333 cc
.rgbResult
= pGlobalData
->backgroundDesktopColor
;
334 cc
.lpCustColors
= pGlobalData
->custom_colors
;
335 cc
.Flags
= CC_ANYCOLOR
| /* Causes the dialog box to display all available colors in the set of basic colors. */
336 CC_FULLOPEN
| /* opens dialog in full size */
337 CC_RGBINIT
; /* init chosen color by rgbResult value */
340 cc
.lpTemplateName
= NULL
;
341 if (ChooseColor(&cc
))
343 /* Save selected color to var */
344 pGlobalData
->backgroundDesktopColor
= cc
.rgbResult
;
346 /* Allpy buuton will be activated */
347 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
349 /* Window will be updated :) */
350 InvalidateRect(GetDlgItem(hwndDlg
, IDC_BACKGROUND_PREVIEW
), NULL
, TRUE
);
352 /* Save custom colors to reg. To this moment key must be ceated already. See above */
353 res
= RegOpenKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Appearance"), 0,
355 if (res
== ERROR_SUCCESS
)
358 RegSetValueEx(hKey
, TEXT("CustomColors"), 0, REG_BINARY
,
359 (const BYTE
*)pGlobalData
->custom_colors
, sizeof(pGlobalData
->custom_colors
));
368 * ListView_FindItem() Macro: Searches for a list-view item with the specified
369 * characteristics. Returns the index of the item if successful, or -1 otherwise
372 CheckListViewFilenameExists(HWND hwndList
, LPCTSTR tszFileName
)
377 lvfi
.flags
= LVFI_STRING
; /* search item by EXACT string */
378 lvfi
.psz
= tszFileName
; /* string to search */
380 /* other items of this structure are not valid, besacuse flags are not set. */
381 retVal
= ListView_FindItem(hwndList
, -1, &lvfi
);
383 return TRUE
; /* item found! */
385 return FALSE
; /* item not found. */
390 OnBrowseButton(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
)
393 TCHAR filename
[MAX_PATH
];
394 TCHAR fileTitle
[256];
395 TCHAR filter
[MAX_PATH
];
396 BackgroundItem
*backgroundItem
= NULL
;
399 HWND hwndBackgroundList
;
401 hwndBackgroundList
= GetDlgItem(hwndDlg
, IDC_BACKGROUND_LIST
);
403 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
405 ofn
.lStructSize
= sizeof(OPENFILENAME
);
406 ofn
.hwndOwner
= hwndDlg
;
407 ofn
.lpstrFile
= filename
;
409 LoadString(hApplet
, IDS_BACKGROUND_COMDLG_FILTER
, filter
, sizeof(filter
) / sizeof(TCHAR
));
411 /* Set lpstrFile[0] to '\0' so that GetOpenFileName does not
412 * use the contents of szFile to initialize itself */
413 ofn
.lpstrFile
[0] = TEXT('\0');
414 ofn
.nMaxFile
= MAX_PATH
;
415 ofn
.lpstrFilter
= filter
;
416 ofn
.nFilterIndex
= 0;
417 ofn
.lpstrFileTitle
= fileTitle
;
418 ofn
.nMaxFileTitle
= 256;
419 ofn
.lpstrInitialDir
= NULL
;
420 ofn
.Flags
= OFN_PATHMUSTEXIST
| OFN_FILEMUSTEXIST
;
422 if (GetOpenFileName(&ofn
) == TRUE
)
424 /* Check if there is already a entry that holds this filename */
425 if (CheckListViewFilenameExists(hwndBackgroundList
, ofn
.lpstrFileTitle
) == TRUE
)
428 if (pGlobalData
->listViewItemCount
> (MAX_BACKGROUNDS
- 1))
431 SHGetFileInfo(filename
,
435 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
| SHGFI_DISPLAYNAME
);
437 backgroundItem
= &pGlobalData
->backgroundItems
[pGlobalData
->listViewItemCount
];
439 backgroundItem
->bWallpaper
= TRUE
;
441 _tcscpy(backgroundItem
->szDisplayName
, sfi
.szDisplayName
);
442 _tcscpy(backgroundItem
->szFilename
, filename
);
444 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
445 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
447 listItem
.pszText
= backgroundItem
->szDisplayName
;
448 listItem
.iImage
= sfi
.iIcon
;
449 listItem
.iItem
= pGlobalData
->listViewItemCount
;
450 listItem
.lParam
= pGlobalData
->listViewItemCount
;
452 (void)ListView_InsertItem(hwndBackgroundList
, &listItem
);
454 pGlobalData
->listViewItemCount
++;
460 ListViewItemChanged(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
, int itemIndex
)
462 BackgroundItem
*backgroundItem
= NULL
;
464 pGlobalData
->backgroundSelection
= itemIndex
;
465 backgroundItem
= &pGlobalData
->backgroundItems
[pGlobalData
->backgroundSelection
];
467 if (pGlobalData
->pWallpaperBitmap
!= NULL
)
469 DibFreeImage(pGlobalData
->pWallpaperBitmap
);
470 pGlobalData
->pWallpaperBitmap
= NULL
;
473 if (backgroundItem
->bWallpaper
== TRUE
)
475 pGlobalData
->pWallpaperBitmap
= DibLoadImage(backgroundItem
->szFilename
);
477 if (pGlobalData
->pWallpaperBitmap
== NULL
)
481 InvalidateRect(GetDlgItem(hwndDlg
, IDC_BACKGROUND_PREVIEW
),
484 EnableWindow(GetDlgItem(hwndDlg
, IDC_COLOR_BUTTON
),
485 (backgroundItem
->bWallpaper
== FALSE
? TRUE
: FALSE
));
486 EnableWindow(GetDlgItem(hwndDlg
, IDC_PLACEMENT_COMBO
),
487 backgroundItem
->bWallpaper
);
489 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
494 DrawBackgroundPreview(LPDRAWITEMSTRUCT draw
, PGLOBAL_DATA pGlobalData
)
506 if (pGlobalData
->backgroundItems
[pGlobalData
->backgroundSelection
].bWallpaper
== FALSE
)
508 /* update desktop background color image */
509 hBrush
= CreateSolidBrush(pGlobalData
->backgroundDesktopColor
);
510 FillRect(draw
->hDC
, &draw
->rcItem
, hBrush
);
511 DeleteObject(hBrush
);
515 if (pGlobalData
->pWallpaperBitmap
== NULL
)
518 scaleX
= ((float)GetSystemMetrics(SM_CXSCREEN
) - 1) / (float)draw
->rcItem
.right
;
519 scaleY
= ((float)GetSystemMetrics(SM_CYSCREEN
) - 1) / (float)draw
->rcItem
.bottom
;
521 scaledWidth
= pGlobalData
->pWallpaperBitmap
->width
/ scaleX
;
522 scaledHeight
= pGlobalData
->pWallpaperBitmap
->height
/ scaleY
;
524 posX
= (draw
->rcItem
.right
/ 2) - (scaledWidth
/ 2);
525 posY
= (draw
->rcItem
.bottom
/ 2) - (scaledHeight
/ 2);
527 FillRect(draw
->hDC
, &draw
->rcItem
, GetSysColorBrush(COLOR_BACKGROUND
));
529 SetStretchBltMode(draw
->hDC
, COLORONCOLOR
);
531 switch (pGlobalData
->placementSelection
)
533 case PLACEMENT_CENTER
:
534 StretchDIBits(draw
->hDC
,
541 pGlobalData
->pWallpaperBitmap
->width
,
542 pGlobalData
->pWallpaperBitmap
->height
,
543 pGlobalData
->pWallpaperBitmap
->bits
,
544 pGlobalData
->pWallpaperBitmap
->info
,
549 case PLACEMENT_STRETCH
:
550 StretchDIBits(draw
->hDC
,
557 pGlobalData
->pWallpaperBitmap
->width
,
558 pGlobalData
->pWallpaperBitmap
->height
,
559 pGlobalData
->pWallpaperBitmap
->bits
,
560 pGlobalData
->pWallpaperBitmap
->info
,
566 for (y
= 0; y
< draw
->rcItem
.bottom
; y
+= scaledHeight
)
568 for (x
= 0; x
< draw
->rcItem
.right
; x
+= scaledWidth
)
570 StretchDIBits(draw
->hDC
,
577 pGlobalData
->pWallpaperBitmap
->width
,
578 pGlobalData
->pWallpaperBitmap
->height
,
579 pGlobalData
->pWallpaperBitmap
->bits
,
580 pGlobalData
->pWallpaperBitmap
->info
,
591 SetWallpaper(PGLOBAL_DATA pGlobalData
)
595 RegOpenKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS
, ®Key
);
597 if (pGlobalData
->placementSelection
== PLACEMENT_TILE
)
599 RegSetValueEx(regKey
, TEXT("TileWallpaper"), 0, REG_SZ
, (BYTE
*)TEXT("1"), sizeof(TCHAR
) * 2);
600 RegSetValueEx(regKey
, TEXT("WallpaperStyle"), 0, REG_SZ
, (BYTE
*)TEXT("0"), sizeof(TCHAR
) * 2);
603 if (pGlobalData
->placementSelection
== PLACEMENT_CENTER
)
605 RegSetValueEx(regKey
, TEXT("TileWallpaper"), 0, REG_SZ
, (BYTE
*)TEXT("0"), sizeof(TCHAR
) * 2);
606 RegSetValueEx(regKey
, TEXT("WallpaperStyle"), 0, REG_SZ
, (BYTE
*)TEXT("0"), sizeof(TCHAR
) * 2);
609 if (pGlobalData
->placementSelection
== PLACEMENT_STRETCH
)
611 RegSetValueEx(regKey
, TEXT("TileWallpaper"), 0, REG_SZ
, (BYTE
*)TEXT("0"), sizeof(TCHAR
) * 2);
612 RegSetValueEx(regKey
, TEXT("WallpaperStyle"), 0, REG_SZ
, (BYTE
*)TEXT("2"), sizeof(TCHAR
) * 2);
617 if (pGlobalData
->backgroundItems
[pGlobalData
->backgroundSelection
].bWallpaper
== TRUE
)
619 SystemParametersInfo(SPI_SETDESKWALLPAPER
,
621 pGlobalData
->backgroundItems
[pGlobalData
->backgroundSelection
].szFilename
,
626 SystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, (void*) TEXT(""), SPIF_UPDATEINIFILE
);
631 /* Change system color */
633 SetDesktopBackColor(HWND hwndDlg
, PGLOBAL_DATA pGlobalData
)
635 INT iElement
= COLOR_BACKGROUND
;
639 DWORD red
, green
, blue
;
641 if( !SetSysColors( 1, &iElement
, &pGlobalData
->backgroundDesktopColor
) )
642 MessageBox(hwndDlg
, TEXT("SetSysColor() failed!"), /* these error texts can need internationalization? */
643 TEXT("Error!"), MB_ICONSTOP
);
644 /* Write color to registry key: HKEY_CURRENT_USER\Control Panel\Colors\Background */
646 result
= ERROR_SUCCESS
;
647 result
= RegOpenKeyEx( HKEY_CURRENT_USER
, TEXT("Control Panel\\Colors"), 0, KEY_WRITE
, &hKey
);
648 if( result
!= ERROR_SUCCESS
)
650 /* Key open failed; maybe it does not exist? create it! */
651 result
= RegCreateKeyEx( HKEY_CURRENT_USER
, TEXT("Control Panel\\Colors"), 0, NULL
, 0,
652 KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
);
653 /* Now key must be created and opened and hKey must point at newly created key */
654 /* On error result will not contain ERROR_SUCCESS. I don't know how to handle */
657 red
= GetRValue(pGlobalData
->backgroundDesktopColor
);
658 green
= GetGValue(pGlobalData
->backgroundDesktopColor
);
659 blue
= GetBValue(pGlobalData
->backgroundDesktopColor
);
660 _stprintf(clText
, TEXT("%d %d %d"), red
, green
, blue
); /* format string to be set to registry */
661 RegSetValueEx(hKey
, TEXT("Background"), 0, REG_SZ
, (BYTE
*)clText
, lstrlen( clText
)*sizeof(TCHAR
) + sizeof(TCHAR
) );
667 BackgroundPageProc(HWND hwndDlg
,
672 PGLOBAL_DATA pGlobalData
;
674 pGlobalData
= (PGLOBAL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
679 pGlobalData
= (GLOBAL_DATA
*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GLOBAL_DATA
));
680 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
681 InitBackgroundDialog(hwndDlg
, pGlobalData
);
686 DWORD controlId
= LOWORD(wParam
);
687 DWORD command
= HIWORD(wParam
);
691 case IDC_COLOR_BUTTON
:
692 if (command
== BN_CLICKED
)
693 OnColorButton(hwndDlg
, pGlobalData
);
696 case IDC_BROWSE_BUTTON
:
697 if (command
== BN_CLICKED
)
698 OnBrowseButton(hwndDlg
, pGlobalData
);
701 case IDC_PLACEMENT_COMBO
:
702 if (command
== CBN_SELCHANGE
)
704 pGlobalData
->placementSelection
= (int)SendDlgItemMessage(hwndDlg
, IDC_PLACEMENT_COMBO
, CB_GETCURSEL
, 0, 0);
706 InvalidateRect(GetDlgItem(hwndDlg
, IDC_BACKGROUND_PREVIEW
), NULL
, TRUE
);
708 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
719 hdc
= BeginPaint(hwndDlg
, &ps
);
721 hdcMem
= CreateCompatibleDC(hdc
);
722 SelectObject(hdcMem
, pGlobalData
->hBitmap
);
724 TransparentBlt(hdc, 98, 0,
725 pGlobalData->cxSource, pGlobalData->cySource, hdcMem, 0, 0,
726 pGlobalData->cxSource, pGlobalData->cySource, 0xFF80FF);
729 EndPaint(hwndDlg
, &ps
);
735 LPDRAWITEMSTRUCT drawItem
;
736 drawItem
= (LPDRAWITEMSTRUCT
)lParam
;
738 if (drawItem
->CtlID
== IDC_BACKGROUND_PREVIEW
)
740 DrawBackgroundPreview(drawItem
, pGlobalData
);
748 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
753 SetWallpaper(pGlobalData
);
754 SetDesktopBackColor(hwndDlg
, pGlobalData
);
757 case LVN_ITEMCHANGED
:
759 LPNMLISTVIEW nm
= (LPNMLISTVIEW
)lParam
;
761 if ((nm
->uNewState
& LVIS_SELECTED
) == 0)
764 ListViewItemChanged(hwndDlg
, pGlobalData
, nm
->iItem
);
772 if (pGlobalData
->pWallpaperBitmap
!= NULL
)
773 DibFreeImage(pGlobalData
->pWallpaperBitmap
);
775 DeleteObject(pGlobalData
->hBitmap
);
776 HeapFree(GetProcessHeap(), 0, pGlobalData
);