- draw drive dialog static controls

- use rtl library for calculating [free|used] diskspace 
- add german resource strings

svn path=/trunk/; revision=29355
This commit is contained in:
Johannes Anderwald 2007-10-02 16:03:48 +00:00
parent c5921b158e
commit 384ad5f156
4 changed files with 135 additions and 17 deletions

View file

@ -21,6 +21,11 @@
#include "config.h"
#include "wine/port.h"
#define YDEBUG
#define LARGEINT_PROTOS
#define LargeIntegerDivide RtlLargeIntegerDivide
#define ExtendedIntegerMultiply RtlExtendedIntegerMultiply
#define ConvertUlongToLargeInteger RtlConvertUlongToLargeInteger
#define LargeIntegerSubtract RtlLargeIntegerSubtract
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
@ -43,6 +48,7 @@
#include <initguid.h>
#include <devguid.h>
#include <winioctl.h>
#include <largeint.h>
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@ -61,19 +67,90 @@ DeviceCreateHardwarePageEx(HWND hWndParent,
#define DRIVE_PROPERTY_PAGES (3)
static
LARGE_INTEGER
GetFreeBytesShare(LARGE_INTEGER TotalNumberOfFreeBytes, LARGE_INTEGER TotalNumberOfBytes)
{
LARGE_INTEGER Temp, Result, Remainder;
Temp = LargeIntegerDivide(TotalNumberOfBytes, ConvertUlongToLargeInteger(100), &Remainder);
if (Temp.QuadPart >= TotalNumberOfFreeBytes.QuadPart)
{
Result = ConvertUlongToLargeInteger(1);
}else
{
Result = LargeIntegerDivide(TotalNumberOfFreeBytes, Temp, &Remainder);
}
return Result;
}
static
void
PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT drawItem)
{
HBRUSH hBrush;
if (drawItem->CtlID == 14013)
{
hBrush = CreateSolidBrush(RGB(0, 0, 255));
if (hBrush)
{
FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
DeleteObject((HGDIOBJ)hBrush);
}
}else if (drawItem->CtlID == 14014)
{
hBrush = CreateSolidBrush(RGB(255, 0, 255));
if (hBrush)
{
FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
DeleteObject((HGDIOBJ)hBrush);
}
}
else if (drawItem->CtlID == 14015)
{
HBRUSH hBlueBrush;
HBRUSH hMagBrush;
RECT rect;
LONG horzsize;
LARGE_INTEGER Result;
hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));
hMagBrush = CreateSolidBrush(RGB(255, 0, 255));
Result.QuadPart = GetWindowLongPtr(hwndDlg, DWLP_USER);
CopyRect(&rect, &drawItem->rcItem);
horzsize = rect.right - rect.left;
Result.QuadPart = (Result.QuadPart * horzsize) / 100;
rect.right = rect.left + Result.QuadPart;
FillRect(drawItem->hDC, &rect, hMagBrush);
rect.left = rect.right;
rect.right = drawItem->rcItem.right;
FillRect(drawItem->hDC, &rect, hBlueBrush);
DeleteObject(hBlueBrush);
DeleteObject(hMagBrush);
}
}
static
void
InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)
{
WCHAR szVolumeName[MAX_PATH+1] = {0};
WCHAR szVolumeName[MAX_PATH+1] = {0};
DWORD MaxComponentLength = 0;
DWORD FileSystemFlags = 0;
WCHAR FileSystemName[MAX_PATH+1] = {0};
WCHAR szFormat[50];
WCHAR szBuffer[128];
BOOL ret;
UINT DriveType;
ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
LARGE_INTEGER TotalNumberOfFreeBytes;
LARGE_INTEGER TotalNumberOfBytes;
ret = GetVolumeInformationW(szDrive, szVolumeName, MAX_PATH+1, NULL, &MaxComponentLength, &FileSystemFlags, FileSystemName, MAX_PATH+1);
if (ret)
@ -89,24 +166,20 @@ InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)
DriveType = GetDriveTypeW(szDrive);
if (DriveType == DRIVE_FIXED)
{
if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, (PULARGE_INTEGER)&TotalNumberOfBytes, (PULARGE_INTEGER)&TotalNumberOfFreeBytes))
{
WCHAR szResult[128];
LARGE_INTEGER Result;
#ifdef IOCTL_DISK_GET_LENGTH_INFO_IMPLEMENTED
HANDLE hVolume;
DWORD BytesReturned = 0;
GET_LENGTH_INFORMATION LengthInformation;
if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14004, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14006, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
#if 0
sprintfW(szResult, L"\\\\.\\%c:", towupper(szDrive[0]));
hVolume = CreateFileW(szResult, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hVolume != INVALID_HANDLE_VALUE)
{
RtlZeroMemory(&LengthInformation, sizeof(GET_LENGTH_INFORMATION));
ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&LengthInformation, sizeof(GET_LENGTH_INFORMATION), &BytesReturned, NULL);
ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&TotalNumberOfBytes, sizeof(ULARGE_INTEGER), &BytesReturned, NULL);
if (ret && StrFormatByteSizeW(LengthInformation.Length.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14008, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
@ -117,8 +190,32 @@ InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive)
if (ret && StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14008, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
#endif
if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14004, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14006, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szResult);
Result = GetFreeBytesShare(TotalNumberOfFreeBytes, TotalNumberOfBytes);
/* set free bytes percentage */
sprintfW(szResult, L"%02d%%", Result.QuadPart);
SendDlgItemMessageW(hwndDlg, 14007, WM_SETTEXT, (WPARAM)0, (LPARAM)szResult);
/* store free share amount */
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)Result.QuadPart);
/* store used share amount */
Result = LargeIntegerSubtract(ConvertUlongToLargeInteger(100), Result);
sprintfW(szResult, L"%02d%%", Result.QuadPart);
SendDlgItemMessageW(hwndDlg, 14005, WM_SETTEXT, (WPARAM)0, (LPARAM)szResult);
if (LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)))
SendDlgItemMessageW(hwndDlg, 14002, WM_SETTEXT, (WPARAM)0, (LPARAM)szBuffer);
}
}
/* set drive description */
SendDlgItemMessageW(hwndDlg, 14010, WM_GETTEXT, (WPARAM)50, (LPARAM)szFormat);
sprintfW(szBuffer, szFormat, szDrive);
SendDlgItemMessageW(hwndDlg, 14010, WM_SETTEXT, (WPARAM)NULL, (LPARAM)szBuffer);
}
@ -132,6 +229,7 @@ DriveGeneralDlg(
)
{
LPPROPSHEETPAGEW ppsp;
LPDRAWITEMSTRUCT drawItem;
WCHAR * lpstr;
switch(uMsg)
@ -144,7 +242,15 @@ DriveGeneralDlg(
lpstr = (WCHAR *)ppsp->lParam;
InitializeGeneralDriveDialog(hwndDlg, lpstr);
return TRUE;
return TRUE;
case WM_DRAWITEM:
drawItem = (LPDRAWITEMSTRUCT)lParam;
if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015)
{
PaintStaticControls(hwndDlg, drawItem);
return TRUE;
}
}

View file

@ -22,6 +22,7 @@
<library>ole32</library>
<library>version</library>
<library>devmgr</library>
<library>rtl</library>
<file>authors.c</file>
<file>autocomplete.c</file>
<file>brsfolder.c</file>

View file

@ -224,15 +224,18 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
//ICON
EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP
LTEXT "Typ:", -1, 15, 55, 40, 10
LTEXT "", 14002, 40, 55, 100, 10
LTEXT "", 14002, 110, 55, 100, 10
LTEXT "Dateisystem:", -1, 15, 70, 100, 10
LTEXT "", 14003, 110, 70, 100, 10
CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10
LTEXT "Belegter Speicher:", -1, 25, 90, 120, 10
LTEXT "", 14004, 110, 90, 120, 10
LTEXT "", 14005, 200, 90, 40, 10
CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10
LTEXT "Freier Speicher:", -1, 25, 105, 70, 10
LTEXT "", 14006, 110, 105, 120, 10
LTEXT "", 14007, 200, 105, 40, 10
@ -241,10 +244,12 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
LTEXT "", 14008, 110, 125, 120, 10
LTEXT "", 14009, 200, 125, 40, 10
LTEXT "", 14010, 150, 160, 40, 10
PUSHBUTTON "Bereinigen", 14011, 190, 145, 50, 15, WS_DISABLED
CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20
LTEXT "Laufwerk %s", 14010, 100, 170, 40, 10
PUSHBUTTON "Bereinigen", 14011, 180, 175, 50, 15, WS_DISABLED
CHECKBOX "Laufwerk komprimieren, um Speicherplatz zu sparen", 14012, 15, 205, 165, 10, WS_DISABLED
CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 205, 165, 10, WS_DISABLED
CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 220, 165, 10, WS_DISABLED
}
DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 130
@ -332,4 +337,7 @@ STRINGTABLE DISCARDABLE
IDS_COMMON_PICTURES "Dokumente\\Eigene Bilder"
IDS_COMMON_VIDEO "Dokumente\\Eigene Videos"
IDS_CDBURN_AREA "Lokale Einstellungen\\Anwendungsdaten\\Microsoft\\CD Burning"
IDS_DRIVE_FIXED "Lokaler Datenträger"
IDS_DRIVE_CDROM "CD-Laufwerk"
IDS_DRIVE_NETWORK "Netzwerklaufwerk"
}

View file

@ -86,6 +86,9 @@
#define IDS_COMMON_PICTURES 69
#define IDS_COMMON_VIDEO 70
#define IDS_CDBURN_AREA 71
#define IDS_DRIVE_FIXED 72
#define IDS_DRIVE_CDROM 73
#define IDS_DRIVE_NETWORK 74
/* browse for folder dialog box */
#define IDD_STATUS 0x3743