CFindInFiles Class (similar to Visual Studio 6.0)

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.

Downloads

Download source and demo project – 70Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read