BOOL CExportFileDialog::OnInitDialog() { CFileDialog::OnInitDialog(); OnTypeChange(); return TRUE; }
UINT_PTR FileDialog::OFNHookProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { if(_Handle==0) _Handle = ::GetParent(hDlg); if(uMsg==WM_NOTIFY) { LPOFNOTIFY pon = (LPOFNOTIFY)lParam; switch(pon->hdr.code) { case CDN_SELCHANGE: { /*if(OnSelChange.IsNull()) break; Memory<wchar_t> path(MAX_PATH),file(MAX_PATH); int n = (int)::SendMessage(_Handle,CDM_GETFILEPATH,(WPARAM)MAX_PATH,(LPARAM)path.Handle()); 这个消息返回的值包括目录和文件名,目录们没有引号,文件名用空格分隔并且用引号包围,目录和文件名之间没有空格,目录末尾包含反斜杠。 但是引号有时没有,有时有,如果文件名包含空格,实际上无法正确获取文件名,所以此方法实际上不可用。 if(n<0) path[0] = 0; n = (int)::SendMessage(_Handle,CDM_GETSPEC,(WPARAM)MAX_PATH,(LPARAM)file.Handle()); 这个消息返回文件名,规则同上。 if(n<0) path[0] = 0; OnSelChange(path,file);*/ break; } case CDN_FOLDERCHANGE: { if(!OnFolderChange.IsNull()){ Memory<wchar_t> path; path.SetLength(MAX_PATH); int n = (int)::SendMessage(_Handle,CDM_GETFOLDERPATH,(WPARAM)MAX_PATH,(LPARAM)path.Handle()); if(n<0){ path[0] = 0; } OnFolderChange(path,this); } break; } case CDN_FILEOK://this message is ago okid message,if return TRUE then no okid message; if((!OnFileOk.IsNull())&&(OnFileOk(pon->lpOFN,this))) { SetWindowLong(_Handle,DWL_MSGRESULT,1L); return 1; } break; case CDN_TYPECHANGE: if(!OnTypeChange.IsNull()) OnTypeChange(pon->lpOFN->nFilterIndex,this); break; } } return 0; };
BOOL CFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ASSERT(pResult != NULL); // allow message map to override if (CCommonDialog::OnNotify(wParam, lParam, pResult)) return TRUE; #ifndef _MAC OFNOTIFY* pNotify = (OFNOTIFY*)lParam; switch(pNotify->hdr.code) { case CDN_INITDONE: OnInitDone(); return TRUE; case CDN_SELCHANGE: OnFileNameChange(); return TRUE; case CDN_FOLDERCHANGE: OnFolderChange(); return TRUE; case CDN_SHAREVIOLATION: *pResult = OnShareViolation(pNotify->pszFile); return TRUE; case CDN_HELP: if (!SendMessage(WM_COMMAND, ID_HELP)) SendMessage(WM_COMMANDHELP, 0, 0); return TRUE; case CDN_FILEOK: *pResult = OnFileNameOK(); return TRUE; case CDN_TYPECHANGE: OnTypeChange(); return TRUE; } #endif return FALSE; // not handled }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 通知消息 UINT COpenDlg::OnNotify(WPARAM wParam, LPARAM lParam) { RECT rtRect; BOOL bPreview; RAWIMAGE riFormat; TCHAR tzFileName[MAX_PATH]; switch (((LPNMHDR) lParam)->code) { case CDN_INITDONE: // 调整父窗口位置,使其居中与屏幕中心 GetWindowRect(m_hParent, &rtRect); MoveWindow(m_hParent, (GetSystemMetrics(SM_CXSCREEN) - _RectWidth(rtRect) - 20) / 2, (GetSystemMetrics(SM_CYSCREEN) - _RectHeight(rtRect)) / 2, _RectWidth(rtRect), _RectHeight(rtRect), TRUE); // 重新调整窗口大小 GetClientRect(m_hParent, &rtRect); MoveWindow(m_hWnd, 0, 0, _RectWidth(rtRect), _RectHeight(rtRect), TRUE); //break; case CDN_TYPECHANGE: OnTypeChange(((LPOFNOTIFY) lParam)->lpOFN); break; case CDN_SELCHANGE: // 获取文件名 tzFileName[0] = 0; SendMessage(m_hParent, CDM_GETFILEPATH, MAX_PATH, (LPARAM) tzFileName); // 更改过滤器 if (m_bFilterChange) { m_bFilterChange = FALSE; } // 设置记录的历史格式 else if (CIni::GetStruct(INI_HistroyFormat, tzFileName, &riFormat, sizeof(RAWIMAGE))) { if (riFormat.m_csColorSpace != m_riFormat.m_csColorSpace) { CopyMemory(&m_riFormat, &riFormat, sizeof(RAWIMAGE)); SendDlgItemMessage(m_hParent, 0x0470, CB_SETCURSEL, m_riFormat.m_csColorSpace, 0); } CopyMemory(&m_riFormat, &riFormat, sizeof(RAWIMAGE)); } else { // 猜测尺寸 GetSize(tzFileName); } // 打开文件 m_pWnd->Open(tzFileName, &m_riFormat); // 设置校验过的格式 SetDlgItemInt(m_hWnd, IDC_Open_Width, m_riFormat.m_uWidth, FALSE); SetDlgItemInt(m_hWnd, IDC_Open_Height, m_riFormat.m_iHeight, TRUE); SetDlgItemInt(m_hWnd, IDC_Open_FrameRate, m_riFormat.m_uFrameRate, FALSE); SetDlgItemInt(m_hWnd, IDC_Open_FrameStep, m_riFormat.m_iFrameStep, TRUE); OnCommand(IDC_RawVideo_Seek); break; case CDN_FILEOK: // 验证格式是否正确 SetFocus(m_hToolbar); if (m_pWnd->m_uTotalFrame) { m_pWnd->Stop(); // 保存设置 bPreview = IsPreviewChecked(); CIni::SetInt(INI_OpenPeview, bPreview); // 记录历史格式 m_riFormat = *m_pWnd; CIni::SetStruct(INI_HistroyFormat, &m_riFormat, sizeof(RAWIMAGE)); CIni::SetStruct(INI_HistroyFormat, m_pWnd->m_tzFileName, &m_riFormat, sizeof(RAWIMAGE)); break; } else { SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, S_FALSE); return S_FALSE; } break; case TTN_NEEDTEXT: // 显示工具栏提示 GetMenuString(CMainWnd::m_hMenu, (UINT) wParam, ((LPTOOLTIPTEXT) lParam)->szText, 80, MF_BYCOMMAND); } return 0; }