一个定制CFileDialog对话框的实例,一个定制CFileDialog对话框的实例
【 tulaoshi.com - C语言心得技巧 】
一个定制CFileDialog对话框的实例
编译:northtibet
class CMyOpenDlg ... {protected: CFileDlgHelper m_dlghelper;//实例化};BOOL CMyOpenDlg::OnInitDialog(){ m_dlghelper.Init(this)//初始化……}初始化CFileDlgHelper以后,便可以用它来获取列表控制以及判断选项是否有文件夹属性,例如:
CListCtrl* plc = m_dlghelper.GetListCtrl();POSITION pos = plc->GetFirstSelectedItemPosition();while (pos) { int i = plc->GetNextSelectedItem(pos); if (fdh.IsItemFolder(i)) { // 显示"(FOLDER)"…… } else { // 显示其它内容 }}
毫无疑问,要改装CFileDialog对话框,必须建立一个它的派生类以及一个新的对话框资源。“全部”按钮的实现代码是这样的:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)void CMyOpenDlg::OnSelectAll(){ CListCtrl* plc = m_dlghelper.GetListCtrl(); for (int i=0; i<plc->GetItemCount(); i++) { CString fn = plc->GetItemText(i,0); if (IsTextFileName(fn)) { plc->SetItemState(i,LVIS_SELECTED, LVIS_SELECTED); } } plc->SetFocus();}当所选目录中没有.txt文件时,要disable“全部”按钮的处理稍微麻烦一些,要用到ON_UPDATE_COMMAND_UI消息。回顾一下MFC有关UI更新的基本方法,通常是在主消息循环处于空闲状态时候——也就是说在消息队列中没有待处理的消息。但对话框则有所不同,尤其是运行模式对话框时,MFC启动另外一个消息循环。当没有消息等待处理的时候,CWnd::DoModal向对话框发送一个WM_KICKIDLE消息。所以要想让对话框处理UI,常用的方式是这样的:
LRESULT CMyDialog::OnKickIdle(WPARAM wp, LPARAM lp){ UpdateDialogControls(this, TRUE); return 0;}CWnd::UpdateDialogControls将神奇的CN_UPDATE_COMMAND_UI消息发送到对话框,触发ON_UPDATE_COMMAND_UI处理例程。可惜这个方法对CFileDialog对话框不灵。原因是CFileDialog重写了DoModal,它不会以正常方式运行某个消息循环,而是调用::GetOpenFileName (或::GetSaveFileName)。这些API函数都有自己消息循环,并且你无法钻进去进行消息空闲处理。无论什么时候,每当模式对话框处于等待消息状态时,对话框发送自己的WM_ENTERIDLE消息。从这里进去才可以处理UI更新事宜。但有几个细节需要注意。首先,Windows只发送WM_ENTERIDLE消息到对话框的所有者——此处为主框架
来源:http://www.tulaoshi.com/n/20160129/1483675.html
看过《一个定制CFileDialog对话框的实例》的人还看了以下文章 更多>>