/***************************************************************************************************************** FILENAME: GraphWin.cpp COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. */ #ifndef SNAPIN #ifndef NOWINDOWSH #include #endif #endif #include "stdafx.h" extern "C" { #include "SysStruc.h" } #include "DfrgUI.h" #include "DfrgCmn.h" #include "DfrgEngn.h" #include "DiskView.h" #include "DfrgCtl.h" #include "DataIoCl.h" #include "GraphWin.h" #include "Message.h" #include "Graphix.h" #include "ESButton.h" #include "ErrMacro.h" #include "DlgRpt.h" #include "DfrgRes.h" #include "VolList.h" /****************************************************************************************************************/ extern CDfrgCtl* pCDfrgCtl; extern HINSTANCE hinstRes; extern HINSTANCE hInstRes; extern HINSTANCE hinstMain; extern HFONT g_hFont; extern CVolList VolumeList; extern BOOL bSnapinSelected; /****************************************************************************************************************/ HWND hwndGraphics = NULL; RECT rcGraphics; RECT rcDefragStartButton; RECT rcAnalyzeStartButton; RECT rcPauseButton; RECT rcCancelButton; RECT rcReportButton; RECT rcAnalyzeDisp; RECT rcDefragDisp; static RECT rcAnalyzeBorder; static RECT rcDefragBorder; extern RECT rcCtlRect; static ESButton* pAnalyzeButton = NULL; static ESButton* pDefragButton = NULL; static ESButton* pPauseButton = NULL; static ESButton* pStopButton = NULL; static ESButton* pReportButton = NULL; static DWORD dwLastMax = 0; static int iLastPos = 0; static DWORD dwScrollUnit = 0; static DWORD dwScrollPage = 0; #define ESI_BUTTON_SPACE 6 #define ESI_BUTTON_WIDTH 84 #define ESI_LEFT_MARGIN 14 /****************************************************************************************************************/ static BOOL PaintGraphicsWindowBackground( HDC WorkDC ); /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: GLOBAL VARIABLES: INPUT: None; RETURN: None. */ BOOL InitializeGraphicsWindow( IN HWND hwnd, IN HINSTANCE hInst ) { WNDCLASS wc; // Initialize the window class. wc.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS; wc.lpfnWndProc = (WNDPROC) GraphicsWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = GRAPHICSWINDOW_CLASS; // Register the window class. EF(RegisterClass(&wc)); // Create the window. EF((hwndGraphics = CreateWindow(GRAPHICSWINDOW_CLASS, TEXT(""), WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, hInst, NULL)) != NULL); ShowScrollBar(hwndGraphics, SB_VERT, FALSE); ShowWindow(hwndGraphics, SW_SHOW); UpdateWindow(hwndGraphics); pAnalyzeButton = new ESButton(hwndGraphics, ID_ANALYZE, hInst); pDefragButton = new ESButton(hwndGraphics, ID_DEFRAG, hInst); pPauseButton = new ESButton(hwndGraphics, ID_PAUSE, hInst); pStopButton = new ESButton(hwndGraphics, ID_STOP, hInst); pReportButton = new ESButton(hwndGraphics, ID_REPORT, hInst); pAnalyzeButton->SetFont(g_hFont); pAnalyzeButton->SetText(hInstRes, IDS_BTN_ANALYZE); pDefragButton->SetFont(g_hFont); pDefragButton->SetText(hInstRes, IDS_BTN_DEFRAGMENT); pPauseButton->SetFont(g_hFont); pPauseButton->SetText(hInstRes, IDS_BTN_PAUSE); pStopButton->SetFont(g_hFont); pStopButton->SetText(hInstRes, IDS_BTN_STOP); pReportButton->SetFont(g_hFont); pReportButton->SetText(hInstRes, IDS_BTN_REPORT); SetButtonState(); SetFocus(pAnalyzeButton->GetWindowHandle()); return TRUE; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: This is the WndProc function for the graphics window. GLOBALS: INPUT: hWnd - Handle to the window. uMsg - The message. wParam - The word parameter for the message. lParam - the long parameter for the message. RETURN: various. */ LRESULT CALLBACK GraphicsWndProc( IN HWND hWnd, IN UINT uMsg, IN UINT wParam, IN LONG lParam ) { switch(uMsg) { case WM_COMMAND: switch ((short int)wParam) { case ID_ANALYZE: pCDfrgCtl->put_Command(ID_ANALYZE); break; case ID_DEFRAG: pCDfrgCtl->put_Command(ID_DEFRAG); break; case ID_PAUSE: pCDfrgCtl->put_Command(ID_PAUSE); break; case ID_CONTINUE: pCDfrgCtl->put_Command(ID_CONTINUE); break; case ID_STOP: pCDfrgCtl->put_Command(ID_STOP); break; case ID_REPORT: if (VolumeList.GetCurrentVolume()->IsReportOKToDisplay()){ // raise the report dialog RaiseReportDialog( VolumeList.GetCurrentVolume(), VolumeList.GetCurrentVolume()->DefragMode()); } break; return S_OK; } case WM_VSCROLL: switch((short int)wParam){ case SB_LINEDOWN: iLastPos += dwScrollUnit; break; case SB_LINEUP: iLastPos -= dwScrollUnit; break; case SB_PAGEDOWN: iLastPos += dwScrollPage; break; case SB_PAGEUP: iLastPos -= dwScrollPage; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: iLastPos = (wParam >> 16)*dwLastMax/100; break; case SB_ENDSCROLL: return 0; } if(iLastPos < 0){ iLastPos = 0; } if(iLastPos > (int)dwLastMax){ iLastPos = dwLastMax; } SizeGraphicsWindow(); // pCDfrgCtl->InvalidateRect(NULL, TRUE); // pCDfrgCtl->FireViewChange(); pCDfrgCtl->OnDrawFunction(); break; case WM_ERASEBKGND: return TRUE; break; case WM_PAINT: { PAINTSTRUCT ps; EF(BeginPaint(hWnd, &ps)); PaintGraphicsWindowFunction(); EF(EndPaint(hWnd, &ps)); } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: // Destroy the thread. PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: Sizes the graphics window GLOBAL VARIABLES: HWND hwndGraphics - handle of the list view window. INPUT: RETURN: TRUE = success FALSE = error */ BOOL SizeGraphicsWindow( void ) { SET_DISP_DATA DispData = {0}; SCROLLINFO si = {0}; CVolume *pVolume = VolumeList.GetCurrentVolume(); si.cbSize = sizeof(SCROLLINFO); // Size and position the Graphics window. EF(SetWindowPos(hwndGraphics, // handle of window HWND_TOP, // placement-order handle rcGraphics.left, // horizontal position rcGraphics.top, // vertical position rcGraphics.right - rcGraphics.left, // width rcGraphics.bottom - rcGraphics.top, // height SWP_SHOWWINDOW // window-positioning flags )); si.fMask = SIF_RANGE|SIF_POS; si.nMin = 0; if((rcGraphics.bottom - rcGraphics.top) > MIN_SCROLL_HEIGHT){ si.nMax = 0; } else { si.nMax = MIN_SCROLL_HEIGHT - (rcGraphics.bottom - rcGraphics.top); } si.nPos = iLastPos; if(si.nPos > si.nMax){ si.nPos = si.nMax; } SetScrollInfo(hwndGraphics, SB_VERT, &si, TRUE); dwLastMax = si.nMax; iLastPos = si.nPos; dwScrollUnit = si.nMax / 10; dwScrollPage = rcGraphics.bottom - rcGraphics.top; if(dwScrollPage > (DWORD)si.nMax){ dwScrollPage = si.nMax; } //Calculate the position for the analyze display rectangle. rcAnalyzeDisp.top = 40 - si.nPos; if((rcGraphics.bottom - rcGraphics.top) > MIN_SCROLL_HEIGHT){ rcAnalyzeDisp.top += ((rcGraphics.bottom - rcGraphics.top) - MIN_SCROLL_HEIGHT)/2; } rcAnalyzeDisp.bottom = rcAnalyzeDisp.top + TOP_MARGIN_RAW + BOTTOM_MARGIN_RAW + ROW_HEIGHT_RAW; rcAnalyzeDisp.left = ESI_LEFT_MARGIN; rcAnalyzeDisp.right = (rcGraphics.right - rcGraphics.left) - ESI_LEFT_MARGIN - (si.nMax ? 25 : 0); // max right margin of the graphics wells int maxRightEdge = ESI_LEFT_MARGIN + 5*ESI_BUTTON_WIDTH + 4*ESI_BUTTON_SPACE; if (rcAnalyzeDisp.right < maxRightEdge) rcAnalyzeDisp.right = maxRightEdge; //Calculate from the analyze display rectangle, the position of the defrag display rectangle. rcDefragDisp = rcAnalyzeDisp; rcDefragDisp.top = rcDefragDisp.bottom + 40; rcDefragDisp.bottom = rcDefragDisp.top + rcAnalyzeDisp.bottom - rcAnalyzeDisp.top; //Set output dimensions on the analyze display rectangle. if(pVolume->m_pAnalyzeDisplay) { //Get mutex. EF_ASSERT(WaitForSingleObject(pVolume->m_hAnalyzeDisplayMutex, DISKDISPLAYMUTEXWAITINTERVAL ) == WAIT_OBJECT_0); //Set the dimensions. (pVolume->m_pAnalyzeDisplay)->SetNewOutputDimensions( rcAnalyzeDisp.left, rcAnalyzeDisp.top, rcAnalyzeDisp.right - rcAnalyzeDisp.left, rcAnalyzeDisp.bottom - rcAnalyzeDisp.top); //Get the cluster factor (so we can test for an error consition -- this value should not be zero.) DispData.AnalyzeClusterFactor = (pVolume->m_pAnalyzeDisplay)->GetClusterFactor(); //Close the mutex. EF_ASSERT(ReleaseMutex(pVolume->m_hAnalyzeDisplayMutex)); //Test for the cluster factor equaling zero. EF_ASSERT(DispData.AnalyzeClusterFactor); } //Set output dimensions on the defrag display rectangle. if(pVolume->m_pDefragDisplay) { //Get mutex. EF_ASSERT(WaitForSingleObject(pVolume->m_hDefragDisplayMutex, DISKDISPLAYMUTEXWAITINTERVAL) == WAIT_OBJECT_0); //Set the dimensions. (pVolume->m_pDefragDisplay)->SetNewOutputDimensions( rcDefragDisp.left, rcDefragDisp.top, rcDefragDisp.right - rcDefragDisp.left, rcDefragDisp.bottom - rcDefragDisp.top); //Get the cluster factor (so we can test for an error consition -- this value should not be zero.) DispData.DefragClusterFactor = (pVolume->m_pDefragDisplay)->GetClusterFactor(); //Close the mutex. EF_ASSERT(ReleaseMutex(pVolume->m_hDefragDisplayMutex)); //Test for the cluster factor equaling zero. EF_ASSERT(DispData.DefragClusterFactor); } if(pVolume->m_pdataDefragEngine && (DispData.AnalyzeClusterFactor || DispData.DefragClusterFactor)) { DataIoClientSetData(ID_SETDISPDIMENSIONS, (PTCHAR)&DispData, sizeof(SET_DISP_DATA), pVolume->m_pdataDefragEngine); } // Calculate the analyze display border. rcAnalyzeBorder.top = rcAnalyzeDisp.top - 1; rcAnalyzeBorder.left = rcAnalyzeDisp.left - 1; rcAnalyzeBorder.right = rcAnalyzeDisp.right; rcAnalyzeBorder.bottom = rcAnalyzeDisp.bottom; // Calculate the defrag display border. rcDefragBorder.top = rcDefragDisp.top - 1; rcDefragBorder.left = rcDefragDisp.left - 1; rcDefragBorder.right = rcDefragDisp.right; rcDefragBorder.bottom = rcDefragDisp.bottom; // Calculate the Analyze button position and size. rcAnalyzeStartButton.top = rcDefragDisp.bottom + ESI_LEFT_MARGIN - 1; rcAnalyzeStartButton.left = rcDefragDisp.left - 1; rcAnalyzeStartButton.right = rcAnalyzeStartButton.left + ESI_BUTTON_WIDTH; rcAnalyzeStartButton.bottom = rcAnalyzeStartButton.top + 26; // start off with all buttons the same as the analyze button rcDefragStartButton = rcPauseButton = rcCancelButton = rcReportButton = rcAnalyzeStartButton; // Calculate the Defrag button position and size. rcDefragStartButton.left = rcAnalyzeStartButton.right + ESI_BUTTON_SPACE; rcDefragStartButton.right = rcDefragStartButton.left + ESI_BUTTON_WIDTH; // Calculate the Pause button position and size. rcPauseButton.left = rcDefragStartButton.right + ESI_BUTTON_SPACE; rcPauseButton.right = rcPauseButton.left + ESI_BUTTON_WIDTH; // Calculate the Cancel button position and size. rcCancelButton.left = rcPauseButton.right + ESI_BUTTON_SPACE; rcCancelButton.right = rcCancelButton.left + ESI_BUTTON_WIDTH; // Calculate the See Report button position and size. rcReportButton.left = rcCancelButton.right + ESI_BUTTON_SPACE; rcReportButton.right = rcReportButton.left + ESI_BUTTON_WIDTH; // put the buttons on the screen pAnalyzeButton->PositionButton(&rcAnalyzeStartButton); pDefragButton->PositionButton(&rcDefragStartButton); pPauseButton->PositionButton(&rcPauseButton); pStopButton->PositionButton(&rcCancelButton); pReportButton->PositionButton(&rcReportButton); return TRUE; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: GLOBAL VARIABLES: INPUT: RETURN: TRUE = success FALSE = error */ BOOL PaintGraphicsWindowFunction( ) { HDC OutputDC, WorkDC; HANDLE hBitmap = NULL; HANDLE hOld = NULL; RECT rect; //Only paint if this snapin is selected. if(!bSnapinSelected){ return TRUE; } //Get the size of the window. EF(GetClientRect(hwndGraphics, &rect)); // Get the DC OutputDC = GetDC(hwndGraphics); WorkDC = CreateCompatibleDC(OutputDC); EF_ASSERT(hBitmap = CreateCompatibleBitmap(OutputDC, rect.right-rect.left, rect.bottom-rect.top)); hOld = SelectObject(WorkDC, hBitmap); // Paint a light gray background on the entire window. HBRUSH hBrush = (HBRUSH) CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); FillRect(WorkDC, &rect, hBrush); DeleteObject(hBrush); EF(PaintGraphicsWindowBackground(WorkDC)); EF(PaintGraphicsWindow(rect, FALSE, WorkDC)); EF(BitBlt(OutputDC, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, WorkDC, 0, 0, SRCCOPY)); // Cleanup the bitmap stuff. EF(hBitmap == SelectObject(WorkDC, hOld)); EF(DeleteObject(hBitmap)); EF(DeleteDC(WorkDC)); EF(ReleaseDC(hwndGraphics, OutputDC)); return TRUE; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: Paints the information in the graphics window. GLOBAL VARIABLES: INPUT: RETURN: TRUE = success FALSE = error */ BOOL PaintGraphicsWindow( IN RECT rect, IN BOOL bPartialRedraw, HDC hdc ) { CVolume *pVolume = VolumeList.GetCurrentVolume(); //Paint the analyze display. if(pVolume->m_pAnalyzeDisplay) { //Get The mutex. EF_ASSERT(WaitForSingleObject(pVolume->m_hAnalyzeDisplayMutex, DISKDISPLAYMUTEXWAITINTERVAL ) == WAIT_OBJECT_0); //Do the draw. pVolume->m_pAnalyzeDisplay->DrawLinesInHDC( NULL, hdc, bPartialRedraw ? NULL : &rect, FALSE); //Release the mutex. EF_ASSERT(ReleaseMutex(pVolume->m_hAnalyzeDisplayMutex)); } //Paint the defrag display. if(pVolume->m_pDefragDisplay) { //Get The mutex. EF_ASSERT(WaitForSingleObject(pVolume->m_hDefragDisplayMutex, DISKDISPLAYMUTEXWAITINTERVAL ) == WAIT_OBJECT_0); //Do the draw. pVolume->m_pDefragDisplay->DrawLinesInHDC( NULL, hdc, bPartialRedraw ? NULL : &rect, FALSE); //Release the mutex. EF_ASSERT(ReleaseMutex(pVolume->m_hDefragDisplayMutex)); } return TRUE; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: Paints the information in the graphics window. Most code extracted from DrawBackgroundBorders. GLOBAL VARIABLES: INPUT: RETURN: TRUE = success FALSE = error */ static BOOL PaintGraphicsWindowBackground( HDC WorkDC ) { /* HDC OutputDC, WorkDC; HANDLE hBitmap = NULL; // Get the DC OutputDC = GetDC(hwndGraphics); WorkDC = CreateCompatibleDC(OutputDC); EF_ASSERT(hBitmap = CreateCompatibleBitmap(OutputDC, rcGraphics.right-rcGraphics.left, rcGraphics.bottom-rcGraphics.top)); SelectObject(WorkDC, hBitmap); */ HBRUSH hBrush; RECT rcAll; // Note we want to paint ALL of the graphics window. rcAll = rcGraphics; rcAll.top = 0; rcAll.left = 0; // Paint the entire graphics window to the system color hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); FillRect(WorkDC, &rcAll, hBrush); DeleteObject(hBrush); // Fill the dark gray analyze and defrag graphics area hBrush = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW)); FillRect(WorkDC, &rcAnalyzeDisp, hBrush); FillRect(WorkDC, &rcDefragDisp, hBrush); DeleteObject(hBrush); // edge below the list view is at the very top of this window //ESIDrawEdge(WorkDC, rcListView.left, 0, rcListView.right, 0); //DrawEdge(WorkDC, &rcCtlRect, BDR_SUNKENINNER|BDR_RAISEDOUTER, BF_TOP); DrawEdge(WorkDC, &rcCtlRect, EDGE_BUMP, BF_TOP); // Draw the sunken box borders around the analyze and defragment grapics displays DrawBorderEx(WorkDC, rcAnalyzeBorder, SUNKEN_BOX); DrawBorderEx(WorkDC, rcDefragBorder, SUNKEN_BOX); // Draw the text above the analyze and defrag displays SetBkColor(WorkDC, GetSysColor(COLOR_BTNFACE)); SetBkMode(WorkDC, OPAQUE); SetTextColor(WorkDC, GetSysColor(COLOR_BTNTEXT)); SelectObject(WorkDC, g_hFont); TCHAR cString[300]; EH_ASSERT(LoadString(hInstRes, IDS_LABEL_ANALYSIS_DISPLAY, cString, sizeof(cString)/sizeof(TCHAR))); TextOut(WorkDC, rcAnalyzeDisp.left-1, rcAnalyzeDisp.top-20, cString, wcslen(cString)); EH_ASSERT(LoadString(hInstRes, IDS_LABEL_DEFRAG_DISPLAY, cString, sizeof(cString)/sizeof(TCHAR))); TextOut(WorkDC, rcDefragDisp.left-2, rcDefragDisp.top-20, cString, wcslen(cString)); // If we had an analyze or defrag display then tell the user that we are resizing. SetBkMode(WorkDC, TRANSPARENT); // make the text white in all color schemes SetTextColor(WorkDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); // get the label that appears in the graphics wells TCHAR defragLabel[300]; TCHAR analyzeLabel[300]; CVolume *pVolume = VolumeList.GetCurrentVolume(); switch (pVolume->DefragState()){ case DEFRAG_STATE_NONE: wcscpy(analyzeLabel, L""); wcscpy(defragLabel, L""); break; case DEFRAG_STATE_ANALYZING: EH_ASSERT(LoadString(hInstRes, IDS_LABEL_ANALYZING, analyzeLabel, sizeof(analyzeLabel)/sizeof(TCHAR))); wcscat(analyzeLabel, L" "); wcscat(analyzeLabel, pVolume->DisplayLabel()); wcscpy(defragLabel, L""); break; case DEFRAG_STATE_ANALYZED: EH_ASSERT(LoadString(hInstRes, IDS_LABEL_CREATING_COLOR_IMAGE, analyzeLabel, sizeof(analyzeLabel)/sizeof(TCHAR))); wcscpy(defragLabel, L""); break; case DEFRAG_STATE_REANALYZING: EH_ASSERT(LoadString(hInstRes, IDS_LABEL_REANALYZING, analyzeLabel, sizeof(analyzeLabel)/sizeof(TCHAR))); wcscat(analyzeLabel, L" "); wcscat(analyzeLabel, pVolume->DisplayLabel()); wcscpy(defragLabel, L""); break; case DEFRAG_STATE_DEFRAGMENTING: EH_ASSERT(LoadString(hInstRes, IDS_LABEL_RESIZING, analyzeLabel, sizeof(analyzeLabel)/sizeof(TCHAR))); EH_ASSERT(LoadString(hInstRes, IDS_LABEL_DEFRAGMENTING, defragLabel, sizeof(defragLabel)/sizeof(TCHAR))); wcscat(defragLabel, L" "); wcscat(defragLabel, pVolume->DisplayLabel()); break; case DEFRAG_STATE_DEFRAGMENTED: EH_ASSERT(LoadString(hInstRes, IDS_LABEL_RESIZING, analyzeLabel, sizeof(analyzeLabel)/sizeof(TCHAR))); EH_ASSERT(LoadString(hInstRes, IDS_LABEL_RESIZING, defragLabel, sizeof(defragLabel)/sizeof(TCHAR))); break; default: wcscpy(analyzeLabel, L""); wcscpy(defragLabel, L""); } // override the others if the user pressed "Stop" if (pVolume->StoppedByUser()){ wcscpy(analyzeLabel, L""); wcscpy(defragLabel, L""); } // write the text into the graphic wells DrawText(WorkDC, analyzeLabel, wcslen(analyzeLabel), &rcAnalyzeDisp, DT_CENTER); DrawText(WorkDC, defragLabel, wcslen(defragLabel), &rcDefragDisp, DT_CENTER); /////////////////////////////////////////////////////////////////////////////////////////////// // Drawing the buttons is accomplished by simply positioning them. pAnalyzeButton->PaintButton(); pDefragButton->PaintButton(); pPauseButton->PaintButton(); pStopButton->PaintButton(); pReportButton->PaintButton(); /* EF(BitBlt (OutputDC, rcGraphics.left, rcGraphics.top, rcGraphics.right-rcGraphics.left, rcGraphics.bottom-rcGraphics.top, WorkDC, 0, 0, SRCCOPY)); // Cleanup the bitmap stuff. DeleteObject(hBitmap); ReleaseDC(hwndGraphics, WorkDC); ReleaseDC(hwndGraphics, OutputDC); */ return TRUE; } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: GLOBAL VARIABLES: INPUT: None; RETURN: None. */ void SetButtonState(void) { CVolume *pVolume = VolumeList.GetCurrentVolume(); pAnalyzeButton->ShowButton(SW_SHOW); pDefragButton->ShowButton(SW_SHOW); pReportButton->ShowButton(SW_SHOW); pPauseButton->ShowButton(SW_SHOW); pStopButton->ShowButton(SW_SHOW); if (pVolume == (CVolume *) NULL) return; // set the pause/resume text correctly if (pVolume->Paused()){ pPauseButton->SetText(hInstRes, IDS_BTN_RESUME); } else { pPauseButton->SetText(hInstRes, IDS_BTN_PAUSE); } if (pVolume->Locked()){ // turn off all buttons if this volume is locked pAnalyzeButton->EnableButton(FALSE); pDefragButton->EnableButton(FALSE); pReportButton->EnableButton(FALSE); pPauseButton->EnableButton(FALSE); pStopButton->EnableButton(FALSE); } else if (VolumeList.DefragInProcess()){ // one of the volumes is being analyzed/defragged pAnalyzeButton->EnableButton(FALSE); pDefragButton->EnableButton(FALSE); pReportButton->EnableButton(FALSE); if (pVolume->EngineState() == ENGINE_STATE_RUNNING){ // the selected vol is being analyzed/defragged pPauseButton->EnableButton(TRUE); pStopButton->EnableButton(TRUE); } else{ pPauseButton->EnableButton(FALSE); pStopButton->EnableButton(FALSE); } } else{ // neither defrag nor analyze are not running on any volumes pAnalyzeButton->EnableButton(TRUE); pDefragButton->EnableButton(TRUE); pPauseButton->EnableButton(FALSE); pStopButton->EnableButton(FALSE); // is the report available for the currently selected volume? if (pVolume->IsReportOKToDisplay()){ pReportButton->EnableButton(TRUE); } else{ pReportButton->EnableButton(FALSE); } } } /***************************************************************************************************************** COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. ROUTINE DESCRIPTION: GLOBAL VARIABLES: INPUT: None; RETURN: None. */ BOOL DestroyGraphicsWindow( ) { if(hwndGraphics != NULL) { DestroyWindow(hwndGraphics); hwndGraphics = NULL; } if(pAnalyzeButton){ delete pAnalyzeButton; } if(pDefragButton){ delete pDefragButton; } if(pPauseButton){ delete pPauseButton; } if(pStopButton){ delete pStopButton; } if(pReportButton){ delete pReportButton; } return TRUE; }