// custom file dialog #include #pragma hdrstop #include #include #include CustFileDlg::CustFileDlg(Object *Parent ,int Id, char *Buf,int BufS,const char *aTitle,const char *Filt,int *FiltInd,long flgs) : Object(Parent) { ID=Id; Buffer=Buf; BufSize=BufS; Title=aTitle; Filters=Filt; FiltIndex=FiltInd; hWnd=0; TrapOK=FALSE; Flags=flgs; int ofnSize=sizeof(OPENFILENAME); OSVERSIONINFO vi; ZeroMemory(&vi,sizeof(OSVERSIONINFO)); vi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); ::GetVersionEx(&vi); if (vi.dwPlatformId==VER_PLATFORM_WIN32_NT && vi.dwMajorVersion>=5) ofnSize = 0x58; // sizeof(OPENFILENAME) for Windows 2000 and above O=(OPENFILENAME*)malloc(ofnSize); ZeroMemory(O,ofnSize); O->lStructSize=ofnSize; } BOOL CustFileDlg::SetupWindow() { return TRUE; } void CustFileDlg::Paint(HDC, BOOL, RECT &) {} BOOL CustFileDlg::Create() { return TRUE; } void CustFileDlg::FileSelected(char*) {} void CustFileDlg::EndDialog(int) {} CustFileDlg::~CustFileDlg() { free(O); } #define IDC_FILE 1120 BOOL CustFileDlg::WndProc(TMSG &Msg) { if (Msg.Msg==FokMsg && TrapOK) { FileSelected(O->lpstrFile); TrapOK=FALSE; return TRUE; } switch (Msg.Msg) { case WM_INITDIALOG: SetupWindow(); // if (Ini) GetDialogPos(); SetFocus(GetDlgItem(hWnd,IDOK)); break; case WM_DESTROY: hWnd=NULL; break; case WM_PAINT: PAINTSTRUCT ps; BeginPaint(hWnd, (LPPAINTSTRUCT) &ps); Paint(ps.hdc,ps.fErase,ps.rcPaint); EndPaint(hWnd, (LPPAINTSTRUCT) &ps); break; case WM_COMMAND: switch (LOWWPARAM(Msg.wParam)) { case IDOK: case IDCANCEL: EndDialog(LOWWPARAM(Msg.wParam)); break; case IDC_FILE: // only trap for open file if (!(Flags & OFN_OVERWRITEPROMPT) && HIWLPARAM(Msg)==LBN_SELCHANGE) { // bit of a hack // pick up FILEOK message TrapOK=TRUE; PostMessage(hWnd,WM_COMMAND,IDOK,0); } break; } // switch (wParam) } // switch (uMessage) return EV_FIND(Msg); } CustFileDlg *CustFileDlg::OpenDialog; #ifdef __BORLANDC__ UINT _export CALLBACK CustFileDlg::MyOpenDlgProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam) #else UINT CALLBACK CustFileDlg::MyOpenDlgProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam) #endif { if (Msg==WM_INITDIALOG) OpenDialog->hWnd=hDlg; TMSG aMsg={Msg,wParam,lParam,0}; return OpenDialog->WndProc(aMsg); } // OFN_EXPLORER - new look commdlg // OFN_LONGNAMES - force long names for 3.x modules int CustFileDlg::Execute(BOOL hook) { OpenDialog=this; FName F(Buffer); String Name(BufSize); Name=F.GetName(); String Dir; F.GetDir(Dir); O->hwndOwner=ParentHWnd; O->hInstance=App::hInstance; O->lpstrFilter=Filters; O->lpstrCustomFilter=NULL; O->nFilterIndex=FiltIndex ? *FiltIndex : 0; O->lpstrFile=Name; O->nMaxFile=Name.Size(); O->lpstrFileTitle=NULL; O->lpstrInitialDir=Dir; O->lpstrTitle=Title; O->Flags=Flags | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLESIZING; if (hook) O->Flags |= OFN_ENABLEHOOK; if (ID>=0) { O->lpTemplateName=MAKEINTRESOURCE(ID); O->Flags |= OFN_ENABLETEMPLATE; } O->lpstrDefExt=NULL; O->lpfnHook=MyOpenDlgProc; FokMsg=RegisterWindowMessage(FILEOKSTRING); int ret= (O->Flags & OFN_OVERWRITEPROMPT) ? GetSaveFileName(O) : GetOpenFileName(O); if (ret) { strcpy(Buffer,Name); if (FiltIndex) *FiltIndex=O->nFilterIndex; } return ret; }