⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 background.c

📁 一个类似windows
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: background.c 22382 2006-06-17 12:31:31Z gedmurphy $
 *
 * COPYRIGHT:       See COPYING in the top level directory
 * PROJECT:         ReactOS Display Control Panel
 * FILE:            lib/cpl/desk/background.c
 * PURPOSE:         Background property page
 * 
 * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
 */

#include "desk.h"

#define MAX_BACKGROUNDS     100

#define PLACEMENT_CENTER    0
#define PLACEMENT_STRETCH   1
#define PLACEMENT_TILE      2

typedef struct
{
    BOOL bWallpaper; /* Is this background a wallpaper */
    
    TCHAR szFilename[MAX_PATH];
    TCHAR szDisplayName[256];
    
} BackgroundItem;

BackgroundItem g_backgroundItems[MAX_BACKGROUNDS];

DIBitmap *g_pWallpaperBitmap    = NULL;

int g_placementSelection        = 0;
int g_backgroundSelection       = 0;

int g_listViewItemCount         = 0;

HWND g_hBackgroundPage          = NULL;
HWND g_hBackgroundList          = NULL;
HWND g_hBackgroundPreview       = NULL;

HWND g_hPlacementCombo          = NULL;
HWND g_hColorButton             = NULL;

HIMAGELIST g_hShellImageList    = NULL;

/* Add the images in the C:\ReactOS directory and the current wallpaper if any */
void AddListViewItems()
{
    WIN32_FIND_DATA fd;
    HANDLE hFind;
    TCHAR szSearchPath[MAX_PATH];
	TCHAR szFileTypes[MAX_PATH];
    LV_ITEM listItem;
    LV_COLUMN dummy;
    RECT clientRect;
    HKEY regKey;
    SHFILEINFO sfi;
    HIMAGELIST himl;
    TCHAR wallpaperFilename[MAX_PATH];
    DWORD bufferSize = sizeof(wallpaperFilename);
    DWORD varType = REG_SZ;
    LONG result;
    UINT i = 0;
    BackgroundItem *backgroundItem = NULL;
	TCHAR separators[] = TEXT(";");
	TCHAR *token;

    GetClientRect(g_hBackgroundList, &clientRect);
    
    ZeroMemory(&dummy, sizeof(LV_COLUMN));
    dummy.mask      = LVCF_SUBITEM | LVCF_WIDTH;
    dummy.iSubItem  = 0;
    dummy.cx        = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL);
    
    (void)ListView_InsertColumn(g_hBackgroundList, 0, &dummy);

    /* Add the "None" item */

    backgroundItem = &g_backgroundItems[g_listViewItemCount];
    
    backgroundItem->bWallpaper = FALSE;
    
    LoadString(hApplet,
               IDS_NONE,
               backgroundItem->szDisplayName,
               sizeof(backgroundItem->szDisplayName) / sizeof(TCHAR));
    
    ZeroMemory(&listItem, sizeof(LV_ITEM));
    listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
    listItem.state      = LVIS_SELECTED;
    listItem.pszText    = backgroundItem->szDisplayName;
    listItem.iImage     = -1;
    listItem.iItem      = g_listViewItemCount;
    listItem.lParam     = g_listViewItemCount;
    
    (void)ListView_InsertItem(g_hBackgroundList, &listItem);
    ListView_SetItemState(g_hBackgroundList, g_listViewItemCount, LVIS_SELECTED, LVIS_SELECTED);

    g_listViewItemCount++;

    /* Add current wallpaper if any */
    
    RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
    
    result = RegQueryValueEx(regKey, TEXT("Wallpaper"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize);
    
    if((result == ERROR_SUCCESS) && (_tcslen(wallpaperFilename) > 0))
    {
        himl = (HIMAGELIST)SHGetFileInfo(wallpaperFilename,
                                         0,
                                         &sfi,
                                         sizeof(sfi),
                                         SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
                                         SHGFI_DISPLAYNAME);

        if(himl != NULL)
        {
            if(i++ == 0)
            {
                g_hShellImageList = himl;
                (void)ListView_SetImageList(g_hBackgroundList, himl, LVSIL_SMALL);
            }

            backgroundItem = &g_backgroundItems[g_listViewItemCount];
            
            backgroundItem->bWallpaper = TRUE;

            _tcscpy(backgroundItem->szDisplayName, sfi.szDisplayName);
            _tcscpy(backgroundItem->szFilename, wallpaperFilename);

            ZeroMemory(&listItem, sizeof(LV_ITEM));
            listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
            listItem.state      = LVIS_SELECTED;
            listItem.pszText    = backgroundItem->szDisplayName;
            listItem.iImage     = sfi.iIcon;
            listItem.iItem      = g_listViewItemCount;
            listItem.lParam     = g_listViewItemCount;

            (void)ListView_InsertItem(g_hBackgroundList, &listItem);
            ListView_SetItemState(g_hBackgroundList, g_listViewItemCount, LVIS_SELECTED, LVIS_SELECTED);

            g_listViewItemCount++;
        }
    }
    
    RegCloseKey(regKey);

    /* Add all the images in the C:\ReactOS directory. */

	LoadString(hApplet, IDS_SUPPORTED_EXT, szFileTypes, sizeof(szFileTypes) / sizeof(TCHAR));
	

	token = _tcstok ( szFileTypes, separators );
	while ( token != NULL )
	{
		GetWindowsDirectory(szSearchPath, MAX_PATH);
		_tcscat(szSearchPath, TEXT("\\"));
		_tcscat(szSearchPath, token);
	    
		hFind = FindFirstFile(szSearchPath, &fd);
		while(hFind != INVALID_HANDLE_VALUE)
		{
			/* Don't add any hidden bitmaps */
			if((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
			{
				TCHAR filename[MAX_PATH];
	            
				GetWindowsDirectory(filename, MAX_PATH);

				_tcscat(filename, TEXT("\\"));
				_tcscat(filename, fd.cFileName);
	            
				himl = (HIMAGELIST)SHGetFileInfo(filename,
												0,
												&sfi,
												sizeof(sfi),
												SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
												SHGFI_DISPLAYNAME);

				if(himl == NULL)
				{
					break;
				}
	            
				if(i++ == 0)
				{
					g_hShellImageList = himl;
					(void)ListView_SetImageList(g_hBackgroundList, himl, LVSIL_SMALL);
				}

				backgroundItem = &g_backgroundItems[g_listViewItemCount];

				backgroundItem->bWallpaper = TRUE;
	            
				_tcscpy(backgroundItem->szDisplayName, sfi.szDisplayName);
				_tcscpy(backgroundItem->szFilename, filename);

				ZeroMemory(&listItem, sizeof(LV_ITEM));
				listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
				listItem.pszText    = backgroundItem->szDisplayName;
				listItem.state      = 0;
				listItem.iImage     = sfi.iIcon;
				listItem.iItem      = g_listViewItemCount;
				listItem.lParam     = g_listViewItemCount;
	            
				(void)ListView_InsertItem(g_hBackgroundList, &listItem);
	            
				g_listViewItemCount++;
			}
	        
			if(!FindNextFile(hFind, &fd))
				hFind = INVALID_HANDLE_VALUE;
		}

		token = _tcstok ( NULL, separators );
	}


}

void InitBackgroundDialog()
{
    TCHAR szString[256];
    HKEY regKey;
    TCHAR szBuffer[2];
    DWORD bufferSize = sizeof(szBuffer);
    DWORD varType = REG_SZ;
    LONG result;
    
	g_hBackgroundList       = GetDlgItem(g_hBackgroundPage, IDC_BACKGROUND_LIST);
    g_hBackgroundPreview    = GetDlgItem(g_hBackgroundPage, IDC_BACKGROUND_PREVIEW);
    g_hPlacementCombo       = GetDlgItem(g_hBackgroundPage, IDC_PLACEMENT_COMBO);
    g_hColorButton          = GetDlgItem(g_hBackgroundPage, IDC_COLOR_BUTTON);

    AddListViewItems();
    
    LoadString(hApplet, IDS_CENTER, szString, sizeof(szString) / sizeof(TCHAR));
    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_CENTER, (LPARAM)szString);

    LoadString(hApplet, IDS_STRETCH, szString, sizeof(szString) / sizeof(TCHAR));
    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_STRETCH, (LPARAM)szString);

    LoadString(hApplet, IDS_TILE, szString, sizeof(szString) / sizeof(TCHAR));
    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_TILE, (LPARAM)szString);

    /* Load the default settings from the registry */
    RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
    
    result = RegQueryValueEx(regKey, TEXT("WallpaperStyle"), 0, &varType, (LPBYTE)szBuffer, &bufferSize);

    if(result == ERROR_SUCCESS)
    {
        if(_ttoi(szBuffer) == 0)
        {
            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_CENTER, 0);
            g_placementSelection = PLACEMENT_CENTER;
        }
        
        if(_ttoi(szBuffer) == 2)
        {
            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_STRETCH, 0);
            g_placementSelection = PLACEMENT_STRETCH;
        }
    }
    else
    {
        SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_CENTER, 0);
        g_placementSelection = PLACEMENT_CENTER;
    }
    
    result = RegQueryValueEx(regKey, TEXT("TileWallpaper"), 0, &varType, (LPBYTE)szBuffer, &bufferSize);

    if(result == ERROR_SUCCESS)
    {
        if(_ttoi(szBuffer) == 1)
        {
            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_TILE, 0);
            g_placementSelection = PLACEMENT_TILE;
        }
    }

    RegCloseKey(regKey);
}

void OnColorButton()
{
    MessageBox(NULL, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK);
}

BOOL CheckListBoxFilename(HWND list, TCHAR *filename)
{
    return FALSE;
}

void OnBrowseButton()
{
    OPENFILENAME ofn;
    TCHAR filename[MAX_PATH];
    TCHAR fileTitle[256];
    TCHAR filter[MAX_PATH];
    BackgroundItem *backgroundItem = NULL;
	SHFILEINFO sfi;
	LV_ITEM listItem;
        
    ZeroMemory(&ofn, sizeof(OPENFILENAME));

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = g_hBackgroundPage;
    ofn.lpstrFile = filename;

    LoadString(hApplet, IDS_BACKGROUND_COMDLG_FILTER, filter, sizeof(filter) / sizeof(TCHAR));
        
    /* Set lpstrFile[0] to '\0' so that GetOpenFileName does not 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -