BOOL CProgressWnd::Create(CWnd* pParent, LPCTSTR pszTitle, BOOL bEnableCancel, /* = TRUE */ BOOL bSmooth /* = FALSE */)
{
    BOOL bSuccess;

    // Register window class
    CString csClassName = AfxRegisterWndClass(CS_OWNDC|CS_HREDRAW|CS_VREDRAW,
                                              ::LoadCursor(NULL, IDC_APPSTARTING),
                                              CBrush(::GetSysColor(COLOR_BTNFACE)));

    // Get the system window message font for use in the cancel button and text area
    NONCLIENTMETRICS ncm;
    ncm.cbSize = sizeof(NONCLIENTMETRICS);
    VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
    m_font.CreateFontIndirect(&(ncm.lfMessageFont)); 

    // If no parent supplied then try and get a pointer to it anyway
    if (!pParent)
        pParent = AfxGetMainWnd();

    // Create popup window
    bSuccess = CreateEx(WS_EX_DLGMODALFRAME,               // Extended style
                        csClassName,                       // Classname
                        pszTitle,                          // Title
                        WS_POPUP|WS_BORDER|WS_CAPTION,     // style
                        0,0,                               // position - updated soon.
                        390,130,                           // Size - updated soon
                        pParent->GetSafeHwnd(),            // handle to parent
                        0,                                 // No menu
                        NULL);    
    if (!bSuccess) 
		return FALSE;

    // Now create the controls
    CRect TempRect(0,0,10,10);

    bSuccess = m_Text.Create(_T(""), WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_LEFTNOWORDWRAP,
                             TempRect, this, IDC_TEXT);
    if (!bSuccess)
		return FALSE;

    DWORD dwProgressStyle = WS_CHILD|WS_VISIBLE;
#ifdef PBS_SMOOTH    
    if (bSmooth)
       dwProgressStyle |= PBS_SMOOTH;
#endif
    bSuccess = m_wndProgress.Create(dwProgressStyle, TempRect, this, IDC_PROGRESS);
    if (!bSuccess) 
		return FALSE;

    bSuccess = m_CancelButton.Create(m_strCancelLabel, 
                                     WS_CHILD|WS_VISIBLE|WS_TABSTOP| BS_PUSHBUTTON, 
                                     TempRect, this, IDC_CANCEL);
    if (!bSuccess)
       	return FALSE;

    m_CancelButton.SetFont(&m_font, TRUE);
    m_Text.SetFont(&m_font, TRUE);
    if (!bEnableCancel)
    {
        m_bEnableCancel = bEnableCancel;
        m_CancelButton.EnableWindow(FALSE);
    }

    // Resize the whole thing according to the number of text lines, desired window
    // width and current font.
    SetWindowSize(m_nNumTextLines, 390);

    // Center and show window
    if (m_bPersistantPosition)
        GetPreviousSettings();
    else
        CenterWindow();

    Show();

    return TRUE;
}
Пример #2
0
//=============================================================================
BOOL CXProgressWnd::Create(CWnd *pParent, 
						  LPCTSTR lpszTitle, 
// start modified code: added to allow dialog with only a message
						  BOOL bEnableCancel /* = TRUE */,
						  BOOL bEnableProgressBar /* = TRUE */,
// end modified code
						  LPCTSTR lpszAviId /*= NULL*/,
						  BOOL bSmooth /* = FALSE */)
//=============================================================================
{
	BOOL bSuccess = FALSE;

	m_pParent = pParent;
	ASSERT(m_pParent);
	if (!m_pParent)
		return FALSE;

	m_strTitle = lpszTitle;
	m_nPercentComplete = 0;

	struct OLD_NONCLIENTMETRICS
	{
		UINT    cbSize;
		int     iBorderWidth;
		int     iScrollWidth;
		int     iScrollHeight;
		int     iCaptionWidth;
		int     iCaptionHeight;
		LOGFONT lfCaptionFont;
		int     iSmCaptionWidth;
		int     iSmCaptionHeight;
		LOGFONT lfSmCaptionFont;
		int     iMenuWidth;
		int     iMenuHeight;
		LOGFONT lfMenuFont;
		LOGFONT lfStatusFont;
		LOGFONT lfMessageFont;
	};

	// Get the system window message font for use in 
	// the cancel button and messages

	// the size of the NONCLIENTMETRICS struct increased 
	// in Vista by an int (iPaddedBorderWidth)
	const UINT cbProperSize = IsVistaOrLater() ? 
		sizeof(OLD_NONCLIENTMETRICS)+sizeof(int) :
		sizeof(OLD_NONCLIENTMETRICS);

	NONCLIENTMETRICS ncm;
	ncm.cbSize = cbProperSize;

	VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, cbProperSize, &ncm, 0));
    VERIFY(m_font.CreateFontIndirect(&(ncm.lfMessageFont)));

	// register window class
	CString csClassName = AfxRegisterWndClass(CS_OWNDC|CS_HREDRAW|CS_VREDRAW,
											  ::LoadCursor(NULL, IDC_APPSTARTING),
											  CBrush(::GetSysColor(COLOR_BTNFACE)));

	// create popup window
	bSuccess = CreateEx(WS_EX_DLGMODALFRAME/*|WS_EX_TOPMOST*/,	// Extended style
						csClassName,						// Classname
						m_strTitle,							// Title
						WS_POPUP|WS_BORDER|WS_CAPTION|WS_SYSMENU,		// style
						0,0,								// position - updated soon.
						390,130,							// Size - updated soon
						m_pParent->GetSafeHwnd(),			// handle to parent
						0,									// No menu
						NULL);	
	if (!bSuccess) 
		return FALSE;

	SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

	// now create the controls
	CRect TempRect(0,0,10,10);

// start modified code: added to allow dialog with only a message
	m_bEnableCancel = bEnableCancel;
	m_bEnableProgressBar = bEnableProgressBar;

	if (bEnableProgressBar)
	{
// end modified code
		DWORD dwProgressStyle = WS_CHILD|WS_VISIBLE;
#ifdef PBS_SMOOTH	
		if (bSmooth)
		   dwProgressStyle |= PBS_SMOOTH;
#endif
		bSuccess = m_wndProgress.Create(dwProgressStyle, TempRect, this, IDC_PROGRESS);
		if (!bSuccess) 
			return FALSE;
// start modified code: added to allow dialog with only a message
	}
// end modified code

	if (lpszAviId)
	{
		bSuccess = m_avi.Create(WS_CHILD|ACS_CENTER|ACS_TRANSPARENT|ACS_AUTOPLAY|WS_TABSTOP,
								TempRect, 
								this, 
								IDC_AVI);

		if (!bSuccess)
			return FALSE;

		UINT nID = (UINT) lpszAviId;

		if (HIWORD(nID))
			VERIFY(m_avi.Open(lpszAviId));		// open file
		else
			VERIFY(m_avi.Open(nID));			// open resource id
	}

// start modified code: added to allow dialog with only a message
	if (bEnableCancel)
	{
// end modified code
		bSuccess = m_CancelButton.Create(m_strCancelLabel, 
									 WS_CHILD|WS_VISIBLE|WS_TABSTOP| BS_PUSHBUTTON, 
									 TempRect, this, IDC_CANCEL);
		if (!bSuccess)
			return FALSE;

		m_CancelButton.SetFont(&m_font, TRUE);
// start modified code: added to allow dialog with only a message
	}
// end modified code

	// resize the whole thing according to the number of text lines, desired window
	// width and current font.
	SetWindowSize(m_nNumTextLines, 390);

	// center and show window
	if (m_bPersistentPosition)
		GetPreviousSettings();
	else
		CenterWindow();

	Show();

	return TRUE;
}