Exemple #1
0
/*----------------------------------------------------------------------------*\
\*----------------------------------------------------------------------------*/
void DoStop(HWND hwnd, LPARAM lParam)
{
    //
    //  stop the animation
    //
    Animate_Stop(hwndA);
}
INT_PTR
CALLBACK
IntPage1DlgProc(
    _In_ HWND hwndDlg,
    _In_ UINT uMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)

/*++

Routine Description:

    This function is the dialog procedure for the first interior wizard page.
    This page updates the drivers for any existing (present) devices, or
    installs the INF if there aren't any present devices.

Arguments:

    hwndDlg - Supplies a handle to the dialog box window

    uMsg - Supplies the message

    wParam - Supplies the first message parameter

    lParam - Supplies the second message parameter

Return Value:

    This dialog procedure always returns zero.

--*/

{
    LPSHAREDWIZDATA pdata;
    LPNMHDR lpnm;
    HANDLE hThread;
    HKEY hKey;
    DWORD UserPrompted;

    UNREFERENCED_PARAMETER( wParam );

    //
    // Retrieve the shared user data from GWL_USERDATA
    //
    pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

    switch(uMsg) {

    case WM_INITDIALOG :
        //
        // Get the PROPSHEETPAGE lParam value and load it into GWL_USERDATA
        //
        pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
        SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) pdata);
        break;

    case WM_NOTIFY :

        lpnm = (LPNMHDR)lParam;

        switch(lpnm->code) {

        case PSN_SETACTIVE :
            //
            // If we're coming here from the intro page, then disable
            // the Back and Next buttons (we're going to be busy for a
            // little bit updating drivers).
            //
            // If we're coming to this page from anywhere else,
            // immediately jump to the intro page.
            //
            if(pdata->DoDriverUpdatePage) {
                //
                // Reset our flag so that we won't try this again if we
                // go to later pages, then come back to this one.  (We
                // only do anything when the wizard page is accessed in
                // the forward direction, from the Intro page.)
                //
                pdata->DoDriverUpdatePage = FALSE;

                //
                // Set our "UserPrompted" registry flag so the
                // co-installer won't popup its own value-add software
                // chooser page during driver update.
                //
                if(ERROR_SUCCESS == RegCreateKeyEx(
                            HKEY_LOCAL_MACHINE,
                            TEXT("SOFTWARE\\Microsoft\\Toaster"),
                            0,
                            NULL,
                            REG_OPTION_NON_VOLATILE,
                            KEY_READ | KEY_WRITE,
                            NULL,
                            &hKey,
                            NULL)) {

                    UserPrompted = 1;
                    RegSetValueEx(hKey,
                                  TEXT("User Prompted"),
                                  0,
                                  REG_DWORD,
                                  (PBYTE)&UserPrompted,
                                  sizeof(UserPrompted)
                                 );

                    RegCloseKey(hKey);
                }

                //
                // Disable Next, Back, and Cancel
                //
                PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
                EnableWindow(GetDlgItem(GetParent(hwndDlg), IDCANCEL), FALSE);

                //
                // Show "searching" animation...
                //
                ShowWindow(GetDlgItem(hwndDlg, IDC_ANIMATE1), SW_SHOW);
                Animate_Open(GetDlgItem(hwndDlg, IDC_ANIMATE1), MAKEINTRESOURCE(IDA_SEARCHING));
                Animate_Play(GetDlgItem(hwndDlg, IDC_ANIMATE1), 0, -1, -1);

                //
                // Create a thread to do the work of updating the
                // driver, etc.
                //
                pdata->hwndDlg = hwndDlg;

                hThread = CreateThread(NULL,
                                       0,
                                       UpdateDriverThreadProc,
                                       pdata,
                                       0,
                                       NULL
                                      );

                if(hThread) {
                    //
                    // Thread launched successfully--close the handle,
                    // then just wait to be notified of thread's
                    // completion.
                    //
                    CloseHandle(hThread);

                } else {
                    //
                    // Couldn't launch the thread--just move on to the
                    // value-add software page.
                    //
                    PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
                    PropSheet_PressButton(GetParent(hwndDlg), PSBTN_NEXT);
                }

            } else {
                //
                // We're coming "back" to this page.  Skip it, and go
                // to the intro page.
                //
                PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
                PropSheet_PressButton(GetParent(hwndDlg), PSBTN_BACK);
            }
            break;

        case PSN_WIZNEXT :
            //Handle a Next button click, if necessary
            break;

        case PSN_WIZBACK :
            //Handle a Back button click, if necessary
            break;

        case PSN_RESET :
            //Handle a Cancel button click, if necessary
            break;

        default :
            break;
        }
        break;

    case WMX_UPDATE_DRIVER_DONE :
        //
        // Stop "searching" animation...
        //
        Animate_Stop(GetDlgItem(hwndDlg, IDC_ANIMATE1));
        ShowWindow(GetDlgItem(hwndDlg, IDC_ANIMATE1), SW_HIDE);

        //
        // Regardless of whether we succeeded in upgrading any drivers, we'll
        // go ahead and proceed to the value-add software page.
        //
        PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
        EnableWindow(GetDlgItem(GetParent(hwndDlg), IDCANCEL), TRUE);

        PropSheet_PressButton(GetParent(hwndDlg), PSBTN_NEXT);

        break;

    default:
        break;
    }

    return 0;
}
BOOL CALLBACK PrgDlgProc (HWND hDlg, 
							  UINT uMsg, 
							  WPARAM wParam,
							  LPARAM lParam)
{
	HPRGDLG hPrgDlg;

	switch (uMsg) 
	{
		case WM_INITDIALOG:
		{    
			RECT rc;

			SetWindowLong (hDlg, GWL_USERDATA, lParam);
			hPrgDlg=(HPRGDLG)lParam;
			hPrgDlg->hwnd=hDlg;

			// Spawn work thread
			CreateThread (NULL, 0, PrgDlgThreadRoutine, 
				(LPVOID)hPrgDlg, 0, &(hPrgDlg->dwThreadID));

			// Initialize GUI elements
			SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETRANGE, 
				0, MAKELPARAM(0, 100));
			SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
				(WPARAM)hPrgDlg->dwBar, 0);

			if(hPrgDlg->szTitle)
				SetWindowText(hDlg,hPrgDlg->szTitle);

			if(hPrgDlg->szFile)
				SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGFILE),hPrgDlg->szFile);

			if(hPrgDlg->szInfo)
				SetWindowText(GetDlgItem(hPrgDlg->hwnd,IDC_PRGINFO),hPrgDlg->szInfo);

			if(hPrgDlg->dwAVIClip!=0)
			{
				hPrgDlg->bAVIPlaying=TRUE;
				Animate_Open(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI),
					MAKEINTRESOURCE(hPrgDlg->dwAVIClip));
			}

			// Create update timer
			SetTimer(hDlg,UPDATETIMERID,UPDATETIME,NULL);

			// Center window and set to foreground
 			GetWindowRect (hDlg, &rc);
			SetWindowPos (hDlg, NULL,
				(GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2,
				(GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 2,
				0, 0, SWP_NOSIZE | SWP_NOZORDER);
			SetForegroundWindow(hDlg);
			return TRUE;
		}

		case WM_CTLCOLOR:
		{          
 			if(wParam!=0)
			{ 
				DWORD color;

				color=GetSysColor(COLOR_BTNFACE);
				
			  	SetBkColor ((HDC)wParam, color);
			  	SetTextColor ((HDC)wParam, GetSysColor (COLOR_WINDOWTEXT));
			  	return (BOOL)CreateSolidBrush (color);
			} 	 
			break;
		}

		case WM_TIMER:
		{
			BOOL bWindowEnabled;

			hPrgDlg = (HPRGDLG) GetWindowLong(hDlg, GWL_USERDATA);

			if(hPrgDlg->dwAVIClip!=0)
			{
				bWindowEnabled=IsWindowEnabled(hPrgDlg->hwnd);

				if((!bWindowEnabled)&&(hPrgDlg->bAVIPlaying))
				{
					hPrgDlg->bAVIPlaying=FALSE;
					Animate_Stop(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI));
				}

				if((bWindowEnabled)&&(!hPrgDlg->bAVIPlaying))
				{
					hPrgDlg->bAVIPlaying=TRUE;
					Animate_Play(GetDlgItem(hPrgDlg->hwnd,IDC_PRGAVI), 0, -1, -1);
				}
			}

			// If there has been a change, process it
			if(hPrgDlg->dwNewValue!=hPrgDlg->dwOldValue)
			{
				hPrgDlg->dwOldValue=hPrgDlg->dwNewValue;

				SendDlgItemMessage (hDlg, IDC_PROGRESS, PBM_SETPOS,
					(WPARAM)hPrgDlg->dwNewValue, 0);
			}

			break;
		}

		case WM_CLOSE:
		case WM_QUIT:
		case WM_DESTROY:
		{
			EndDialog(hDlg, FALSE);
			break;
		}

		case WM_COMMAND:
		{
			switch(LOWORD (wParam)) 
			{
				case IDCANCEL:
				{
					hPrgDlg = (HPRGDLG) GetWindowLong(hDlg, GWL_USERDATA);
					ShowWindow(hDlg,SW_HIDE);

					hPrgDlg->bCancel=TRUE;
					break;
				}
			}
			break;
		}
	}
	return FALSE;
}
BOOL WINAPI _RtkGuiWaitDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static WAITDLG_CONTEXT *ctx;
//	static HBRUSH hBrush = NULL;
	
    switch(uMsg)
    {
		case WM_SHOWWINDOW:
		{
			HWND hState, hTimeLeft, hTimeRemain, 
				 hProgress, hCancel, hPause, hAnimate;
			
			hPause      = GetDlgItem(hDlg, IDPAUSE);
			hCancel     = GetDlgItem(hDlg, IDCANCEL);
			hState      = GetDlgItem(hDlg, IDC_STATE);
			hAnimate    = GetDlgItem(hDlg, IDC_ANIMATE);
			hProgress   = GetDlgItem(hDlg, IDC_PROGRESS);
			hTimeLeft   = GetDlgItem(hDlg, IDC_TIMELEFT);
			hTimeRemain = GetDlgItem(hDlg, IDC_TIMEREMAIN);

			ctx = (LPWAITDLG_CONTEXT)GetWindowLong(hDlg, GWL_USERDATA);
			ctx->dwLastTime = GetTickCount();
		
			if (ctx->uType & WDS_STATE) {
				ShowWindow(hState, SW_SHOW);
			}

			if (ctx->uType & WDS_ANIMATE) {
				ShowWindow(hAnimate, SW_SHOW);
				Animate_Open(hAnimate, MAKEINTRESOURCE(IDR_WAIT));
			}

			 if (ctx->uType & WDS_CANCEL) {
				ShowWindow(hCancel, SW_SHOW);
			}
			
			if (ctx->uType & WDS_PAUSE) {
				ShowWindow(hPause, SW_SHOW);
			}

			if (ctx->uType & WDS_TIMELEFT) {
				ShowWindow(hTimeLeft, SW_SHOW);
			}

			if (ctx->uType & WDS_TIMEREMAIN) {
				ShowWindow(hTimeRemain, SW_SHOW);
			}
			
			if (ctx->uType & WDS_PROGRESS) {
				ShowWindow(hProgress, SW_SHOW);
			}
			/* 
				土办法,为每种组合调整一次位置,在没有想到更好的方法的时候,
				只好做此下策
				目前支持几种组合是
				1:带cancel按钮和进度条和状态文本
				2:带cancel按钮和进度条和状态文本和时间(剩余时间和已过去时间)
				3:带cancel按钮和进度条和动画和状态文本
				4:带cancel按钮和进度条和动画和状态文本和时间
				
				5:带cancel,pause按钮和进度条和状态文本
				6:带cancel,pause按钮和进度条和动画和状态文本
				7:对于显示不显示timeleft和timeremain就不需要调整位置了
			*/
			switch (ctx->uType)
			{
				case WDS_CANCEL|WDS_PROGRESS|WDS_STATE:
						SetWindowPos(hState, NULL, 6, 10, 0, 0, SWP_NOSIZE);
						SetWindowPos(hProgress, NULL, 6, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hCancel, NULL, 270, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hDlg, NULL, 0, 0, 360, 96, SWP_NOMOVE);
					break;
				
				case WDS_CANCEL|WDS_PROGRESS|WDS_STATE|WDS_TIMELEFT:
						SetWindowPos(hState, NULL, 6, 10, 0, 0, SWP_NOSIZE);
						SetWindowPos(hProgress, NULL, 6, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hCancel, NULL, 270, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hTimeLeft, NULL, 6, 60, 0, 0, SWP_NOSIZE);
						SetWindowPos(hDlg, NULL, 0, 0, 360, 110, SWP_NOMOVE);
					break;
				
				case WDS_CANCEL|WDS_PROGRESS|WDS_STATE|WDS_TIMEREMAIN:
						SetWindowPos(hState, NULL, 6, 10, 0, 0, SWP_NOSIZE);
						SetWindowPos(hProgress, NULL, 6, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hCancel, NULL, 270, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hTimeRemain, NULL, 6, 60, 0, 0, SWP_NOSIZE);
						SetWindowPos(hDlg, NULL, 0, 0, 360, 110, SWP_NOMOVE);
					break;

				case WDS_CANCEL|WDS_PROGRESS|WDS_STATE|WDS_TIMEREMAIN|WDS_TIMELEFT:
						SetWindowPos(hState, NULL, 6, 10, 0, 0, SWP_NOSIZE);
						SetWindowPos(hProgress, NULL, 6, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hCancel, NULL, 270, 30, 0, 0, SWP_NOSIZE);
						SetWindowPos(hTimeLeft, NULL, 6, 60, 0, 0, SWP_NOSIZE);
						SetWindowPos(hTimeRemain, NULL, 215, 60, 0, 0, SWP_NOSIZE);
						SetWindowPos(hDlg, NULL, 0, 0, 360, 110, SWP_NOMOVE);
					break;
			
				case WDS_CANCEL|WDS_PROGRESS|WDS_ANIMATE|WDS_STATE:
						SetWindowPos(hAnimate, NULL, 6, 0, 0, 0, SWP_NOSIZE);
						SetWindowPos(hState, NULL, 10, 70, 0, 0, SWP_NOSIZE);
						SetWindowPos(hProgress, NULL, 6, 90, 0, 0, SWP_NOSIZE);
						SetWindowPos(hCancel, NULL, 270, 90, 0, 0, SWP_NOSIZE);
						SetWindowPos(hDlg, NULL, 0, 0, 360, 156, SWP_NOMOVE);
					break;
			
				case WDS_CANCEL|WDS_PAUSE|WDS_PROGRESS:
					break;

				case WDS_CANCEL|WDS_PAUSE|WDS_PROGRESS|WDS_ANIMATE:
					break;

				default:
					break;
			}

		}	
		return TRUE;
        break;

	case WM_TIMER:
		{
			char szTimeRemain[MAX_PATH], szTimeLeft[MAX_PATH];
		
			if (!ctx->nPos)
			{
				return TRUE;
			}
			if (!ctx->bPause)
			{
				ctx->dwTimeLeft  += GetTickCount() - ctx->dwLastTime;
				ctx->dwLastTime   = GetTickCount();
				ctx->dwTimeRemain = ctx->dwTimeLeft / ctx->nPos * (100 - ctx->nPos);
	
				sprintf(szTimeRemain, 
						"%02d:%02d:%02d", 
						(ctx->dwTimeRemain / 1000) / 3600,
						(ctx->dwTimeRemain / 1000) % 3600 / 60,
						(ctx->dwTimeRemain / 1000) % 60);
				sprintf(szTimeLeft,   
						"%02d:%02d:%02d", 
						(ctx->dwTimeLeft / 1000) / 3600,
						(ctx->dwTimeLeft / 1000) % 3600 / 60,
						(ctx->dwTimeLeft / 1000) % 60);
				
				Static_SetText(GetDlgItem(ctx->hWaitDlg, IDC_TIMEREMAIN), szTimeRemain); 
				Static_SetText(GetDlgItem(ctx->hWaitDlg, IDC_TIMELEFT), szTimeLeft); 
				_ResizeStatic(GetDlgItem(ctx->hWaitDlg, IDC_TIMEREMAIN), szTimeRemain);
				_ResizeStatic(GetDlgItem(ctx->hWaitDlg, IDC_TIMELEFT), szTimeLeft); 
	
			} 
			else
			{
				ctx->dwLastTime = GetTickCount();
			}

		}
		break;


    case WM_COMMAND:
        {
			if (ctx->fnWaitDlg) 
			{
				int nResult;
				switch(LOWORD(wParam)) 
				{
					case IDCANCEL:
						nResult = ctx->fnWaitDlg(ctx, WDN_BTNCLICK, WDC_CANCEL);
						break;
					case IDPAUSE:
						ctx->bPause = !ctx->bPause;
						if (ctx->bPause)
						{
							Animate_Stop(GetDlgItem(hDlg, IDC_ANIMATE));
							RtkGuiWDSetBtnText(ctx, IDPAUSE, "继续");
							nResult = ctx->fnWaitDlg(ctx, WDN_BTNCLICK, WDC_PAUSE);
						}
						else
						{
							Animate_Play(GetDlgItem(hDlg, IDC_ANIMATE), 0, -1, -1,);
							RtkGuiWDSetBtnText(ctx, IDPAUSE, "暂停");
							nResult = ctx->fnWaitDlg(ctx, WDN_BTNCLICK, WDC_RESUME);
						}
						break;
				}
				// 从用户回调函数如果返回-1,则删除此对话框
				if (nResult == -1) {
					SendMessage(ctx->hWaitDlg, WM_DESTROY, 0, 0);
				}
                
            }
			else 
			{
				switch(wParam)
				{
					case IDCANCEL:
						ctx->uLastPushBtn |= WDC_CANCEL;
						break;
					case IDPAUSE:
						ctx->bPause = !ctx->bPause;
						
						if (ctx->bPause)
						{
							Animate_Stop(GetDlgItem(hDlg, IDC_ANIMATE));
							RtkGuiWDSetBtnText(ctx, IDPAUSE, "继续");
							ctx->uLastPushBtn |= WDC_PAUSE;
						}
						else
						{
							Animate_Play(GetDlgItem(hDlg, IDC_ANIMATE), 0, -1, -1,);
							RtkGuiWDSetBtnText(ctx, IDPAUSE, "暂停");
							ctx->uLastPushBtn |= WDC_RESUME;
						}
				
						break;
				}
            }
		}