砰….PASS

又一个难题倒在我的脚下。。。。哈哈。。。。

困挠我好几天了。。一直解决不了。。昨天憋了一晚上终于搞定。。。庆祝一下。。

现象:一个CpropertySheet。里面放几个CPropertyPage。。。当按下右上角的close按钮时。。我要判断当前是否正在下载文件。。如果正在下载。。则提示用户是否强制退出。。。。

看着挺简单。。重载一个OnClose就行了。。。不过这个CPropertySheet有点变态。。不响应这个函数。。退出的时候也没有发WM_CLOSE事件。。而是只响应WM_DESTROY。。而响应这个消息不能满足我的要求。。。百度。。GOOGLE的搜啊。。。搜了半天。。也没结果。。什么OnApply()函数的呀。。。统统没用。。。我这可郁闷了。。看着一条重要信息。。这个东东响应SC_CLOSE消息。。不过这个消息是OnSysCommand()响应这个函数。。我试了试。。ClassWizard不能重载这个函数。。手工添加进去。。也提示CPropertySheet类没有成员函数OnSysCommand(),更郁闷了。。刚有点眉目了。。又搞不定了。。。灵感一来。。挡都挡不住。。找到了DefWindowProc这个默认的消息处理函数。。。重载一下。。先试一下。。代码如下

LRESULT CProp_Sheet::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

// TODO: Add your specialized code here and/or call the base class

if(WM_SYSCOMMAND==message&&wParam==SC_CLOSE)

      MessageBox(“test”);

    return CPropertySheet::DefWindowProc(message, wParam, lParam);

}

一个对话框弹出来了。。哈哈。。。成功。。

接下来该让用户选择是否强制退出了。。。

问题又来了。。我新开一个线程来下载文件。。如果用户选择强制退出。。则要把线程也终止了。。用TerminateThreade有点不厚道。。线程占用的资源不会被释放。。还是让它自己终止的比较好。。设定一个标志位IsDownLoadFile。。在线程开始的时候设定为TRUE,在线程结束的时候设为FALSE。。。如果用户选择强制退出。。则把IsDownLoadFile设为FALSE。。而下载文件的线程函数正好是一个循环。。在循环里判断IsDownLoadFile是否为TRUE。。如果为FALSE则说明用户强制退出。。看着挺简单。。问题又来了。。强制退的时候弹出个对话框DEBUG错误。。afxcmn.inl 第多少多少行出现错误。。一看是因为我在下载的时候还操作了主界面的CProgressBar和CStatic这两个控件。。主界面DefWindowProc执行完IsDownLoadFile=FALSE后。不等线程函数执行完即退出。。导致出错。。去网上找了点灵感。。又“砰”。。PASS。。。

主界面DefWindowProc执行完IsDownLoadFile=FALSE后Return FALSE,不让它向下执行。。则主界面不退出。。线程函数在最后判断是否为异常退出。。如果是则向主界面发送一个WM_SYSCOMMAND消息。消息参数为SC_CLOSE。。。终于正常了。。很曲折。。也可能是自己很菜。还是不熟练的原因。。。呵呵。。困难。PASS。。继续喽