////////////////////////////////////////////////////////////////////////////// // // RUNNOW.CPP / Tuneup // // Microsoft Confidential // Copyright (c) Microsoft Corporation 1998 // All rights reserved // // 8/98 - Jason Cohen (JCOHEN) // ////////////////////////////////////////////////////////////////////////////// // // Internal include file(s). // #include #include "tasks.h" #include "main.h" // // Internal defined value(s). // #define CHECK_WIDTH 18 #define FIRST_SPACING 7 #define LINE_SPACING 13 #define WINGDING_CHECK 0xFC #define WINGDING_ARROW 0xD8 //0x77 //0xE8 //0xE0 #define WM_PROGRESS (WM_USER + 1000) // // Internal global variable(s). // HWND g_hWndRunNowDlg = NULL; // // Inernal function prototype(s). // static INT RunNowProgressProc(DWORD); static BOOL CALLBACK RunNowDlgProc(HWND, UINT, WPARAM, LPARAM); static VOID InitWingdingFont(HWND); // // External function(s). // VOID RunTasksNow(HWND hWndParent, LPTASKDATA lpTasks) { HANDLE hThread; DWORD dwThreadID; // Use another thread to run progressing dialog. // hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) RunNowProgressProc, (LPVOID) NULL, 0, (LPDWORD) &dwThreadID); // Hide the wizard window. // ShowEnableWindow(hWndParent, FALSE); // Wait for the dialog to be created. // while ( g_hWndRunNowDlg == NULL ) Sleep(10); // Loop through all the tasks. // while ( lpTasks && g_hWndRunNowDlg ) { // Check to see if it is scheduled. // if ( !(g_dwFlags & TUNEUP_CUSTOM) || (lpTasks->dwOptions & TASK_SCHEDULED) ) { // Put an arrow next to the item. // SendMessage(g_hWndRunNowDlg, WM_PROGRESS, 0, 0L); // Execute the task. // ExecAndWait(hWndParent, lpTasks->lpFullPathName, lpTasks->lpParameters, NULL, FALSE, FALSE); } lpTasks = lpTasks->lpNext; } // If the progress dialog is still there, close it // if ( g_hWndRunNowDlg ) SendMessage(g_hWndRunNowDlg, WM_CLOSE, 0, 0); } // // Internal function(s). // static INT RunNowProgressProc(DWORD dwDummy) { return (INT)DialogBox(g_hInst, MAKEINTRESOURCE(IDD_PROGRESS), NULL, (DLGPROC) RunNowDlgProc); } static BOOL CALLBACK RunNowDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static POINT Point; static INT nHeight, nIndex = -1; static HWND hWndTemp = NULL, *lphWnd = NULL; static HFONT hBoldFont = NULL, hNormFont = NULL; TCHAR szWingDing[] = _T(" "); POINT PointMove; RECT Rect, RectDlg; LPTASKDATA lpTasks; switch (message) { case WM_COMMAND: if ( (INT) LOWORD(wParam) == IDCANCEL ) EndDialog(hDlg, 0); return 0; case WM_DESTROY: // Free the font handles. // if ( hBoldFont ) DeleteObject(hBoldFont); if ( hNormFont ) DeleteObject(hNormFont); InitWingdingFont(NULL); // Free the hWnd. // FREE(lphWnd); g_hWndRunNowDlg = NULL; return TRUE; case WM_INITDIALOG: // Disable system menu itmes. // //EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_DISABLED); // Move the window to the upper right corner of the desktop. // CenterWindow(hDlg, NULL, TRUE); // Get the rect of the title control we are going to base all the others of. // GetWindowRect(GetDlgItem(hDlg, IDC_TITLE), &Rect); MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2); // Figure the width and height of the new controls. // Rect.right -= Rect.left; // The width of the control. Rect.bottom -= Rect.top; // The height of the control. // Now we need to convert the left top coordinates from screen to client coordinates. // Point.x = Rect.left; // The left of the control. Point.y = Rect.top; // The top of the control. Point.y += FIRST_SPACING; // Allocate the memory for the hWnds. // nHeight = TasksScheduled(g_Tasks); lphWnd = (HWND *) MALLOC(sizeof(HWND) * nHeight--); nIndex = nHeight; for (lpTasks = g_Tasks; lpTasks; lpTasks = lpTasks->lpNext) { // Check to see if it is scheduled. // if ( !(g_dwFlags & TUNEUP_CUSTOM) || (lpTasks->dwOptions & TASK_SCHEDULED) ) { // Each new control should be 2 times the width of the control down // from the previous control. This will give 1 width of the control // between each. // Point.y += Rect.bottom + LINE_SPACING; // Create the control and set the font and text. // hWndTemp = CreateWindow(_T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, Point.x + CHECK_WIDTH, Point.y, Rect.right - CHECK_WIDTH, Rect.bottom, hDlg, NULL, g_hInst, NULL); if ( hNormFont == NULL ) hNormFont = (HFONT) SendDlgItemMessage(hDlg, IDC_TITLE, WM_GETFONT, 0, 0L); SendMessage(hWndTemp, WM_SETFONT, (WPARAM) hNormFont, MAKELPARAM(FALSE, 0)); SetWindowText(hWndTemp, lpTasks->lpTitle); // If we can, save the hwnd so we can use it to make // the current text bold. // if ( lphWnd && (nIndex >= 0) ) *(lphWnd + nIndex) = hWndTemp; nIndex--; } } // Make sure we allocated the memory and used all of it. // nIndex should be exatly -1 if we got the right number // of hWnds. // if ( lphWnd && (nIndex == -1) ) nIndex = nHeight; else nIndex = -1; // Reset this so that the progress message knows the // first time it is run. // hWndTemp = NULL; // Make sure that the Point.y is at the bottom of the // last control created by adding the height of the control // to it. // Point.y += Rect.bottom; // Get the current position in client coordinates // of the Cancel button. // GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &Rect); MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2); PointMove.x = Rect.left; PointMove.y = Rect.top; GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &Rect); // Get the rect of the dialog in screen coordinates. // GetWindowRect(hDlg, &RectDlg); // Move up the cancel button based on the bottom of the last control // created and adding the space between the bottom of the cancel button // and the bottom of the dialog. // PointMove.y = Point.y + (RectDlg.bottom - Rect.bottom); // Move the Cancel button so it is up under the last control created. // SetWindowPos(GetDlgItem(hDlg, IDCANCEL), NULL, PointMove.x, PointMove.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); // Set where the bottom of the dialog in screen coordinates should // be based on where the cancel button was moved to. // Point.x = 0; // Don't care. Point.y = PointMove.y + RectDlg.bottom - Rect.top; ClientToScreen(hDlg, &Point); // Move up the bottom of the dialog so it is just under the cancel button. // SetWindowPos(hDlg, NULL, 0, 0, RectDlg.right - RectDlg.left, Point.y - RectDlg.top, SWP_NOMOVE | SWP_NOZORDER); g_hWndRunNowDlg = hDlg; return FALSE; case WM_PROGRESS: // Check to see if this is the first // time this function is run. // if ( hWndTemp == NULL ) { // Get the rect of the title control we are going to base all the others of. // We need to convert the left top coordinates from screen to client coordinates. // GetWindowRect(GetDlgItem(hDlg, IDC_TITLE), &Rect); MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2); Point.x = Rect.left; // The left of the control. Point.y = Rect.top; // The top of the control. nHeight = Rect.bottom - Rect.top; // The height of the control. MapWindowPoints(NULL, hDlg, (LPPOINT)&Rect, 2); Point.y += FIRST_SPACING; } else { // Set the previous control to checked before creating the next one. // szWingDing[0] = (TCHAR) WINGDING_CHECK; SetWindowText(hWndTemp, szWingDing); if ( lphWnd && (nIndex >= 0) ) SendMessage(*(lphWnd + nIndex), WM_SETFONT, (WPARAM) hNormFont, MAKELPARAM(TRUE, 0)); nIndex--; } // Each new control should be 2 times the width of the control down // from the previous control. This will give 1 width of the control // between each. // Point.y += nHeight + LINE_SPACING; // Create the control and set the wingding font and arrow text. // hWndTemp = CreateWindow(_T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, Point.x, Point.y, CHECK_WIDTH, nHeight, hDlg, NULL, g_hInst, NULL); InitWingdingFont(hWndTemp); szWingDing[0] = (TCHAR) WINGDING_ARROW; SetWindowText(hWndTemp, szWingDing); // Bold the current item if we can. // if ( lphWnd && (nIndex >= 0) ) { if ( hBoldFont == NULL ) hBoldFont = GetFont(*(lphWnd + nIndex), NULL, 10, FW_BOLD); if ( hBoldFont ) SendMessage(*(lphWnd + nIndex), WM_SETFONT, (WPARAM) hBoldFont, MAKELPARAM(TRUE, 0)); } return TRUE; default: return FALSE; } } static VOID InitWingdingFont(HWND hWndCtrl) { static HFONT hCheckFont = NULL; TCHAR szFontName[32]; DWORD dwFontSize; // If NULL is passed in, we should free the font handle. // if ( hWndCtrl == NULL ) { // Free the font handle. // if ( hCheckFont ) DeleteObject(hCheckFont); } else { // We may already have the handle to the font we need, // but if not, we need to get it. // if ( hCheckFont == NULL ) { // Get the font size. // if ( LoadString(NULL, IDS_CHECKFONTSIZE, szFontName, sizeof(szFontName) / sizeof(TCHAR)) ) dwFontSize = _tcstoul(szFontName, NULL, 10); else dwFontSize = 12; // Get the font name. // if ( !LoadString(NULL, IDS_CHECKFONTNAME, szFontName, sizeof(szFontName) / sizeof(TCHAR)) ) lstrcpy(szFontName, _T("Wingdings")); hCheckFont = GetFont(hWndCtrl, szFontName, dwFontSize, FW_BOLD, TRUE); } // Now send the font to the control. // if ( hCheckFont ) SendMessage(hWndCtrl, WM_SETFONT, (WPARAM) hCheckFont, MAKELPARAM(TRUE, 0)); } }