打开文件对话框缺省为缩略图方式显示

来源:互联网 发布:校园机房网络拓扑图 编辑:程序博客网 时间:2024/06/02 03:56


最新情况: 参见 打开公用对话框的初始视图类型问题
------------------------------------------------------


坛子上有人问到如何对使用 CommonDialog 组件显示的打开对话框缺省显示为缩略图的问题,其实上一次提出这个问题的时候我就已经回答过,可能楼主对 api 不熟悉,所以没有写出实现的代码。这次豆三版主挑出了我的马甲,只好勉为其难了。
查过 msdn 后,找到一个函数 GetOpenFileNameEx,可以指定打开对话框时的视图样式,可惜其中只描述了在  WindowsMobile 5.0/WinCE 中的导出库,Windows2k/xp/2k3 中在哪里却没有指出。试过 comdlg32 / commctrl / shell32 都没有找到,网上找了一圈也没结果,看来是专用于  WindowsMobile 5.0 的了,只好放弃。
一定要实现的话就只能模拟鼠标和键盘按键来实现了。下面就是实现这个功能的代码,由于是模拟手工操作,所以弹出菜单一定会闪现一下,虽不是很好,但也暂无好的解决方法。下面是实现此功能的简单示例,真正要用于你的程序还需要做些错误处理方面的改进:

  1. #define WM_TIMER                0x0113 
  2. #define TIMER_ID                100 
  3. #define MOUSEEVENTF_MOVE        0x0001 
  4. #define MOUSEEVENTF_RIGHTDOWN   0x0008 
  5. #define MOUSEEVENTF_RIGHTUP     0x0010 
  6. #define MOUSEEVENTF_ABSOLUTE    0x8000 
  7. #define KEYEVENTF_KEYDOWN       0x0000 
  8. #define KEYEVENTF_KEYUP         0x0002 
  9. PUBLIC oForm
  10. oForm = NEWOBJECT( 'MyForm' )
  11. oForm.Show()
  12. READ EVENTS
  13. DEFINE CLASS MyForm AS form
  14.   Height = 78
  15.   Width = 293
  16.   DoCreate = .T.
  17.   AutoCenter = .T.
  18.   Caption = "Form1"
  19.   AllowOutput = .F.
  20.   Name = "Form1"
  21.   ADD OBJECT command1 AS commandbutton WITH ;
  22.     Top = 24, ;
  23.     Left = 180, ;
  24.     Height = 27, ;
  25.     Width = 84, ;
  26.     Caption = "打开图片", ;
  27.     Name = "command1"
  28.   PROCEDURE ToggleViewStyle
  29.     LPARAMETERS p1, p2, p3, p4
  30.     LOCAL hWndLvw
  31.     m.hWndLvw = This.FindListViewWindow()
  32.     IF ( 0 != m.hWndLvw )
  33.       KillTimer( This.hWnd, TIMER_ID )
  34.       This.MoveMouseToListView( m.hWndLvw )
  35.       mouse_event( MOUSEEVENTF_RIGHTDOWN ,0 ,0 ,0 ,0 )
  36.       mouse_event( MOUSEEVENTF_RIGHTUP   ,0 ,0 ,0 ,0 )
  37.       keybd_event( ASC('V') ,0 ,KEYEVENTF_KEYDOWN ,0 )
  38.       keybd_event( ASC('V') ,0 ,KEYEVENTF_KEYUP   ,0 )
  39.       keybd_event( ASC('H') ,0 ,KEYEVENTF_KEYDOWN ,0 )
  40.       keybd_event( ASC('H') ,0 ,KEYEVENTF_KEYUP   ,0 )
  41.     ENDIF
  42.   ENDPROC
  43.   PROCEDURE FindListViewWindow
  44.     LOCAL hWndDlg, hWndLvw0, hWndLvw1
  45.     m.hWndLvw1 = 0
  46.     m.hWndDlg  = FindWindow( '#32770', This.dlg.DialogTitle )
  47.     IF ( 0 != m.hWndDlg )
  48.       m.hWndLvw0 = FindWindowEx( m.hWndDlg, 0, 'SHELLDLL_DefView', NULL )
  49.       IF ( 0 != m.hWndLvw0 )
  50.         m.hWndLvw1 = FindWindowEx( m.hWndLvw0, 0, 'SysListView32', NULL )
  51.       ENDIF
  52.     ENDIF
  53.     RETURN m.hWndLvw1
  54.   ENDPROC
  55.   PROCEDURE api_decl
  56.     DECLARE Long SetTimer IN WIN32API ;
  57.       Long hWnd, Long nIDEvent, Long uElapse, Long lpTimerFunc
  58.     DECLARE Long KillTimer IN WIN32API ;
  59.       Long hWnd, Long uIDEvent
  60.     DECLARE Long FindWindow IN WIN32API ;
  61.       String lpClassName, String lpWindowName
  62.     DECLARE Long FindWindowEx IN WIN32API ;
  63.       Long hwndParent, Long hwndChildAfter, String lpszClass, String lpszWindow
  64.     DECLARE Long mouse_event IN WIN32API ;
  65.       Long dwFlags, Long dx, Long dy, Long dwData, Long dwExtraInfo
  66.     DECLARE Long keybd_event IN WIN32API ;
  67.       Long bVk, Long bScan, Long dwFlags, Long dwExtraInfo
  68.     DECLARE Long GetCursorPos IN WIN32API ;
  69.       String @ lpPoint
  70.     DECLARE Long GetWindowRect IN WIN32API ;
  71.       Long hWnd, String @ lpRect
  72.   ENDPROC
  73.   PROCEDURE MoveMouseToListView
  74.     LPARAMETERS thLvw
  75.     LOCAL cPoint, cRect, x0, x1, x2, y0, y1, y2
  76.     m.cPoint = REPLICATE( CHR(0), 8 )
  77.     m.cRect  = REPLICATE( CHR(0), 16 )
  78.     GetCursorPos( @ m.cPoint )
  79.     GetWindowRect( m.thLvw, @ m.cRect )
  80.     m.x0 = CTOBIN( SUBSTR( m.cPoint, 1, 4 ), 'rs' )
  81.     m.y0 = CTOBIN( SUBSTR( m.cPoint, 5, 4 ), 'rs' )
  82.     m.x1 = CTOBIN( SUBSTR( m.cRect,  1, 4 ), 'rs' )
  83.     m.y1 = CTOBIN( SUBSTR( m.cRect,  5, 4 ), 'rs' )
  84.     m.x2 = CTOBIN( SUBSTR( m.cRect,  9, 4 ), 'rs' )
  85.     m.y2 = CTOBIN( SUBSTR( m.cRect, 13, 4 ), 'rs' )
  86.     IF !BETWEEN( m.x0, m.x1, m.x2 ) OR !BETWEEN( m.y0, m.y1, m.y2 )
  87.       mouse_event( ;
  88.         BITOR( MOUSEEVENTF_MOVE, MOUSEEVENTF_ABSOLUTE ), ;
  89.         (m.x2-20)*0xffff/SYSMETRIC(1), (m.y2-20)*0xffff/SYSMETRIC(2), 0, 0 )
  90.     ENDIF
  91.   ENDPROC
  92.   PROCEDURE GetPictureFile
  93.     This.api_decl()
  94.     BINDEVENT( This.hWnd, WM_TIMER, This, 'ToggleViewStyle' )
  95.     SetTimer( This.hWnd, TIMER_ID, 50, 0 )
  96.     This.dlg.FileName = ''
  97.     This.dlg.ShowOpen()
  98.     UNBINDEVENT( This.hWnd, WM_TIMER )
  99.     RETURN This.dlg.FileName
  100.   ENDPROC
  101.   PROCEDURE Init
  102.     This.NewObject( 'dlg', 'olecontrol',,, 'MSComDlg.CommonDialog' )
  103.     This.dlg.DialogTitle = '请选择要打开的图片文件'
  104.   ENDPROC
  105.   PROCEDURE Unload
  106.     CLEAR EVENTS
  107.   ENDPROC
  108.   PROCEDURE command1.Click
  109.     MESSAGEBOX( Thisform.GetPictureFile() )
  110.   ENDPROC
  111. ENDDEFINE