自己写的搜索文件的程序 点停止后卡死 不知道怎么回事

飞翔的薄荷 2011-02-25 09:55:48
// FindDlg.cpp : 实现文件//

#include "stdafx.h"
#include "Find.h"
#include "FindDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CFindDlg 对话框




CFindDlg::CFindDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CFindDlg::IDD, pParent)
,m_bStart(0),m_threadNumber(0)
{
// memset(m_dir,0,sizeof(m_dir));
memset(m_handle,0,sizeof(m_handle));
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_event = CreateEvent(0,false,0,0);

}


void CFindDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Control(pDX, IDC_NOW_PATH, m_nowpath);
DDX_Control(pDX, IDC_TEMP, m_temp);
}

BEGIN_MESSAGE_MAP(CFindDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CFindDlg::OnBnClickedOk)
ON_WM_DESTROY()
ON_BN_CLICKED(ID_C, &CFindDlg::OnBnClickedC)
ON_MESSAGE(WM_FIND,FindMsg)
ON_BN_CLICKED(ID_PATH, &CFindDlg::OnBnClickedPath)
ON_COMMAND(IDCANCEL, &CFindDlg::OnIdcancel)
ON_COMMAND(IDCLOSE, &CFindDlg::OnIdclose)
ON_NOTIFY(NM_RCLICK, IDC_LIST, &CFindDlg::OnRclickList)
ON_COMMAND(ID_DIR, &CFindDlg::OnDir)
ON_COMMAND(ID_FULLPATH, &CFindDlg::OnFullpath)
ON_NOTIFY(NM_DBLCLK, IDC_LIST, &CFindDlg::OnDblclkList)
ON_EN_KILLFOCUS(IDC_TEMP, &CFindDlg::OnKillfocusTemp)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, &CFindDlg::OnLvnItemchangedList)
ON_EN_CHANGE(IDC_NAME, &CFindDlg::OnChangeName)
END_MESSAGE_MAP()


// CFindDlg 消息处理程序

BOOL CFindDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
//int style = m_list.GetExtendedStyle();
//m_list.SetExtendedStyle(style|LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES );
m_list.InsertColumn(0,_T("修改时间"),0,120);
m_list.InsertColumn(1,_T("大小"),0,80);
m_list.InsertColumn(2,_T("路径"),0,500);

m_temp.ShowWindow(SW_HIDE);


return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CFindDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CFindDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFindDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void TheEnd(void *p)
{
CFindDlg *findDlg = (CFindDlg*) p;
InterlockedExchangeAdd(&(findDlg->m_threadNumber),-1);

if(0<findDlg->m_dirList.size())
{
SetEvent(findDlg->m_event);
}
else
{
if(0==findDlg->m_threadNumber)
{
PostMessage(findDlg->m_hWnd,WM_FIND,fd_over,0);
}
}
}
unsigned __stdcall threadfun(void *p){
CFindDlg *findDlg = (CFindDlg*) p;
TCHAR dir[MAX_PATH] = {0};
TCHAR dir_old[MAX_PATH] = {0};
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
CString str;

while(findDlg->m_bStart)
{
WaitForSingleObject(findDlg->m_event,INFINITE);
if(!findDlg->m_bStart)break;

InterlockedExchangeAdd(&(findDlg->m_threadNumber),1);

EnterCriticalSection(&g_cs[0]);
vector<TCHAR*>::iterator it = findDlg->m_dirList.begin();
if(findDlg->m_dirList.end()==it)
{
LeaveCriticalSection(&g_cs[0]);
TheEnd(p);
continue;
}
if(*it)
{
wcscpy_s(dir,MAX_PATH,*it);
delete *it;
*it = 0;
}
findDlg->m_dirList.erase(it);
findDlg->m_nowpath.SetWindowText(dir);
LeaveCriticalSection(&g_cs[0]);


if( _T('\\')==dir[wcslen(dir)-1])
{
dir[wcslen(dir)-1] = 0;
}

wcscpy_s(dir_old,MAX_PATH,dir);
wcscat_s(dir,MAX_PATH,_T("\\*"));


hFind = FindFirstFile(dir,&FindFileData);
// hFind = FindFirstFile(findDlg->m_findname,&FindFileData);

if(INVALID_HANDLE_VALUE!=hFind)
{
do
{
if(!findDlg->m_bStart)break;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(0==wcscmp(FindFileData.cFileName,_T("..")))continue;
if(0==wcscmp(FindFileData.cFileName,_T(".")))continue;
TCHAR *dir_find = new TCHAR[MAX_PATH];
wcscpy_s(dir_find,MAX_PATH,dir_old);
wcscat_s(dir_find,MAX_PATH,_T("\\"));
wcscat_s(dir_find,MAX_PATH,FindFileData.cFileName);
EnterCriticalSection(&g_cs[0]);
findDlg->m_dirList.push_back(dir_find);
LeaveCriticalSection(&g_cs[0]);
SetEvent(findDlg->m_event);
}
//else
//{
// str = FindFileData.cFileName;
// if(-1!=str.Find(findDlg->m_findname))
// {

// CString temp;
// CListCtrl &list = findDlg->m_list;
// WIN32_FIND_DATA *fd = &FindFileData;
// CTime lastwt(fd->ftLastWriteTime);

// EnterCriticalSection(&g_cs[1]);
// list.InsertItem(0,lastwt.Format(_T("%Y-%m-%d %H:%M:%S")));
// temp.Format(_T("%d"),fd->nFileSizeLow);
// list.SetItemText(0,1,temp);
// temp = CString(dir_old) + _T("\\") + fd->cFileName;
// list.SetItemText(0,2,temp);
// LeaveCriticalSection(&g_cs[1]);
// }
//}
}
while(FindNextFile(hFind,&FindFileData));
}
FindClose(hFind);

wcscpy_s(dir,MAX_PATH,dir_old);
wcscat_s(dir,MAX_PATH,_T("\\"));
wcscat_s(dir,MAX_PATH,findDlg->m_findname);


hFind = FindFirstFile(dir,&FindFileData);
if(INVALID_HANDLE_VALUE!=hFind)
{
do
{
CString temp;
CListCtrl &list = findDlg->m_list;
WIN32_FIND_DATA *fd = &FindFileData;
CTime lastwt(fd->ftLastWriteTime);

EnterCriticalSection(&g_cs[1]);
list.InsertItem(0,lastwt.Format(_T("%Y-%m-%d %H:%M:%S")));
temp.Format(_T("%d"),fd->nFileSizeLow);
list.SetItemText(0,1,temp);
temp = CString(dir_old) + _T("\\") + fd->cFileName;
list.SetItemText(0,2,temp);
LeaveCriticalSection(&g_cs[1]);
if(!findDlg->m_bStart)break;
}
while(FindNextFile(hFind,&FindFileData));
}
FindClose(hFind);

TheEnd(p);
}
SetEvent(findDlg->m_event);
return 0;
}

void CFindDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
m_list.DeleteAllItems();
CString str;
GetDlgItem(IDC_PATH)->GetWindowText(str);
if(str.IsEmpty())
{
MessageBox(_T("请输入查找路径"));
return;
}
TCHAR *dir = new TCHAR[MAX_PATH];
wcscpy_s(dir,MAX_PATH,str);
EnterCriticalSection(&g_cs[0]);
m_dirList.push_back(dir);
LeaveCriticalSection(&g_cs[0]);
GetDlgItem(IDC_NAME)->GetWindowText(m_findname);
if(m_findname.IsEmpty())
{
MessageBox(_T("请输入要查找的文件"));
return;
}

GetDlgItem(IDC_PATH)->EnableWindow(false);
GetDlgItem(ID_PATH)->EnableWindow(false);
GetDlgItem(IDOK)->EnableWindow(false);
GetDlgItem(IDC_NAME)->EnableWindow(false);

m_bStart = true;
SetEvent(m_event);
for(int i = 0; i!=Max_Thread;++i)
{
m_handle[i] = (HANDLE)_beginthreadex(0,0,threadfun,this,0,0);
}
}


void CFindDlg::OnDestroy()
{
CDialogEx::OnDestroy();

// TODO: 在此处添加消息处理程序代码
Stop();

}
BOOL CFindDlg::Stop()
{
if(false==m_bStart)return true;
m_bStart = false;
SetEvent(m_event);

EnterCriticalSection(&g_cs[0]);
vector<TCHAR*>::iterator it = m_dirList.begin();
while(it!=m_dirList.end())
{
if(*it)
{
delete *it;
*it = 0;
}
m_dirList.erase(it);
//++it;
}
//m_dirList.clear();
LeaveCriticalSection(&g_cs[0]);


//int j = 0;
for(int i = 0;i!=Max_Thread;++i)
{
if(m_handle[i]&& -1!=(unsigned)m_handle[i])
{
while(WAIT_TIMEOUT==WaitForSingleObject(m_handle[i],100))
{
//if(20<j)
//{
// _endthreadex((unsigned)m_handle[i]);
//};
SetEvent(m_event);
//++j;
}
CloseHandle(m_handle[i]);
m_handle[i] = 0;
}
}
GetDlgItem(IDC_PATH)->EnableWindow(true);
GetDlgItem(ID_PATH)->EnableWindow(true);
GetDlgItem(IDOK)->EnableWindow(true);
GetDlgItem(IDC_NAME)->EnableWindow(true);
CString temp;
temp.Format(_T("共找到:%d个文件"),m_list.GetItemCount());
GetDlgItem(IDC_ALL)->SetWindowText(temp);
return true;
}


void CFindDlg::OnBnClickedC()
{
// TODO: 在此添加控件通知处理程序代码
Stop();
}
afx_msg LRESULT CFindDlg::FindMsg(WPARAM wparam, LPARAM lparam)
{
switch(wparam)
{
case fd_over:
Stop();
break;
case fd_file:
{

}
break;
default:
break;
}
return 0;
}



...全文
161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔的薄荷 2011-02-26
  • 打赏
  • 举报
回复
终于找到了
主线程中 用了WaitForSingleObject
其他线程中用了 SetItemText(); SetWindowText 之类的函数
然后就出不来了

没办法

正在考虑 在定时器中用WaitForSingleObject 不知道有没有效果


手机写程序 2011-02-26
  • 打赏
  • 举报
回复
可能死锁了吧,lz在EnterCriticalSection前和LeaveCriticalSection后加些trace语句看看。
schlafenhamster 2011-02-26
  • 打赏
  • 举报
回复
不是VC6的 !
飞翔的薄荷 2011-02-26
  • 打赏
  • 举报
回复
3楼 能不能说详细点
飞翔的薄荷 2011-02-26
  • 打赏
  • 举报
回复
这个是处理代码

unsigned __stdcall threadfun(void *p){
CFindDlg *findDlg = (CFindDlg*) p;
TCHAR dir[MAX_PATH] = {0};
TCHAR dir_old[MAX_PATH] = {0};
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
CString str;

while(findDlg->m_bStart)
{
WaitForSingleObject(findDlg->m_event,INFINITE);
if(!findDlg->m_bStart)break;

InterlockedExchangeAdd(&(findDlg->m_threadNumber),1);

EnterCriticalSection(&g_cs[0]);
vector<TCHAR*>::iterator it = findDlg->m_dirList.begin();
if(findDlg->m_dirList.end()==it)
{
LeaveCriticalSection(&g_cs[0]);
TheEnd(p);
continue;
}
if(*it)
{
wcscpy_s(dir,MAX_PATH,*it);
delete *it;
*it = 0;
}
findDlg->m_dirList.erase(it);
findDlg->m_nowpath.SetWindowText(dir);
LeaveCriticalSection(&g_cs[0]);


if( _T('\\')==dir[wcslen(dir)-1])
{
dir[wcslen(dir)-1] = 0;
}

wcscpy_s(dir_old,MAX_PATH,dir);
wcscat_s(dir,MAX_PATH,_T("\\*"));


hFind = FindFirstFile(dir,&FindFileData);
// hFind = FindFirstFile(findDlg->m_findname,&FindFileData);

if(INVALID_HANDLE_VALUE!=hFind)
{
do
{
if(!findDlg->m_bStart)break;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(0==wcscmp(FindFileData.cFileName,_T("..")))continue;
if(0==wcscmp(FindFileData.cFileName,_T(".")))continue;
TCHAR *dir_find = new TCHAR[MAX_PATH];
wcscpy_s(dir_find,MAX_PATH,dir_old);
wcscat_s(dir_find,MAX_PATH,_T("\\"));
wcscat_s(dir_find,MAX_PATH,FindFileData.cFileName);
EnterCriticalSection(&g_cs[0]);
findDlg->m_dirList.push_back(dir_find);
LeaveCriticalSection(&g_cs[0]);
SetEvent(findDlg->m_event);
}
//else
//{
// str = FindFileData.cFileName;
// if(-1!=str.Find(findDlg->m_findname))
// {

// CString temp;
// CListCtrl &list = findDlg->m_list;
// WIN32_FIND_DATA *fd = &FindFileData;
// CTime lastwt(fd->ftLastWriteTime);

// EnterCriticalSection(&g_cs[1]);
// list.InsertItem(0,lastwt.Format(_T("%Y-%m-%d %H:%M:%S")));
// temp.Format(_T("%d"),fd->nFileSizeLow);
// list.SetItemText(0,1,temp);
// temp = CString(dir_old) + _T("\\") + fd->cFileName;
// list.SetItemText(0,2,temp);
// LeaveCriticalSection(&g_cs[1]);
// }
//}
}
while(FindNextFile(hFind,&FindFileData));
}
FindClose(hFind);

wcscpy_s(dir,MAX_PATH,dir_old);
wcscat_s(dir,MAX_PATH,_T("\\"));
wcscat_s(dir,MAX_PATH,findDlg->m_findname);


hFind = FindFirstFile(dir,&FindFileData);
if(INVALID_HANDLE_VALUE!=hFind)
{
do
{
CString temp;
CListCtrl &list = findDlg->m_list;
WIN32_FIND_DATA *fd = &FindFileData;
CTime lastwt(fd->ftLastWriteTime);

EnterCriticalSection(&g_cs[1]);
list.InsertItem(0,lastwt.Format(_T("%Y-%m-%d %H:%M:%S")));
temp.Format(_T("%d"),fd->nFileSizeLow);
list.SetItemText(0,1,temp);
temp = CString(dir_old) + _T("\\") + fd->cFileName;
list.SetItemText(0,2,temp);
LeaveCriticalSection(&g_cs[1]); if(!findDlg->m_bStart)break;
}
while(FindNextFile(hFind,&FindFileData));
}
FindClose(hFind);

TheEnd(p);
}
SetEvent(findDlg->m_event);
return 0;
}





停止代码




BOOL CFindDlg::Stop()
{
if(false==m_bStart)return true;
m_bStart = false;
SetEvent(m_event);

EnterCriticalSection(&g_cs[0]);
vector<TCHAR*>::iterator it = m_dirList.begin();
while(it!=m_dirList.end())
{
if(*it)
{
delete *it;
*it = 0;
}
m_dirList.erase(it);
//++it;
}
//m_dirList.clear();
LeaveCriticalSection(&g_cs[0]);


//int j = 0;
for(int i = 0;i!=Max_Thread;++i)
{
if(m_handle[i]&& -1!=(unsigned)m_handle[i])
{
while(WAIT_TIMEOUT==WaitForSingleObject(m_handle[i],100))
{
//if(20<j)
//{
// _endthreadex((unsigned)m_handle[i]);
//};
SetEvent(m_event);
//++j;
}
CloseHandle(m_handle[i]);
m_handle[i] = 0;
}
} GetDlgItem(IDC_PATH)->EnableWindow(true);
GetDlgItem(ID_PATH)->EnableWindow(true);
GetDlgItem(IDOK)->EnableWindow(true);
GetDlgItem(IDC_NAME)->EnableWindow(true);
CString temp;
temp.Format(_T("共找到:%d个文件"),m_list.GetItemCount());
GetDlgItem(IDC_ALL)->SetWindowText(temp);
return true;
}


2楼有工程可以下载
Zimmerk 2011-02-26
  • 打赏
  • 举报
回复
应该是死锁了,用8楼的方法看看后面有没有输出,没有就是死锁了
Zimmerk 2011-02-25
  • 打赏
  • 举报
回复
太多了,没心看,给出停止的代码和处理停止消息的代码就可以了
心留 2011-02-25
  • 打赏
  • 举报
回复
里面有非法访问的危险。
飞翔的薄荷 2011-02-25
  • 打赏
  • 举报
回复
懒得看到
可以下载
http://download.csdn.net/source/3043272
飞翔的薄荷 2011-02-25
  • 打赏
  • 举报
回复
void CFindDlg::OnBnClickedPath()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR path[MAX_PATH] = {0};
DoBrowse(this->m_hWnd,_T("选择路径"),path);
GetDlgItem(IDC_PATH)->SetWindowText(path);
}


void CFindDlg::OnIdcancel()
{
// TODO: 在此添加命令处理程序代码
CDialogEx::OnCancel();
}


void CFindDlg::OnIdclose()
{
// TODO: 在此添加命令处理程序代码
CDialogEx::OnCancel();
}



BOOL CFindDlg::DoBrowse(HWND hWndParent, LPCTSTR pszTitle,TCHAR *Path)
{
BROWSEINFO bi = {0};
//LPITEMIDLIST pidlTarget = 0;
if(pszTitle == NULL)
bi.lpszTitle = _T("选择目标文件夹");
else
bi.lpszTitle = pszTitle;

bi.hwndOwner = hWndParent;
LPITEMIDLIST pItem = ::SHBrowseForFolder(&bi);
if(pItem != 0)
{
::SHGetPathFromIDList(pItem, Path);
::CoTaskMemFree(pItem);
return TRUE;
}
return FALSE;
}


void CFindDlg::OnDir()
{
// TODO: 在此添加命令处理程序代码
TCHAR path[MAX_PATH] = {0};
//m_list.GetItemText(m_list.GetNextItem(-1,LVNI_SELECTED),2,path,MAX_PATH);
wcscpy_s(path,MAX_PATH,m_SelectStr);
PathRemoveFileSpec(path);
ShellExecute(m_hWnd,_T("open"),path,0,0,SW_SHOWDEFAULT);
}


void CFindDlg::OnFullpath()
{
// TODO: 在此添加命令处理程序代码
TCHAR path[MAX_PATH] = {0};
wcscpy_s(path,MAX_PATH,m_SelectStr);
//m_list.GetItemText(m_list.GetNextItem(-1,LVNI_SELECTED),2,path,MAX_PATH);
//PathRemoveFileSpec(path);
//_texecl(path,path);
ShellExecute(m_hWnd,0,path,0,0,SW_SHOWDEFAULT);
}


void CFindDlg::OnDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//int item = m_list.GetNextItem(-1,LVNI_SELECTED);
//if(-1==item||m_bStart)return;
CPoint pt(pNMItemActivate->ptAction);

LVHITTESTINFO lvhti;
lvhti.pt = pNMItemActivate->ptAction;
m_list.SubItemHitTest(&lvhti);
m_SelectStr = _T("");
if(-1==lvhti.iItem)return;

LVITEMINDEX lvItemIndex;
lvItemIndex.iGroup = -1;
lvItemIndex.iItem = lvhti.iItem;
CRect rect;
BOOL bRet = m_list.GetItemIndexRect(&lvItemIndex, 0, LVIR_BOUNDS, &rect);
m_SelectStr = m_list.GetItemText(lvhti.iItem,lvhti.iSubItem);
m_list.GetDC()->Draw3dRect( &rect, RGB(255, 0, 0), RGB(255, 0, 0) );


m_list.GetSubItemRect(lvhti.iItem,lvhti.iSubItem,LVIR_BOUNDS,rect);
m_list.ClientToScreen(rect);
ScreenToClient(rect);
rect.bottom -= 1;
rect.left += 1;
rect.top += 1;
rect.right -= 1;
m_temp.MoveWindow(rect);
m_temp.ShowWindow(SW_SHOW);
m_temp.SetWindowText(m_SelectStr);
//m_list.EnableWindow(false);
*pResult = 0;
}
void CFindDlg::OnRclickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//if(m_bStart)return;
CPoint pt(pNMItemActivate->ptAction);
//UINT uFlags = 0;
//CPoint pt(AfxGetCurrentMessage()->pt);
//m_list.ScreenToClient(&pt);
//int item = m_list.HitTest(pt, &uFlags);

LVHITTESTINFO lvhti;
lvhti.pt = pNMItemActivate->ptAction;
m_list.SubItemHitTest(&lvhti);
m_SelectStr = _T("");
if(-1==lvhti.iItem)return;
m_SelectStr = m_list.GetItemText(lvhti.iItem,2);
m_list.ClientToScreen(&pt);
CMenu mu;
mu.LoadMenu(IDR_MENU);
mu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,pt.x,pt.y,this);
*pResult = 0;
}

void CFindDlg::OnKillfocusTemp()
{
// TODO: 在此添加控件通知处理程序代码
m_temp.ShowWindow(SW_HIDE);
}


void CFindDlg::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码

//if(-1==pNMLV->iItem)return;

//LVITEMINDEX lvItemIndex = {0};
// lvItemIndex.iGroup = -1;
// lvItemIndex.iItem = pNMLV->iItem;
// CRect rect;
// BOOL bRet = m_list.GetItemIndexRect(&lvItemIndex, 0, LVIR_BOUNDS, &rect);
//bRet = m_list.GetItemIndexRect(&lvItemIndex, 0, LVIR_BOUNDS, &rect);
// m_list.GetDC()->Draw3dRect( &rect, RGB(255, 0, 0), RGB(255, 0, 0) );

*pResult = 0;
}


void CFindDlg::OnChangeName()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码
SetDefID(IDOK);
}





// FindDlg.h : 头文件//

#pragma once

#include <vector>
#include "afxcmn.h"
#include "afxwin.h"
using namespace std;
// CFindDlg 对话框


const DWORD WM_FIND = WM_USER+1;
const int Max_Thread = 64;
enum
{
fd_over,fd_file,
};


class CFindDlg : public CDialogEx
{
// 构造
public:
CFindDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_FIND_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持


// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
public:
//TCHAR m_dir[64][MAX_PATH];
//long m_numberDir;
BOOL m_bStart;
HANDLE m_handle[Max_Thread];
HANDLE m_event;
long m_threadNumber;
CString m_findname;
vector<TCHAR*> m_dirList;
CString m_SelectStr;
public:
afx_msg void OnDestroy();
public:
BOOL Stop();
afx_msg void OnBnClickedC();
afx_msg LRESULT FindMsg(WPARAM, LPARAM);
CListCtrl m_list;
CEdit m_nowpath;
afx_msg void OnBnClickedPath();
afx_msg void OnIdcancel();
afx_msg void OnIdclose();
afx_msg void OnRclickList(NMHDR *pNMHDR, LRESULT *pResult);
BOOL DoBrowse(HWND hWndParent, LPCTSTR pszTitle,LPTSTR Path);
afx_msg void OnDir();
afx_msg void OnFullpath();
CEdit m_temp;
afx_msg void OnDblclkList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnKillfocusTemp();
afx_msg void OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnChangeName();
};

// Find.h : PROJECT_NAME 应用程序的主头文件//

#pragma once

#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif

#include "resource.h" // 主符号


// CFindApp:
// 有关此类的实现,请参阅 Find.cpp
//

class CFindApp : public CWinApp
{
public:
CFindApp();

// 重写
public:
virtual BOOL InitInstance();

// 实现

DECLARE_MESSAGE_MAP()
virtual int ExitInstance();
};

extern CFindApp theApp;
extern CRITICAL_SECTION g_cs[2];

// Find.cpp : 定义应用程序的类行为。#include "stdafx.h"
#include "Find.h"
#include "FindDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CFindApp

BEGIN_MESSAGE_MAP(CFindApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CFindApp 构造
CRITICAL_SECTION g_cs[2];

CFindApp::CFindApp()
{
// 支持重新启动管理器
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CFindApp 对象

CFindApp theApp;


// CFindApp 初始化

BOOL CFindApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();


AfxEnableControlContainer();

// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
InitializeCriticalSection(&g_cs[0]);
InitializeCriticalSection(&g_cs[1]);
CFindDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}

// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}



int CFindApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
DeleteCriticalSection(&g_cs[0]);
DeleteCriticalSection(&g_cs[1]);
return CWinApp::ExitInstance();
}


我认为是红色部分引起的 但没找到原因

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧