Environment: Visual C++ 6.0
I recently had to add Find in Files functionality similar to that found in Visual C++ 6.0 to an application of mine. I have posted the work here in the hope that some of you might find it useful. I have packaged the classes in a DLL to ease integration with your own project.
The find in files operation runs in its own thread to make it possible to cancel a lengthy search operation. Follow these steps to add Find in Files to your MFC application:
Step 1: Create a window were CFindInFiles can write the results of the search
This window must accept LB_ADDSTRING messages. The LB_ADDSTRING is sent by CFindInFiles to your window to report the results of the find in files operation. The reason I use the LB_ADDSTRING is that used to use a list box in the output window. I have later replaced the list box with an edit control but I am still using LB_ADDSTRING to be compatible with
earlier versions. Have a look at the included demo project for an example on how I did this.
Step 2: Add command handlers to start/stop the find in files operation
void CMainFrame::OnEditFindinfiles()
{
if (m_hStop == INVALID_HANDLE_VALUE)
m_hStop = CreateEvent(NULL, TRUE, FALSE, NULL);
if (m_bFindInFiles)
CancelFindInFiles();
else
StartFindInFiles();
}void CMainFrame::CancelFindInFiles()
{
DWORD dwExit;SetEvent(m_hStop);
// Wait for the find in files thread to exit and
// process windows messages while waiting:
while (m_pFindThread &&
GetExitCodeThread(m_pFindThread->m_hThread,
&dwExit))
{
MSG msg;
if (dwExit != STILL_ACTIVE)
break;
theApp.OnIdle(0);
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!theApp.PumpMessage())
{
::PostQuitMessage(0);
return;
}
}
}
ResetEvent(m_hStop);
m_bFindInFiles = false;
}void CMainFrame::StartFindInFiles()
{
m_pFindThread =
StartFindThread(m_wndOutputBar.GetFindHwnd(),
m_hStop);
m_bFindInFiles = true;
}void CMainFrame::OnUpdateEditFindinfiles(CCmdUI* pCmdUI)
{
if (m_pFindThread != NULL)
{
DWORD dwExit;
GetExitCodeThread(m_pFindThread->m_hThread, &dwExit);
if (dwExit != STILL_ACTIVE)
{
delete m_pFindThread;
m_pFindThread = NULL;
m_bFindInFiles = false;
}
}
pCmdUI->SetCheck(m_pFindThread != NULL);
}
Again, have a look at the accompanying demo program for a complete example.