FileEditCtrl.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:13k
源码类别:

CA认证

开发平台:

Visual C++

  1. /****************************************************************************
  2. FileEditCtrl.h : header file for the CFileEditCtrl control class
  3. written by PJ Arends
  4. pja@telus.net
  5. For updates check http://www3.telus.net/pja/CFileEditCtrl.htm
  6. -----------------------------------------------------------------------------
  7. This code is provided as is, with no warranty as to it's suitability or usefulness
  8. in any application in which it may be used. This code has not been tested for
  9. UNICODE builds, nor has it been tested on a network ( with UNC paths ).
  10. This code may be used in any way you desire. This file may be redistributed by any
  11. means as long as it is not sold for profit, and providing that this notice and the
  12. authors name are included.
  13. If any bugs are found and fixed, a note to the author explaining the problem and
  14. fix would be nice.
  15. -----------------------------------------------------------------------------
  16. ****************************************************************************/
  17. #if !defined(AFX_FILEEDITCTRL_H__F15965B0_B05A_11D4_B625_A1459D96AB20__INCLUDED_)
  18. #define AFX_FILEEDITCTRL_H__F15965B0_B05A_11D4_B625_A1459D96AB20__INCLUDED_
  19. #if _MSC_VER > 1000
  20. #pragma once
  21. #endif // _MSC_VER > 1000
  22. #ifndef _SHLOBJ_H_
  23. #include <shlobj.h>  // for SHBrowseForFolder() and BROWSEINFO structure
  24. #endif // _SHLOBJ_H_
  25. #ifndef __AFXCMN_H__
  26. #include <afxcmn.h>  // for CToolTipCtrl
  27. #endif // __AFXCMN_H__
  28. // PJAImage.h has to be included if you want to use a bitmap or icon on the
  29. // button. If you do not want to use an image on the button, simply comment
  30. // out the '#include "PJAImage.h"' line below, and the button will have the
  31. // ellipses drawn on it. If you include "PJAImage.h" you have to add the 
  32. // "PJAImage.cpp" file to your project.
  33. #include "PJAImage.h"
  34. ////////////////////////////////////////////////////////////////////////////
  35. // CFileEditCtrl control
  36. // Flags used by dwFlags parameter of the Create(), SetFlags() and DDX_FileEditCtrl() functions
  37. // also returned by GetFlags() and used by ModifyFlags()
  38. //
  39. // Usage :
  40. // FEC_FILE               - Obsolete - use FEC_FILEOPEN instead
  41. // FEC_MULTIPLE           - used with FEC_FILE, the control is used to find multiple files (same as OFN_ALLOWMULTISELECT)
  42. // FEC_FOLDER             - the control is used to find folders, can not be used with FEC_FILE
  43. // FEC_TRAILINGSLASH      - used with FEC_FOLDER, adds a slash to the end of the folder string
  44. // FEC_BUTTONLEFT         - places the button on the left side of the control
  45. // FEC_BUTTONTIP          - enables the tooltip for the browse button
  46. // FEC_CLIENTTIP          - enables the tooltip for the client area
  47. // FEC_WILDCARDS          - used with FEC_FILE, the control resolves wildcards ('*' and '?') in the file name
  48. // FEC_NODEREFERENCELINKS - used with FEC_FILE, the control will return the pathname of the shortcut (*.lnk & *.pif) file.
  49. //                          by default, the control returns the pathname of the file referenced by the shortcut
  50. //                          (same as OFN_NODEREFERENCELINKS)
  51. // FEC_AUTOCOMPLETE       - adds an autocompletion feature to the control ( a work in progress )
  52. // FEC_FLAT               - the control is displayed as a flat, hot to mouse control
  53. // FEC_GRAYSCALE          - used with FEC_FLAT, the button's dots/image is drawn in gray when the control is flat
  54. // FEC_FILEOPEN           - the control is used to find a file and the browse button starts a FileOpen dialog,
  55. //                          can not be used with FEC_FOLDER or FEC_FILESAVEAS
  56. // FEC_FILESAVEAS         - the control is used to find a file and the browse button starts a FileSaveAs dialog,
  57. //                          can not be used with FEC_FOLDER or FEC_FILEOPEN
  58. #define FEC_FILE               0x00000001   /* Obsolete - use FEC_FILEOPEN instead */
  59. #define FEC_MULTIPLE           0x00000002
  60. #define FEC_MULTIPLEFILES      0x00000003   /* FEC_FILE | FEC_MULTIPLE */
  61. #define FEC_FOLDER             0x00000004
  62. #define FEC_TRAILINGSLASH      0x00000008
  63. #define FEC_BUTTONLEFT         0x00000010
  64. #define FEC_BUTTONTIP          0x00000020
  65. #define FEC_CLIENTTIP          0x00000040
  66. #define FEC_WILDCARDS          0x00000080
  67. #define FEC_NODEREFERENCELINKS 0x00000100
  68. #define FEC_AUTOCOMPLETE       0x00000200   /* Not yet implemented */
  69. #define FEC_FLAT               0x00000400
  70. #define FEC_GRAYSCALE          0x00000800
  71. #define FEC_FILEOPEN           FEC_FILE
  72. #define FEC_FILESAVEAS         0x00001000
  73. class CFileEditCtrl : public CEdit
  74. {
  75.     DECLARE_DYNAMIC (CFileEditCtrl)
  76. public:
  77. // Constructor & Destructor
  78.     CFileEditCtrl(BOOL bAutoDelete = FALSE);    // constructor
  79.     virtual ~CFileEditCtrl();                   // destructor
  80. // Overrides
  81.     virtual BOOL Create(DWORD dwFlags,          // FEC_* flags
  82.                         DWORD dwExStyle,        // WS_EX_* styles
  83.                         LPCTSTR lpszWindowName, // initial text
  84.                         DWORD dwStyle,          // WS_* and ES_* styles
  85.                         const RECT& rect,       // control's size and position
  86.                         CWnd* pParentWnd,       // control's parent window
  87.                         UINT nID);              // control's ID
  88.     virtual BOOL PreTranslateMessage(MSG* pMsg);
  89. protected:
  90.     virtual void PostNcDestroy();
  91. public:
  92. // User functions
  93. void SetFilter(CString strFilter) //hpxs , 设置对话框过滤器
  94. {
  95. m_strFilter = strFilter;
  96. }
  97. void SetCaption(CString strCaption) //hpxs , 设置对话框Caption
  98. {
  99. m_szCaption = strCaption;
  100. }
  101.     BROWSEINFO* GetBrowseInfo() const;      // returns a pointer to the internal BROWSEINFO structure
  102.     int GetButtonWidth();                   // returns the width, in pixels, of the browse button
  103.     DWORD GetFlags();                       // returns the control's functionality
  104.     CString GetNextPathName(POSITION &pos); // get the file at pos and then update pos
  105.     OPENFILENAME* GetOpenFileName() const;  // returns a pointer to the internal OPENFILENAME structure
  106.     POSITION GetStartPosition();            // get the starting position for GetNextPathName()
  107.     BOOL ModifyFlags(DWORD remove, DWORD add); // modifies the control's functionality
  108.     int SetButtonWidth(int width = -1);     // sets the width of the browse button (-1 is use default width)
  109.     void SetClientTipText(CString text);    // sets the text for the client area tooltip
  110.     BOOL SetFlags(DWORD dwFlags);           // sets the control's functionality
  111. #ifdef AFX_PJAIMAGE_H__F15965B0_B05A_11D4_B625_A1459D96AB20__INCLUDED_
  112.     BOOL SetButtonImage(HANDLE hImage, DWORD PJAIFlags, COLORREF Transparent = CLR_DEFAULT); // set the image for the browse button
  113. #endif
  114. protected:
  115. // Internal methods
  116.     void AddFile(CString FileName);         // adds files to the m_files array
  117.     void ButtonClicked();                   // handles a mouse click on the button
  118.     BOOL DereferenceLink(CString &FileName);// resolves shortcut (*.lnk and *.pif) files
  119.     void DrawButton (int nButtonState = 0); // draws the button
  120.     void DrawDots (CDC *pDC, COLORREF CR, int nOffset = 0); // draws the dots on the button
  121.     void ExpandWildCards(const CString &FileName); // handles wildcards in file names
  122.     BOOL FECBrowseForFolder();              // starts and handles the returns from the SHBrowseForFolder() shell function
  123.     BOOL FECOpenFile();                     // starts and handles the returns from the CFileDialog
  124.     void FillBuffers();                     // fills the buffers used by GetStartPosition() and GetNextPathName() functions
  125.     BOOL GetValidFolder(LPTSTR Path);       // converts Path to an existing folder path
  126. void Redraw (BOOL Flat);                // redraws the borders if the FEC_FLAT flag is set
  127.     BOOL ScreenPointInButtonRect(CPoint point); // checks if the given point is in the browse button
  128. BOOL m_bIsFocused;
  129. BOOL m_bIsMouseOver;
  130. virtual void DrawEdge(void);
  131. // Message handlers
  132.     BOOL OnTTNNeedText(UINT id, NMHDR* pTTTStruct, LRESULT* pResult); // Set the tooltip text
  133.     afx_msg BOOL OnChange();
  134.     afx_msg LRESULT OnSetReadOnly(WPARAM, LPARAM);
  135.     afx_msg LRESULT OnSetText(WPARAM, LPARAM);
  136.     afx_msg void OnDropFiles(HDROP hDropInfo);
  137.     afx_msg void OnEnable(BOOL bEnable);
  138.     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  139.     afx_msg void OnKillFocus(CWnd *pNewWnd);
  140.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  141.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  142.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  143.     afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
  144.     afx_msg UINT OnNcHitTest(CPoint point);
  145.     afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);
  146.     afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
  147.     afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
  148.     afx_msg void OnNcPaint();
  149.     afx_msg void OnSetFocus(CWnd* pOldWnd);
  150.     afx_msg void OnSize(UINT nType, int cx, int cy);
  151.     DECLARE_MESSAGE_MAP()
  152. // member variables
  153. private:
  154. CString  m_strFilter; //hpxs 对话框过虑器,默认为所有文件
  155.     BOOL             m_bAutoDelete;         // delete this in PostNCDestroy() handler?
  156.     DWORD            m_bButtonLeft;         // browse button on left side of control?
  157.     BOOL             m_bMouseCaptured;      // button has captured the mouse?
  158.     BOOL             m_bTextChanged;        // window text has changed since last time FillBuffers() was called
  159.     DWORD            m_dwFlags;             // control flags - do not access this member directly, use GetFlags() instead
  160. DWORD            m_dwImageDrawFlags;    // button image flags
  161.     CStringList      m_Files;               // linked list of file names
  162.     int              m_nButtonState;        // current button state (up, down, or disabled)
  163.     int              m_nButtonWidth;        // the width of the button (-1 is default)
  164.     BROWSEINFO*      m_pBROWSEINFO;         // only active when FEC_FOLDER flag is set
  165.     CRect            m_rcButtonRect;        // window coordinates of the button
  166.     CString          m_szCaption;           // caption of CFileDialog
  167.     CString          m_szClientTip;         // client area tooltip text
  168.     CString          m_szFolder;            // absolute path to first file in m_Files.
  169.     CToolTipCtrl     m_ToolTip;             // tooltip control
  170. #ifdef AFX_PJAIMAGE_H__F15965B0_B05A_11D4_B625_A1459D96AB20__INCLUDED_
  171.     CPJAImage*       m_pButtonImage;        // pointer to the button image class
  172. #endif
  173. };
  174. /////////////////////////////////////////////////////////////////////////////
  175. // FEC_NOTIFY structure
  176. // A pointer to this structure is sent to the parent window of the CFileEditCtrl as the
  177. // NMHDR* pNMHDR parameter in a WM_NOTIFY message. It is sent with the FEC_NM_PREBROWSE
  178. // notification after the user has clicked on the browse button, but before the CFileDialog
  179. // or SHBrowseForFolder dialogs are displayed. Setting the LRESULT parameter of the OnNotify
  180. // handler to a nonzero value will stop the dialogs from executing. It is sent with the
  181. // FEC_NM_POSTBROWSE notification after the user closed the dialog. pNewText will be NULL
  182. // if the user canceled the dialog, and pNewText will point to a CString containing the
  183. // new window text if the user clicked the 'OK' button to make a new selection.
  184. // Setting the LRESULT parameter of the OnNotify handler to a nonzero value will stop the
  185. // control from updating it's text
  186. typedef struct tagFEC_NOTIFY {
  187.     NMHDR hdr;
  188.     CFileEditCtrl* pFEC;                    // pointer to control that sends this notification
  189.     CString *pNewText;                      // pointer to the updated text, used by FEC_NM_POSTBROWSE and FEC_NM_DROP
  190.     tagFEC_NOTIFY (CFileEditCtrl *FEC, UINT code); // Constructor
  191. } FEC_NOTIFY;
  192. #define FEC_NM_PREBROWSE          1         // notification code sent before dialogs pop up
  193. #define FEC_NM_POSTBROWSE         2         // sent after dialogs successfully return
  194. #define FEC_NM_DROP               3         // sent when user drops files onto control
  195. /////////////////////////////////////////////////////////////////////////////
  196. // DDV_/DDX_FileEditCtrl functions
  197. void DDV_FileEditCtrl (CDataExchange *pDX, int nIDC);   // verify that the file/folder entered exists
  198. void DDX_FileEditCtrl (CDataExchange *pDX, int nIDC, CFileEditCtrl &rCFEC, DWORD dwFlags); // setup the control
  199. void DDX_FileEditCtrl (CDataExchange *pDX, int nIDC, CString& rStr, DWORD dwFlags);        // setup the control
  200. /////////////////////////////////////////////////////////////////////////////
  201. // FECFolderProc callback function used by SHBrowseForFolder function
  202. int CALLBACK FECFolderProc(HWND hWnd, UINT nMsg, LPARAM, LPARAM lpData);
  203. #endif // !defined(AFX_FILEEDITCTRL_H__F15965B0_B05A_11D4_B625_A1459D96AB20__INCLUDED_)
  204. /////////////////////////////////////////////////////////////////////////////
  205. //
  206. //  End of FileEditCtrl.h
  207. //
  208. /////////////////////////////////////////////////////////////////////////////