最新情况: 参见 打开公用对话框的初始视图类型问题
------------------------------------------------------
坛子上有人问到如何对使用 CommonDialog 组件显示的打开对话框缺省显示为缩略图的问题,其实上一次提出这个问题的时候我就已经回答过,可能楼主对 api 不熟悉,所以没有写出实现的代码。这次豆三版主挑出了我的马甲,只好勉为其难了。
查过 msdn 后,找到一个函数 GetOpenFileNameEx,可以指定打开对话框时的视图样式,可惜其中只描述了在 WindowsMobile 5.0/WinCE 中的导出库,Windows2k/xp/2k3 中在哪里却没有指出。试过 comdlg32 / commctrl / shell32 都没有找到,网上找了一圈也没结果,看来是专用于 WindowsMobile 5.0 的了,只好放弃。
一定要实现的话就只能模拟鼠标和键盘按键来实现了。下面就是实现这个功能的代码,由于是模拟手工操作,所以弹出菜单一定会闪现一下,虽不是很好,但也暂无好的解决方法。下面是实现此功能的简单示例,真正要用于你的程序还需要做些错误处理方面的改进:
- #define WM_TIMER 0x0113
- #define TIMER_ID 100
- #define MOUSEEVENTF_MOVE 0x0001
- #define MOUSEEVENTF_RIGHTDOWN 0x0008
- #define MOUSEEVENTF_RIGHTUP 0x0010
- #define MOUSEEVENTF_ABSOLUTE 0x8000
- #define KEYEVENTF_KEYDOWN 0x0000
- #define KEYEVENTF_KEYUP 0x0002
- PUBLIC oForm
- oForm = NEWOBJECT( 'MyForm' )
- oForm.Show()
- READ EVENTS
- DEFINE CLASS MyForm AS form
- Height = 78
- Width = 293
- DoCreate = .T.
- AutoCenter = .T.
- Caption = "Form1"
- AllowOutput = .F.
- Name = "Form1"
- ADD OBJECT command1 AS commandbutton WITH ;
- Top = 24, ;
- Left = 180, ;
- Height = 27, ;
- Width = 84, ;
- Caption = "打开图片", ;
- Name = "command1"
- PROCEDURE ToggleViewStyle
- LPARAMETERS p1, p2, p3, p4
- LOCAL hWndLvw
- m.hWndLvw = This.FindListViewWindow()
- IF ( 0 != m.hWndLvw )
- KillTimer( This.hWnd, TIMER_ID )
- This.MoveMouseToListView( m.hWndLvw )
- mouse_event( MOUSEEVENTF_RIGHTDOWN ,0 ,0 ,0 ,0 )
- mouse_event( MOUSEEVENTF_RIGHTUP ,0 ,0 ,0 ,0 )
- keybd_event( ASC('V') ,0 ,KEYEVENTF_KEYDOWN ,0 )
- keybd_event( ASC('V') ,0 ,KEYEVENTF_KEYUP ,0 )
- keybd_event( ASC('H') ,0 ,KEYEVENTF_KEYDOWN ,0 )
- keybd_event( ASC('H') ,0 ,KEYEVENTF_KEYUP ,0 )
- ENDIF
- ENDPROC
- PROCEDURE FindListViewWindow
- LOCAL hWndDlg, hWndLvw0, hWndLvw1
- m.hWndLvw1 = 0
- m.hWndDlg = FindWindow( '#32770', This.dlg.DialogTitle )
- IF ( 0 != m.hWndDlg )
- m.hWndLvw0 = FindWindowEx( m.hWndDlg, 0, 'SHELLDLL_DefView', NULL )
- IF ( 0 != m.hWndLvw0 )
- m.hWndLvw1 = FindWindowEx( m.hWndLvw0, 0, 'SysListView32', NULL )
- ENDIF
- ENDIF
- RETURN m.hWndLvw1
- ENDPROC
- PROCEDURE api_decl
- DECLARE Long SetTimer IN WIN32API ;
- Long hWnd, Long nIDEvent, Long uElapse, Long lpTimerFunc
- DECLARE Long KillTimer IN WIN32API ;
- Long hWnd, Long uIDEvent
- DECLARE Long FindWindow IN WIN32API ;
- String lpClassName, String lpWindowName
- DECLARE Long FindWindowEx IN WIN32API ;
- Long hwndParent, Long hwndChildAfter, String lpszClass, String lpszWindow
- DECLARE Long mouse_event IN WIN32API ;
- Long dwFlags, Long dx, Long dy, Long dwData, Long dwExtraInfo
- DECLARE Long keybd_event IN WIN32API ;
- Long bVk, Long bScan, Long dwFlags, Long dwExtraInfo
- DECLARE Long GetCursorPos IN WIN32API ;
- String @ lpPoint
- DECLARE Long GetWindowRect IN WIN32API ;
- Long hWnd, String @ lpRect
- ENDPROC
- PROCEDURE MoveMouseToListView
- LPARAMETERS thLvw
- LOCAL cPoint, cRect, x0, x1, x2, y0, y1, y2
- m.cPoint = REPLICATE( CHR(0), 8 )
- m.cRect = REPLICATE( CHR(0), 16 )
- GetCursorPos( @ m.cPoint )
- GetWindowRect( m.thLvw, @ m.cRect )
- m.x0 = CTOBIN( SUBSTR( m.cPoint, 1, 4 ), 'rs' )
- m.y0 = CTOBIN( SUBSTR( m.cPoint, 5, 4 ), 'rs' )
- m.x1 = CTOBIN( SUBSTR( m.cRect, 1, 4 ), 'rs' )
- m.y1 = CTOBIN( SUBSTR( m.cRect, 5, 4 ), 'rs' )
- m.x2 = CTOBIN( SUBSTR( m.cRect, 9, 4 ), 'rs' )
- m.y2 = CTOBIN( SUBSTR( m.cRect, 13, 4 ), 'rs' )
- IF !BETWEEN( m.x0, m.x1, m.x2 ) OR !BETWEEN( m.y0, m.y1, m.y2 )
- mouse_event( ;
- BITOR( MOUSEEVENTF_MOVE, MOUSEEVENTF_ABSOLUTE ), ;
- (m.x2-20)*0xffff/SYSMETRIC(1), (m.y2-20)*0xffff/SYSMETRIC(2), 0, 0 )
- ENDIF
- ENDPROC
- PROCEDURE GetPictureFile
- This.api_decl()
- BINDEVENT( This.hWnd, WM_TIMER, This, 'ToggleViewStyle' )
- SetTimer( This.hWnd, TIMER_ID, 50, 0 )
- This.dlg.FileName = ''
- This.dlg.ShowOpen()
- UNBINDEVENT( This.hWnd, WM_TIMER )
- RETURN This.dlg.FileName
- ENDPROC
- PROCEDURE Init
- This.NewObject( 'dlg', 'olecontrol',,, 'MSComDlg.CommonDialog' )
- This.dlg.DialogTitle = '请选择要打开的图片文件'
- ENDPROC
- PROCEDURE Unload
- CLEAR EVENTS
- ENDPROC
- PROCEDURE command1.Click
- MESSAGEBOX( Thisform.GetPictureFile() )
- ENDPROC
- ENDDEFINE