怎样将 CFileDialog 默认以缩略图文件浏览模式打开

sky1989sk 2010-08-04 10:29:24
一般按照默认的模式下 创建一个CFileDialog对象 打开文件夹都是以 列表的浏览模式 (就是普通的文件浏览窗口下面有个 “查看”的按钮 点开有 缩略图 ,平铺 ,图标 ,列表 ,详细 五个浏览模式)

如果是触摸屏设备的话 对话框打开是以详细 或列表就不大好操作,所以想默认以缩略图的模式打开....这要怎么实现呢?好像不能直接设置,要通过重载OnInitDialog()函数,但纠结了半天 仍是一点进展都没有 求高人指点
...全文
311 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
minggangwu 2010-10-21
  • 打赏
  • 举报
回复
我也试了,好像不行
schlafenhamster 2010-08-07
  • 打赏
  • 举报
回复
ODM_VIEW_THUMBS= 0x702d,
sky1989sk 2010-08-07
  • 打赏
  • 举报
回复
晕 引用错了....回的二楼的
sky1989sk 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 sky1989sk 的回复:]
一般按照默认的模式下 创建一个CFileDialog对象 打开文件夹都是以 列表的浏览模式 (就是普通的文件浏览窗口下面有个 “查看”的按钮 点开有 缩略图 ,平铺 ,图标 ,列表 ,详细 五个浏览模式)

如果是触摸屏设备的话 对话框打开是以详细 或列表就不大好操作,所以想默认以缩略图的模式打开....这要怎么实现呢?好像不能直接设置,要通过重载OnInitDialog()函数,但纠结了半天……
[/Quote]

这样好像还是无法解决问题,因为VC里没有定义缩略图的dwStyle
schlafenhamster 2010-08-04
  • 打赏
  • 举报
回复
//主要:
fd.m_ofn.lpfnHook=DNHookProc;//="_AfxCommDlgProc" see"dlgcomm.cpp" <>NULL!
//
case WM_TIMER:
// SHELLDll_defView ,ID是lst2(值为0x0461,在dlgs.h中定义),
KillTimer(hDlg,1);
hw=GetDlgItem(hWndParent,0x0461);
SendMessage(hw, WM_COMMAND,ODM_VIEW_THUMBS,0);
break;
schlafenhamster 2010-08-04
  • 打赏
  • 举报
回复

///////////////////////////////////////////////////////
//
CFileDialog fd(TRUE);
//注意:
fd.m_ofn.lpfnHook=DNHookProc;//="_AfxCommDlgProc" see"dlgcomm.cpp" <>NULL!
//UINT CALLBACK _AfxCommDlgProc(HWND hWnd,UINT message,
// WPARAM wParam,LPARAM lParam);

enum LISTVIEWCMD
{
ODM_VIEW_ICONS = 0x7029,
ODM_VIEW_LIST = 0x702b,
ODM_VIEW_DETAIL= 0x702c,
ODM_VIEW_THUMBS= 0x702d,
ODM_VIEW_TILES = 0x702e,
};
// for CFileDialog down load
UINT CALLBACK DNHookProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar)
{ // hdlg is a child
HWND hWndParent;
CWinApp *pApp=AfxGetApp();
HICON hIcon;
HWND hw; // SHELLDll_defView
HWND hcw;// SysListView32
DWORD dwStyle;
LPOFNOTIFY lpon=0;
UINT Notify=0;
//
if (hDlg == NULL) return 0;
#ifdef _DEBUG
// from "_AfxCommDlgProc()" of the file "dlgcomm.cpp"
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
// =_AfxActivationWndProc(hwnd,uint,uint,long)
if (pThreadState->m_pAlternateWndInit != NULL) pThreadState->m_pAlternateWndInit = NULL;
#endif
//
hWndParent=GetParent(hDlg);// needed
switch (uMsg)
{
case WM_INITDIALOG://这时,SHELLDLL_DefView的窗口还不存在
hIcon=pApp->LoadIcon(IDI_ICONDN);
SendMessage(hWndParent,WM_SETICON,(WPARAM)0,(LPARAM)hIcon);
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
DestroyIcon(hIcon);
// ShowWindow(hDlg,SW_HIDE);
SetTimer(hDlg,1,10,0);
// PostMessage(hDlg,WM_USER+1,0,0);
break;
case WM_TIMER:
// SHELLDll_defView ,ID是lst2(值为0x0461,在dlgs.h中定义),
KillTimer(hDlg,1);
hw=GetDlgItem(hWndParent,0x0461);
SendMessage(hw, WM_COMMAND,ODM_VIEW_THUMBS,0);
break;
case WM_USER+1:
// SHELLDll_defView ,ID是lst2(值为0x0461,在dlgs.h中定义),
hw=GetDlgItem(hWndParent,0x0461);
SendMessage(hw, WM_COMMAND,ODM_VIEW_THUMBS,0);
ShowWindow(hDlg,SW_SHOW);
break;
case WM_NOTIFY:
lpon=(LPOFNOTIFY)lPar;
Notify=lpon->hdr.code;
if (Notify==CDN_TYPECHANGE ||
Notify==CDN_SELCHANGE )
{ // 列表控制不是对话框的直接子类,它是孙子类.
// 主对话框有一个子窗口,类的名字为 SHELLDLL_DefView。
hw=GetDlgItem(hWndParent,0x0461);// SHELLDll_defView
hcw=GetDlgItem(hw,1);// SysListView32 是 SHELLDLL_DefView 的孩子,ID为1。
dwStyle=GetWindowLong(hcw,GWL_STYLE);
// change multi-selection of ListView
if (lpon->lpOFN->nFilterIndex==4) // "dll"
{
dwStyle &= ~LVS_SINGLESEL;// Multi
}
else
{
dwStyle |= LVS_SINGLESEL;// Single
}
SetWindowLong(hcw,GWL_STYLE,dwStyle);
}
break;
}
return 0;
}

healer_kx 2010-08-04
  • 打赏
  • 举报
回复
void CMyFileDialog::OnInitDone()
{
CFileDialog::OnInitDone();

CWnd *parent = GetParent();
if ( parent != NULL ) {
m_list-> ModifyStyle(LVS_TYPEMASK,dwStyle & LVS_TYPEMASK);
}
}


dwStyle可以为
LVS_ICON Specifies icon view.
LVS_LIST Specifies list view.
LVS_REPORT Specifies report view.
LVS_SMALLICON Specifies small icon view


顺便你再查查MSDN吧。
hyblusea 2010-08-04
  • 打赏
  • 举报
回复
学习了...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧