mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[ui] Display progress on the Windows 7 taskbar icon
* Also updates dialog progress handling * Closes #72
This commit is contained in:
		
							parent
							
								
									98ff7a931a
								
							
						
					
					
						commit
						8d2fd913b0
					
				
					 4 changed files with 169 additions and 21 deletions
				
			
		
							
								
								
									
										50
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										50
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -39,6 +39,20 @@ | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
| #include "sys_types.h" | #include "sys_types.h" | ||||||
| 
 | 
 | ||||||
|  | /* Redefinitions for the WDK */ | ||||||
|  | #ifndef PBM_SETSTATE | ||||||
|  | #define PBM_SETSTATE (WM_USER+16) | ||||||
|  | #endif | ||||||
|  | #ifndef PBST_NORMAL | ||||||
|  | #define PBST_NORMAL 1 | ||||||
|  | #endif | ||||||
|  | #ifndef PBST_ERROR | ||||||
|  | #define PBST_ERROR 2 | ||||||
|  | #endif | ||||||
|  | #ifndef PBST_PAUSED | ||||||
|  | #define PBST_PAUSED 3 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "exFAT" }; | static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "exFAT" }; | ||||||
| // Don't ask me - just following the MS standard here
 | // Don't ask me - just following the MS standard here
 | ||||||
| static const char* ClusterSizeLabel[] = { "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes", | static const char* ClusterSizeLabel[] = { "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes", | ||||||
|  | @ -783,6 +797,7 @@ void UpdateProgress(int op, float percent) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0); | 	SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0); | ||||||
|  | 	SetTaskbarProgressValue(pos, MAX_PROGRESS); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -1165,9 +1180,11 @@ void InitDialog(HWND hDlg) | ||||||
| 
 | 
 | ||||||
| 	// Prefer FreeDOS to MS-DOS
 | 	// Prefer FreeDOS to MS-DOS
 | ||||||
| 	selection_default = DT_FREEDOS; | 	selection_default = DT_FREEDOS; | ||||||
| 
 | 	// Create the status line and initialize the taskbar icon for progress overlay
 | ||||||
| 	// Create the status line
 |  | ||||||
| 	CreateStatusBar(); | 	CreateStatusBar(); | ||||||
|  | 	CreateTaskbarList(); | ||||||
|  | 	SetTaskbarProgressState(TASKBAR_NORMAL); | ||||||
|  | 
 | ||||||
| 	// Use maximum granularity for the progress bar
 | 	// Use maximum granularity for the progress bar
 | ||||||
| 	SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | 	SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | ||||||
| 	// Fill up the passes
 | 	// Fill up the passes
 | ||||||
|  | @ -1445,6 +1462,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 				_snwprintf(wstr, ARRAYSIZE(wstr), L"WARNING: ALL DATA ON DEVICE %s\r\nWILL BE DESTROYED.\r\n" | 				_snwprintf(wstr, ARRAYSIZE(wstr), L"WARNING: ALL DATA ON DEVICE %s\r\nWILL BE DESTROYED.\r\n" | ||||||
| 					L"To continue with this operation, click OK. To quit click CANCEL.", wtmp); | 					L"To continue with this operation, click OK. To quit click CANCEL.", wtmp); | ||||||
| 				if (MessageBoxW(hMainDialog, wstr, L"Rufus", MB_OKCANCEL|MB_ICONWARNING) == IDOK) { | 				if (MessageBoxW(hMainDialog, wstr, L"Rufus", MB_OKCANCEL|MB_ICONWARNING) == IDOK) { | ||||||
|  | 					// Reset all progress bars
 | ||||||
|  | 					SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_NORMAL, 0); | ||||||
|  | 					SetTaskbarProgressState(TASKBAR_NORMAL); | ||||||
|  | 					SetTaskbarProgressValue(0, MAX_PROGRESS); | ||||||
| 					// Disable all controls except cancel
 | 					// Disable all controls except cancel
 | ||||||
| 					EnableControls(FALSE); | 					EnableControls(FALSE); | ||||||
| 					DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex); | 					DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex); | ||||||
|  | @ -1494,21 +1515,22 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 		EnableControls(TRUE); | 		EnableControls(TRUE); | ||||||
| 		GetUSBDevices(DeviceNum); | 		GetUSBDevices(DeviceNum); | ||||||
| 		if (!IS_ERROR(FormatStatus)) { | 		if (!IS_ERROR(FormatStatus)) { | ||||||
| 			PrintStatus(0, FALSE, "DONE"); | 			// This is the only way to achieve instantenous progress transition to 100%
 | ||||||
| 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { |  | ||||||
| 			PrintStatus(0, FALSE, "Cancelled"); |  | ||||||
| 			Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user."); |  | ||||||
| 		} else { |  | ||||||
| 			PrintStatus(0, FALSE, "FAILED"); |  | ||||||
| 			Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus)); |  | ||||||
| 		} |  | ||||||
| 		if (FormatStatus) { |  | ||||||
| 			SendMessage(hProgress, PBM_SETPOS, 0, 0); |  | ||||||
| 		} else { |  | ||||||
| 			// This is the only way to achieve instantenous progress transition
 |  | ||||||
| 			SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS+1)<<16); | 			SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS+1)<<16); | ||||||
| 			SendMessage(hProgress, PBM_SETPOS, (MAX_PROGRESS+1), 0); | 			SendMessage(hProgress, PBM_SETPOS, (MAX_PROGRESS+1), 0); | ||||||
| 			SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | 			SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | ||||||
|  | 			SetTaskbarProgressState(TASKBAR_NOPROGRESS); | ||||||
|  | 			PrintStatus(0, FALSE, "DONE"); | ||||||
|  | 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { | ||||||
|  | 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_PAUSED, 0); | ||||||
|  | 			SetTaskbarProgressState(TASKBAR_PAUSED); | ||||||
|  | 			PrintStatus(0, FALSE, "Cancelled"); | ||||||
|  | 			Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user."); | ||||||
|  | 		} else { | ||||||
|  | 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0); | ||||||
|  | 			SetTaskbarProgressState(TASKBAR_ERROR); | ||||||
|  | 			PrintStatus(0, FALSE, "FAILED"); | ||||||
|  | 			Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus)); | ||||||
| 		} | 		} | ||||||
| 		return (INT_PTR)TRUE; | 		return (INT_PTR)TRUE; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -159,6 +159,16 @@ typedef struct { | ||||||
| 	BOOL uses_minint; | 	BOOL uses_minint; | ||||||
| } RUFUS_ISO_REPORT; | } RUFUS_ISO_REPORT; | ||||||
| 
 | 
 | ||||||
|  | /* Duplication of the TBPFLAG enum for Windows 7 taskbar progress */ | ||||||
|  | typedef enum TASKBAR_PROGRESS_FLAGS | ||||||
|  | { | ||||||
|  | 	TASKBAR_NOPROGRESS = 0, | ||||||
|  | 	TASKBAR_INDETERMINATE = 0x1, | ||||||
|  | 	TASKBAR_NORMAL = 0x2, | ||||||
|  | 	TASKBAR_ERROR = 0x4, | ||||||
|  | 	TASKBAR_PAUSED = 0x8 | ||||||
|  | } TASKBAR_PROGRESS_FLAGS; | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Globals |  * Globals | ||||||
|  */ |  */ | ||||||
|  | @ -187,6 +197,9 @@ extern void UpdateProgress(int op, float percent); | ||||||
| extern const char* StrError(DWORD error_code); | extern const char* StrError(DWORD error_code); | ||||||
| extern void CenterDialog(HWND hDlg); | extern void CenterDialog(HWND hDlg); | ||||||
| extern void CreateStatusBar(void); | extern void CreateStatusBar(void); | ||||||
|  | extern BOOL CreateTaskbarList(void); | ||||||
|  | extern BOOL SetTaskbarProgressState(TASKBAR_PROGRESS_FLAGS tbpFlags); | ||||||
|  | extern BOOL SetTaskbarProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal); | ||||||
| extern INT_PTR CreateAboutBox(void); | extern INT_PTR CreateAboutBox(void); | ||||||
| extern HWND CreateTooltip(HWND hControl, const char* message, int duration); | extern HWND CreateTooltip(HWND hControl, const char* message, int duration); | ||||||
| extern void DestroyTooltip(HWND hWnd); | extern void DestroyTooltip(HWND hWnd); | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 206, 289 | IDD_DIALOG DIALOGEX 12, 12, 206, 289 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.2.0.163" | CAPTION "Rufus v1.2.0.164" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,248,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,248,50,14 | ||||||
|  | @ -71,7 +71,7 @@ BEGIN | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP |     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, |     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, | ||||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 |                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||||
|     LTEXT           "Version 1.2.0 (Build 163)",IDC_STATIC,46,19,78,8 |     LTEXT           "Version 1.2.0 (Build 164)",IDC_STATIC,46,19,78,8 | ||||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP |     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL |     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 |     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||||
|  | @ -216,8 +216,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,2,0,163 |  FILEVERSION 1,2,0,164 | ||||||
|  PRODUCTVERSION 1,2,0,163 |  PRODUCTVERSION 1,2,0,164 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -234,13 +234,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "akeo.ie" |             VALUE "CompanyName", "akeo.ie" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.2.0.163" |             VALUE "FileVersion", "1.2.0.164" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "1.2.0.163" |             VALUE "ProductVersion", "1.2.0.164" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
							
								
								
									
										113
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										113
									
								
								src/stdlg.c
									
										
									
									
									
								
							|  | @ -831,3 +831,116 @@ LONG GetEntryWidth(HWND hDropDown, const char *entry) | ||||||
| 	free(wentry); | 	free(wentry); | ||||||
| 	return size.cx; | 	return size.cx; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Windows 7 taskbar icon handling (progress bar overlay, etc) | ||||||
|  |  * Some platforms don't have these, so we redefine | ||||||
|  |  */ | ||||||
|  | typedef enum MY_STPFLAG | ||||||
|  | { | ||||||
|  | 	MY_STPF_NONE = 0, | ||||||
|  | 	MY_STPF_USEAPPTHUMBNAILALWAYS = 0x1, | ||||||
|  | 	MY_STPF_USEAPPTHUMBNAILWHENACTIVE = 0x2, | ||||||
|  | 	MY_STPF_USEAPPPEEKALWAYS = 0x4, | ||||||
|  | 	MY_STPF_USEAPPPEEKWHENACTIVE = 0x8 | ||||||
|  | } MY_STPFLAG; | ||||||
|  | 
 | ||||||
|  | typedef enum MY_THUMBBUTTONMASK | ||||||
|  | { | ||||||
|  | 	MY_THB_BITMAP = 0x1, | ||||||
|  | 	MY_THB_ICON = 0x2, | ||||||
|  | 	MY_THB_TOOLTIP = 0x4, | ||||||
|  | 	MY_THB_FLAGS = 0x8 | ||||||
|  | } MY_THUMBBUTTONMASK; | ||||||
|  | 
 | ||||||
|  | typedef enum MY_THUMBBUTTONFLAGS | ||||||
|  | { | ||||||
|  | 	MY_THBF_ENABLED = 0, | ||||||
|  | 	MY_THBF_DISABLED = 0x1, | ||||||
|  | 	MY_THBF_DISMISSONCLICK = 0x2, | ||||||
|  | 	MY_THBF_NOBACKGROUND = 0x4, | ||||||
|  | 	MY_THBF_HIDDEN = 0x8, | ||||||
|  | 	MY_THBF_NONINTERACTIVE = 0x10 | ||||||
|  | } MY_THUMBBUTTONFLAGS; | ||||||
|  | 
 | ||||||
|  | typedef struct MY_THUMBBUTTON | ||||||
|  | { | ||||||
|  | 	MY_THUMBBUTTONMASK dwMask; | ||||||
|  | 	UINT iId; | ||||||
|  | 	UINT iBitmap; | ||||||
|  | 	HICON hIcon; | ||||||
|  | 	WCHAR szTip[260]; | ||||||
|  | 	MY_THUMBBUTTONFLAGS dwFlags; | ||||||
|  | } MY_THUMBBUTTON; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | typedef enum MY_TBPFLAG | ||||||
|  | { | ||||||
|  | 	TASKBAR_NOPROGRESS = 0, | ||||||
|  | 	TASKBAR_INDETERMINATE = 0x1, | ||||||
|  | 	TASKBAR_NORMAL = 0x2, | ||||||
|  | 	TASKBAR_ERROR = 0x4, | ||||||
|  | 	TASKBAR_PAUSED = 0x8 | ||||||
|  | } MY_TBPFLAG; | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #pragma push_macro("INTERFACE") | ||||||
|  | #undef  INTERFACE | ||||||
|  | #define INTERFACE my_ITaskbarList3 | ||||||
|  | DECLARE_INTERFACE_(my_ITaskbarList3, IUnknown) { | ||||||
|  | 	STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; | ||||||
|  | 	STDMETHOD_(ULONG, AddRef) (THIS) PURE; | ||||||
|  | 	STDMETHOD_(ULONG, Release) (THIS) PURE; | ||||||
|  | 	STDMETHOD (HrInit) (THIS) PURE; | ||||||
|  | 	STDMETHOD (AddTab) (THIS_ HWND hwnd) PURE; | ||||||
|  | 	STDMETHOD (DeleteTab) (THIS_ HWND hwnd) PURE; | ||||||
|  | 	STDMETHOD (ActivateTab) (THIS_ HWND hwnd) PURE; | ||||||
|  | 	STDMETHOD (SetActiveAlt) (THIS_ HWND hwnd) PURE; | ||||||
|  | 	STDMETHOD (MarkFullscreenWindow) (THIS_ HWND hwnd, int fFullscreen) PURE; | ||||||
|  | 	STDMETHOD (SetProgressValue) (THIS_ HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE; | ||||||
|  | 	STDMETHOD (SetProgressState) (THIS_ HWND hwnd, TASKBAR_PROGRESS_FLAGS tbpFlags) PURE; | ||||||
|  | 	STDMETHOD (RegisterTab) (THIS_ HWND hwndTab,HWND hwndMDI) PURE; | ||||||
|  | 	STDMETHOD (UnregisterTab) (THIS_ HWND hwndTab) PURE; | ||||||
|  | 	STDMETHOD (SetTabOrder) (THIS_ HWND hwndTab, HWND hwndInsertBefore) PURE; | ||||||
|  | 	STDMETHOD (SetTabActive) (THIS_ HWND hwndTab, HWND hwndMDI, DWORD dwReserved) PURE; | ||||||
|  | 	STDMETHOD (ThumbBarAddButtons) (THIS_ HWND hwnd, UINT cButtons, MY_THUMBBUTTON* pButton) PURE; | ||||||
|  | 	STDMETHOD (ThumbBarUpdateButtons) (THIS_ HWND hwnd, UINT cButtons, MY_THUMBBUTTON* pButton) PURE; | ||||||
|  | 	STDMETHOD (ThumbBarSetImageList) (THIS_ HWND hwnd, HIMAGELIST himl) PURE; | ||||||
|  | 	STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE; | ||||||
|  | 	STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE; | ||||||
|  | 	STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE; | ||||||
|  | }; | ||||||
|  | const IID my_IID_ITaskbarList3 =  | ||||||
|  | 	{ 0xea1afb91, 0x9e28, 0x4b86, { 0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf } }; | ||||||
|  | const IID my_CLSID_TaskbarList =  | ||||||
|  | 	{ 0x56fdf344, 0xfd6d, 0x11d0, { 0x95, 0x8a ,0x0, 0x60, 0x97, 0xc9, 0xa0 ,0x90 } }; | ||||||
|  | 
 | ||||||
|  | static my_ITaskbarList3* ptbl = NULL; | ||||||
|  | 
 | ||||||
|  | BOOL CreateTaskbarList(void) | ||||||
|  | { | ||||||
|  | 	HRESULT hr; | ||||||
|  | 	// Create the taskbar icon progressbar
 | ||||||
|  | 	hr = CoCreateInstance(&my_CLSID_TaskbarList, NULL, CLSCTX_ALL, &my_IID_ITaskbarList3, (LPVOID)&ptbl); | ||||||
|  | 	if (FAILED(hr)) { | ||||||
|  | 		uprintf("CoCreateInstance for TaskbarList failed: error %X", hr); | ||||||
|  | 		ptbl = NULL; | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 	return TRUE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOL SetTaskbarProgressState(TASKBAR_PROGRESS_FLAGS tbpFlags) | ||||||
|  | { | ||||||
|  | 	if (ptbl == NULL) | ||||||
|  | 		return FALSE; | ||||||
|  | 	return !FAILED(ptbl->lpVtbl->SetProgressState(ptbl, hMainDialog, tbpFlags)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOL SetTaskbarProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal) | ||||||
|  | { | ||||||
|  | 	if (ptbl == NULL) | ||||||
|  | 		return FALSE; | ||||||
|  | 	return !FAILED(ptbl->lpVtbl->SetProgressValue(ptbl, hMainDialog, ullCompleted, ullTotal)); | ||||||
|  | } | ||||||
|  | #pragma pop_macro("INTERFACE") | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue