📄 testwizardinfo.cpp
字号:
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 + -