⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testwizardinfo.cpp

📁 WTL8.0 包含的头文件 例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	switch(pageDialogId)
	{
	case IDD_WIZ97_WELCOME:
		topicPath = _T("/TestWizard_Welcome.html");
		break;
	case IDD_WIZ97_PATHFILTER:
		topicPath = _T("/TestWizard_PathFilter.html");
		break;
	case IDD_WIZ97_FILEPREVIEW:
		topicPath = _T("/TestWizard_PreviewFileList.html");
		break;
	case IDD_WIZ97_OUTPUT:
		topicPath = _T("/TestWizard_Output.html");
		break;
	case IDD_WIZ97_COMPLETION:
		topicPath = _T("/TestWizard_Completion.html");
		break;
	}

	TCHAR helpFileLink[2*MAX_PATH+1] = {0};
	::GetModuleFileName(NULL, helpFileLink, 2*MAX_PATH);
	::PathRenameExtension(helpFileLink, _T(".chm"));

	UINT command = HH_DISPLAY_TOC;
	if(topicPath)
	{
		command = HH_DISPLAY_TOPIC;
		::lstrcat(helpFileLink, _T("::"));
		::lstrcat(helpFileLink, topicPath);
	}

	// Add the window name
	::lstrcat(helpFileLink, _T(">$global_main"));

	// In real code, you'd probably want the "main frame" to be hWndHelpParent.
	HWND hWndHelpParent = ::GetActiveWindow();

	HWND hWndHelp = ::HtmlHelp(hWndHelpParent, helpFileLink, command, NULL);
	ATLASSERT(hWndHelp != NULL);

	if(hWndHelp != NULL && topicPath != NULL)
	{
		// NOTE: It'd probably be better to use the notification
		//  HHN_NAVCOMPLETE to know when we can synchronize
		::Sleep(200);
		::PostMessage(hWndHelp, WM_COMMAND, MAKEWPARAM(IDTB_SYNC, 0), 0);
	}
}

void CTestWizardInfo::ShowContextHelp(LPHELPINFO helpInfo)
{
	TCHAR helpFileLink[2*MAX_PATH+1] = {0};
	::GetModuleFileName(NULL, helpFileLink, 2*MAX_PATH);
	::PathRenameExtension(helpFileLink, _T(".chm"));

	::lstrcat(helpFileLink, _T("::/Context.txt"));

	DWORD idList[3] = { helpInfo->iCtrlId, (DWORD)helpInfo->dwContextId, 0};

	// For more control on the appearance, we could use HH_DISPLAY_TEXT_POPUP
	HWND hWndHelp = ::HtmlHelp((HWND)helpInfo->hItemHandle, helpFileLink, HH_TP_HELP_WM_HELP, (DWORD_PTR)idList);
	ATLASSERT(hWndHelp != NULL);
	if(hWndHelp == NULL)
	{
		::MessageBox(::GetActiveWindow(), _T("Unable to show context help"), _T("Error"), MB_OK | MB_ICONERROR);
	}
}

bool CTestWizardInfo::FinishWizard(HWND hWndParent)
{
	bool success = false;

	switch(m_outputType)
	{
	case eOutput_SendEMail:
		success = this->FinishWizard_SendEMail(hWndParent);
		break;
	case eOutput_SaveToFile:
		success = this->FinishWizard_SaveToFile(hWndParent);
		break;
	case eOutput_Clipboard:
	default:
		success = this->FinishWizard_CopyToClipboard(hWndParent);
		break;
	}

	return success;
}

bool CTestWizardInfo::FinishWizard_CopyToClipboard(HWND hWndParent)
{
	bool success = false;

	CTestWizardFindFile_BuildString callback;
	callback.SetTestWizardInfo(this);

	this->FindFiles(&callback);

	const CString& output = callback.GetOutputString();

	size_t cbOutput = (output.GetLength() + 1) * sizeof(TCHAR);
	HGLOBAL hClipboardData = ::GlobalAlloc((GMEM_MOVEABLE|GMEM_ZEROINIT), cbOutput);
	if(hClipboardData != NULL)
	{
		LPVOID pClipboardData = ::GlobalLock(hClipboardData);
		LPCTSTR sourceData = output.operator LPCTSTR();
		::CopyMemory(pClipboardData, sourceData, cbOutput);
		::GlobalUnlock(hClipboardData);

		BOOL openedClipboard = ::OpenClipboard(hWndParent);
		if(openedClipboard)
		{
			::EmptyClipboard();

#ifdef _UNICODE
			HANDLE handle = ::SetClipboardData(CF_UNICODETEXT, hClipboardData);
			// Let the OS synthesize CF_TEXT
#else
			HANDLE handle = ::SetClipboardData(CF_TEXT, hClipboardData);
			// Let the OS synthesize CF_UNICODETEXT
#endif

			success = (handle != NULL);

			::CloseClipboard();
		}
	}

	if(!success)
	{
		::MessageBox(hWndParent,
			_T("Failed to copy the file list to the clipboard"),
			_T("Error"), MB_OK | MB_ICONERROR);
	}

	return success;
}

bool CTestWizardInfo::FinishWizard_SendEMail(HWND hWndParent)
{
	bool success = false;

	CTestWizardFindFile_BuildString callback;
	callback.SetTestWizardInfo(this);

	this->FindFiles(&callback);

	const CString& output = callback.GetOutputString();

	HMODULE hMapi = LoadLibrary(_T("MAPI32.DLL"));
	if(hMapi)
	{
		LPMAPISENDMAIL pfnMAPISendMail = (LPMAPISENDMAIL) ::GetProcAddress(hMapi, "MAPISendMail");
		if(pfnMAPISendMail)
		{
			USES_CONVERSION;
			MapiMessage message = {0};
			message.lpszNoteText = (LPSTR)T2CA(output);

			ULONG result = pfnMAPISendMail(NULL, NULL, &message, MAPI_DIALOG, 0);
			success = (result == SUCCESS_SUCCESS) || (result == MAPI_USER_ABORT);
		}
		
		::FreeLibrary(hMapi);
		hMapi = NULL;
	}

	if(!success)
	{
		::MessageBox(hWndParent,
			_T("Failed to send the file list via e-mail"),
			_T("Error"), MB_OK | MB_ICONERROR);
	}

	return success;
}

bool CTestWizardInfo::FinishWizard_SaveToFile(HWND hWndParent)
{
	CTestWizardFindFile_SaveToFile callback;
	callback.SetTestWizardInfo(this);

	this->FindFiles(&callback);

	bool success = callback.Succeeded();

	if(!success)
	{
		CString failureReason = callback.GetFailureReason();
		if(failureReason.GetLength() < 1)
		{
			failureReason.Format(
				_T("Failed to save the file list to the file\r\n%s"),
				m_outputFileName);
		}

		::MessageBox(hWndParent,
			failureReason,
			_T("Error"), MB_OK | MB_ICONERROR);
	}

	return success;
}

void CTestWizardFindFile_BuildString::OnFileFound(LPCTSTR directory, LPWIN32_FIND_DATA findFileData)
{
	TCHAR fullFilePath[MAX_PATH+3] = {0};
	::PathCombine(fullFilePath, directory, findFileData->cFileName);
	::lstrcat(fullFilePath, _T("\r\n"));

	m_output += fullFilePath;
}

bool CTestWizardFindFile_SaveToFile::OnBeginFindFiles(void)
{
	m_outputFileName = m_pTestWizardInfo->GetOutputFileName();
	m_outputFileEncoding = m_pTestWizardInfo->GetOutputFileEncoding();

	m_hFile = ::CreateFile(
		m_outputFileName, GENERIC_WRITE, 0, NULL,
		CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(m_hFile == INVALID_HANDLE_VALUE)
	{
		m_succeeded = false;

		m_failureReason.Format(
			_T("Unable to open the file '%s' for writing."),
			m_outputFileName);
	}
	else
	{
		m_succeeded = true;

		switch(m_outputFileEncoding)
		{
		case eEncoding_UCS2:
			{
				// Write out UCS-2 byte order mark (BOM)
				// 0xFEFF
				BYTE bom[2] = {0xFF, 0xFE};
				DWORD cbWritten = 0;
				::WriteFile(m_hFile, bom, 2, &cbWritten, NULL);
			}
			break;
		case eEncoding_UTF8:
			{
				// Write out UTF-8 byte order mark (BOM)
				BYTE bom[3] = {0xEF, 0xBB, 0xBF};
				DWORD cbWritten = 0;
				::WriteFile(m_hFile, bom, 3, &cbWritten, NULL);
			}
			break;
		}
	}

	return m_succeeded;
}

void CTestWizardFindFile_SaveToFile::OnEndFindFiles(void)
{
	if(m_hFile != INVALID_HANDLE_VALUE)
	{
		::CloseHandle(m_hFile);
		m_hFile = INVALID_HANDLE_VALUE;
	}
}

void CTestWizardFindFile_SaveToFile::OnFileFound(LPCTSTR directory, LPWIN32_FIND_DATA findFileData)
{
	if(m_hFile != INVALID_HANDLE_VALUE)
	{
		LPCTSTR fileSpec = findFileData->cFileName;
		DWORD cbWritten = 0;

		switch(m_outputFileEncoding)
		{
		case eEncoding_ASCII:
			{
				USES_CONVERSION;
				LPCSTR directoryA = T2CA(directory);
				LPCSTR fileSpecA = T2CA(fileSpec);

				::WriteFile(m_hFile, directoryA, ::lstrlenA(directoryA)*sizeof(CHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, "\\", 1*sizeof(CHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, fileSpecA, ::lstrlenA(fileSpecA)*sizeof(CHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, "\r\n", 2*sizeof(CHAR), &cbWritten, NULL);
			}
			break;
		case eEncoding_UCS2:
			{
				USES_CONVERSION;
				LPCWSTR directoryW = T2CW(directory);
				LPCWSTR fileSpecW = T2CW(fileSpec);

				::WriteFile(m_hFile, directoryW, ::lstrlenW(directoryW)*sizeof(WCHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, "\\", 1*sizeof(WCHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, fileSpecW, ::lstrlenW(fileSpecW)*sizeof(WCHAR), &cbWritten, NULL);
				::WriteFile(m_hFile, L"\r\n", 2*sizeof(WCHAR), &cbWritten, NULL);
			}
			break;
		case eEncoding_UTF8:
			{
				// NOTE: To preserve unicode characters, use the unicode build.
				//  Otherwise we've already "lost precision" by now with the ANSI/ASCII build
				//  and FindFirstFile(A)/FindNextFile(A).

				USES_CONVERSION;
				LPCWSTR directoryW = T2CW(directory);
				LPCWSTR fileSpecW = T2CW(fileSpec);

				// Directory
				int cchDirectoryW = ::lstrlenW(directoryW);
				int cbDirectoryMB = ::WideCharToMultiByte(CP_UTF8, 0, directoryW, cchDirectoryW, NULL, 0, NULL, NULL );
				LPSTR directoryMB = new CHAR[cbDirectoryMB];
				if(directoryMB)
				{
					::WideCharToMultiByte(CP_UTF8, 0, directoryW, cchDirectoryW, directoryMB, cbDirectoryMB, NULL, NULL );
					::WriteFile(m_hFile, directoryMB, cbDirectoryMB, &cbWritten, NULL );
					delete [] directoryMB;
					directoryMB = NULL;
				}

				// Separator
				::WriteFile(m_hFile, "\\", 1*sizeof(CHAR), &cbWritten, NULL);

				// FileSpec
				int cchFileSpecW = ::lstrlenW(fileSpecW);
				int cbFileSpecMB = ::WideCharToMultiByte(CP_UTF8, 0, fileSpecW, cchFileSpecW, NULL, 0, NULL, NULL );
				LPSTR fileSpecMB = new CHAR[cbFileSpecMB];
				if(fileSpecMB)
				{
					::WideCharToMultiByte(CP_UTF8, 0, fileSpecW, cchFileSpecW, fileSpecMB, cbFileSpecMB, NULL, NULL );
					::WriteFile(m_hFile, fileSpecMB, cbFileSpecMB, &cbWritten, NULL );
					delete [] fileSpecMB;
					fileSpecMB = NULL;
				}

				// Newline
				::WriteFile(m_hFile, "\r\n", 2*sizeof(CHAR), &cbWritten, NULL);
			}
			break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -