如何实现大图标风格的打开对话框

【Win10 尝试解决】Win10文件资源管理器无限挂起重启 win10系统,电脑桌面不停闪烁,下面任务栏消失,窗口消失。 ctrl+shift+Esc,打开任务管理器,发现文件资源管理器疯狂挂载、重启。 阅读详情

默认情况下,打开对话框的文件列表的样式是列表样式,要实现一打开放大框就自动是大图标风格,需要在打开对话框显示在屏幕上以前,找到该文件列表控件(SysListView32)的句柄,然后改变其风格就可以了。

标准ListView控件有四种样式,分别如下:
  LVS_ICON       0x0000 大图标样式
  LVS_REPORT     0x0001 详细资料样式
  LVS_SMALLICON  0x0002 小图标样式
  LVS_LIST       0x0003 列表样式

以前ccrun曾在csdn回答过一位网友的问题,正好有一些代码,比较简单,ccrun就没有加注释。嘿嘿。
在Form上放置一个TButton,一个TOpenDialog。然后添加以下代码:
.h 文件中:
public:        // User declarations
    void __fastcall OpenDialogShow(TObject *Sender);
    void __fastcall OpenDialogClose(TObject *Sender);

.cpp 文件中:
//---------------------------------------------------------------------------
FARPROC OldDlgOpenProc = NULL;
static LRESULT CALLBACK NewDlgOpenProc(
        HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
static LRESULT CALLBACK NewDlgOpenProc(
        HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if(uMsg == WM_UPDATEUISTATE)
    {
        HWND hShell = FindWindowEx(GetParent(hWnd), NULL, "SHELLDLL_DefView", NULL);
        HWND hListView = FindWindowEx(hShell, NULL, "SysListView32", NULL);
        if(hListView)
        {
            SetWindowLong(hListView, GWL_STYLE,
                    GetWindowLong(hListView, GWL_STYLE) & 0xFFFFFFF0 | LVS_ICON);
        }
    }
    return CallWindowProc((FARPROC)OldDlgOpenProc, hWnd, uMsg, wParam, lParam);
}
//---------------------------------------------------------------------------
// 本文来自 http://www.ccrun.com
// 欢迎光临 C++ Builder 研究
// 作者: ccrun(老妖)
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
    : TForm(Owner)
{
    OpenDialog1->OnClose = OpenDialogClose;
    OpenDialog1->OnShow = OpenDialogShow;
    Button1->OnClick = Button1Click;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Button1Click(TObject *Sender)
{
    OpenDialog1->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OpenDialogShow(TObject *Sender)
{
    OldDlgOpenProc = (FARPROC)SetWindowLong(
            OpenDialog1->Handle, GWL_WNDPROC, (long)NewDlgOpenProc);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OpenDialogClose(TObject *Sender)
{
    SetWindowLong(OpenDialog1->Handle, GWL_WNDPROC, (long)OldDlgOpenProc);
}
//---------------------------------------------------------------------------

后来ccrun偶然发现,还有更简单的方法:
//---------------------------------------------------------------------------
// 本文来自 http://www.ccrun.com
// 欢迎光临 C++ Builder 研究
// 作者: ccrun(老妖)

const DWORD FCIDM_SHVIEW_LARGEICON  = 28713; // 大图标模式
const DWORD FCIDM_SHVIEW_SMALLICON  = 28714; // 小图标模式
const DWORD FCIDM_SHVIEW_LIST       = 28715; // 列表模式
const DWORD FCIDM_SHVIEW_REPORT     = 28716; //
const DWORD FCIDM_SHVIEW_THUMBNAIL  = 28717; // XP only
const DWORD FCIDM_SHVIEW_TILE       = 28718; // XP
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
    : TForm(Owner)
{
    // 指定打开对话框在显示出来时执行的事件
    OpenDialog1->OnShow = dlgOpenOnShow;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::WndProc(TMessage &Msg)
{
    // 重载WndProc实现消息的自定义处理
    if(Msg.Msg == WM_USER + 1)
    {
        // 文件列表是一个ListView控件,其父控件关系如下:
        // TOpenDialog-->SHELLDLL_DefView-->SysListView32
        HWND hDlg = (HWND)Msg.WParam;
        HWND hCtrl = FindWindowEx(hDlg, NULL, "SHELLDLL_DefView", NULL);
        if(hCtrl != NULL)
            // 向SHELLDLL_DefView控件发送 WM_COMMAND 消息
            // 关键是wParam参数,指定ListView的样式
            SendMessage(hCtrl, WM_COMMAND, FCIDM_SHVIEW_LARGEICON, 0); // 大图标
    }
    TForm::WndProc(Msg);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::dlgOpenOnShow(TObject *Sender)
{
    // 当打开对话框显示出来时发送自定义消息到窗体
    HWND hDlg = GetParent(((TOpenDialog *)Sender)->Handle);
    PostMessage(Handle, WM_USER + 1, (WPARAM)hDlg, 0);
}
//---------------------------------------------------------------------------
// 测试代码:
void __fastcall TfrmMain::Button1Click(TObject *Sender)
{
    // Show出打开对话框
    OpenDialog1->Execute();
}

Win10系统安装SQL2000的兼容性问题与解决方案 数据库管理系统在跨代操作系统上的兼容性问题是企业IT运维中的常见挑战。以SQL Server 2000为例,这款发布于2000年的经典数据库在Windows 10环境下会遇到系统版本不兼容、服务启动失败等典型问题。通过设置兼容性模式、安装必备组件、使用特殊启动参数等技术手段,可以有效解决这些兼容性问题。特别是在企业级应用中,正确处理数据库服务的启动账户配置、端口开放和内存限制调整等关键步骤,能够确保系统的稳定运行。对于必须使用SQL2000的场景,建议采用虚拟机隔离或考虑迁移到新版SQL Server等替代 阅读详情

相关推荐

震荡波病毒情况介绍

lsass漏洞及关于W32.Worm.Sasser病毒情况介绍 2004.5. 1起互联网上出现了一个新的高威胁病毒——Worm.Sasser。该病毒会对被感染的机器(WinNT、Win2000、WinXP、Win2003操作系统)造成巨大的危害。 病毒的危害和传播:Worm.Sasser病毒利用Windows平台的Lsass漏洞,进行传播。可能会导致被感染的机器无法正常使用,直至...

dianmian4635的博客 3904

VC 对话框最大化显示

在onitidialog函数中 CRect rectDeskTop; WINDOWPLACEMENT wpnew; GetWindowPlacement(&wpnew); ::GetWindowRect(::GetDesktopWindow(), rectDeskTop); ::AdjustWindowRectEx(rectDeskTop, GetStyle(), F...

qq_24127015的博客 402

Windows内存占用过高排查与优化:从任务管理器到内核泄漏的完整解决方案

内存管理是操作系统核心功能之一,它负责在物理内存与虚拟内存之间高效调度数据,确保应用程序稳定运行。其原理涉及工作集、分页缓冲池、非分页缓冲池等内核机制,当驱动程序或应用存在内存泄漏时,会导致非分页缓冲池异常增长,引发系统卡顿。理解这些概念对系统性能调优至关重要,尤其在开发、数据库服务等资源密集型场景中。本文聚焦Windows系统内存占用过高的典型问题,如任务管理器内存和实际内存占用对不上、非分页缓冲池泄漏等,通过资源监视器、RAMMap等工具进行深度诊断,并提供从虚拟内存配置到启动项管理的实践方案,帮助用户

weixin_34221036的博客 418

MFC打开文件对话框

原文地址::http://blog.chinaunix.net/uid-14827902-id-3058983.html 相关网帖 1、MFC打开/保存文件对话框:CFileDialog----http://www.cnblogs.com/jcss2008/archive/2008/10/10/1308301.html  CFileDialog类封装了

xqhrs232的专栏 1216

Win10运行红色警戒2黑屏原因与DirectPlay修复方案

DirectPlay是Windows早期用于游戏网络和音频通信的核心API组件,其设计初衷是为《红色警戒2》等DirectX 8时代游戏提供跨平台联机与多媒体支持。随着Windows 10逐步移除Legacy API支持,DirectPlay被逻辑剔除而非简单禁用,导致依赖硬编码CLSID调用和GDI+DirectDraw混合渲染的老游戏启动失败。该技术断层引发黑屏、闪退、初始化失败等典型问题,本质是COM注册缺失、DLL加载策略变更与DWM图形管理冲突共同作用的结果。通过重建DirectPlay CLSI

weixin_34232744的博客 300

Windows 11用户账户切换与Win+F4快捷键解析

Windows操作系统通过会话管理机制实现多用户环境支持,其核心原理涉及Winlogon进程和LSA认证模块的协同工作。系统快捷键作为提升效率的工程实践方案,Win+F4组合键在Windows 11中展现出特殊的会话管理行为,既关联关机对话框又可能触发用户切换功能。通过注册表分析和AutoHotkey工具可深入理解快捷键映射机制,这种技术方案在家庭多用户共享和企业IT管理中具有重要应用价值。文章结合Windows 11最新特性,详解了包括快速用户切换在内的实用技巧,并提供了性能优化方案。

chubaisheng8627的博客 472

CCS 5.5 Win7安装教程:构建稳定DSP交叉编译环境

Code Composer Studio(CCS)是TI官方推出的嵌入式C/C++集成开发环境,核心用于TMS320系列DSP芯片的程序开发、调试与烧录。其本质是一套深度耦合的交叉编译工具链,包含Eclipse前端、专用C2000/C6000编译器及XDS仿真器驱动栈。在Windows 7平台,CCS 5.5因精准匹配JDK 1.6.0_26、精简Eclipse插件、适配WDM驱动模型等设计,成为F28379等C2000芯片最稳定的开发环境。它规避了新版CCS对系统资源的高消耗,也解决了旧版CCS 4.x对

weixin_29168153的博客 100

Windows 11文件夹无法重命名问题解决方案

在Windows系统中,文件资源管理器(Explorer.exe)是管理文件和文件夹的核心组件。当遇到文件夹重命名失败时,通常涉及系统权限、进程异常或第三方程序冲突等底层机制。理解Windows文件系统的权限控制原理和进程管理机制,能有效解决这类文件操作问题。特别是在Windows 11系统中,随着系统更新和安全策略调整,这类问题更为常见。通过获取完全控制权限、重启Explorer进程或使用命令行工具等工程实践方法,可以快速恢复文件管理功能。这些解决方案不仅适用于文件夹重命名问题,对解决其他文件操作异常也有

weixin_30536861的博客 199

Photoshop卡顿根因与Win11 CPU调度优化方案

Photoshop作为专业图像处理软件,其性能表现高度依赖CPU调度效率与系统底层协同。当出现启动卡顿、响应延迟、风扇狂转等现象时,本质是Adobe云架构进程(如AdobeIPCBroker、CCXProcess)与Windows 10/11现代调度机制(如Hybrid Scheduler、Core Isolation、WARP GPU调度)发生资源争抢。这类问题并非硬件不足所致,而是多线程轮询、字体扫描I/O、GPU加速路径错配及内核级优先级冲突共同引发的系统级性能衰减。通过进程限流、服务精简、GPU直通

weixin_30536861的博客 244

Win10开始菜单点不动?鼠标侧键卡住是隐形元凶

在使用Windows系统时,桌面出现“半死”状态——鼠标指针能动,但点击开始菜单、任务栏或桌面图标均无响应,是不少用户遭遇过的棘手问题。这种故障常被误判为系统崩溃或软件冲突,实则可能与鼠标侧键的物理卡键或微动开关老化有关。当鼠标按键持续发送“按住”信号时,Windows的输入队列会被干扰,导致窗口焦点锁定,仅当前活动窗口可操作。通过分步排查:先区分全局锁死与局部失灵,再借助按键检测工具或替换鼠标验证,即可快速定位根因。掌握正确的故障排查顺序,不仅能节省大量时间,还能避免误重装系统的尴尬。本文从系统外壳、窗口

weixin_34221773的博客 434

WIN11上硬刚CCS3.3:一个DSP初学者的踩坑实录与避坑指南

本文详细记录了在Windows 11系统上安装和配置Code Composer Studio 3.3(CCS3.3)的全过程,包括系统兼容性检查、安装优化、性能调优、编译错误解决等关键步骤。特别针对DSP初学者提供了实用的避坑指南和调试技巧,帮助用户在WIN11环境下顺利运行CCS3.3进行DSP开发。

weixin_30482181的博客 326

Windows Vista升级Win7的五大兼容性阻断点解析

操作系统升级兼容性是IT运维中的基础性技术命题,其核心在于硬件抽象层(HAL)、驱动签名机制、服务依赖关系、用户配置迁移及固件级交互等多层协同。Windows 7作为Vista之后的关键演进版本,首次系统性强化了驱动强制签名校验与ACPI电源管理规范,使原地升级从流程操作升维为跨代际系统兼容性压力测试。这一过程暴露出的HAL不匹配、ACPI握手失败等问题,至今仍在Win10→Win11等后续升级中复现。本文聚焦真实企业环境下的高频硬性阻断点,结合BIOS调优、驱动注入、注册表修复等工程实践,为老旧设备利旧、

xiang_fu的博客 425

Win10重装系统底层原理与实战排障指南

Windows重装系统本质上是UEFI固件、GPT分区、NTFS文件系统与驱动生态协同工作的底层工程。理解启动链(从电源键到EFI加载)、区分MBR/GPT磁盘布局、掌握PE环境构建(如微PE官网工具)及BIOS/UEFI设置(戴尔BIOS设置U盘启动、Secure Boot开关)是成功重装的前提。技术价值在于规避‘一键重装’陷阱,实现故障归因与可复用处置——例如解决‘重装后3.5mm无声音输出’需匹配Realtek芯片ID驱动,而非反复重装;应对‘无法安装Windows因为磁盘布局不受UEFI’须校验并转

weixin_33957648的博客 356

Windows XP Mode深度解析:Win7时代的无缝兼容技术

虚拟机是基础抽象层,而运行时兼容环境(Runtime Compatibility Environment)才是解决遗留系统迁移难题的核心范式。其原理在于通过增强会话协议、双向设备重定向与应用级集成三重机制,在宿主系统中实现 guest 应用的原生级交互体验。这类技术不仅承载着兼容性保障的关键价值,更深刻影响了现代操作系统如WSL、Android子系统等的设计逻辑。典型应用场景包括VB6/Access架构的老财务软件、工业控制驱动、医疗影像设备接口等无法重构的legacy application。本文聚焦Wi

diaojin6880的博客 529

PVZTools内存调试原理与Win11兼容实践

内存调试是单机游戏辅助工具的核心技术基础,涉及进程通信、动态地址定位与输入事件模拟三大关键环节。其原理依赖Windows用户态API(如OpenProcess、mouse_event)实现跨进程读写与操作注入,技术价值在于不修改文件、不触发反作弊、全程可验证。典型应用场景包括老旧游戏兼容适配、运行时变量监控及自动化交互开发。本文聚焦植物大战僵尸(PVZ)原版在Win11下的稳定运行问题,深入解析ASLR应对、DPI坐标校准与多级指针扫描机制,结合PVZTools这一轻量级内存调试工具实例,系统呈现从地址发现

weixin_34037515的博客 277

Windows 11/10 资源管理器卡死别慌!这3种重启explorer.exe的方法亲测有效

本文详细介绍了Windows 11/10资源管理器卡死时的3种专业级恢复方案,包括通过任务管理器、命令行和系统内置快捷键重启explorer.exe进程。这些方法适用于不同严重程度的故障场景,帮助用户快速恢复系统功能,提升工作效率。

weixin_33327380的博客 1213
上一篇: 用Delphi实现程序间的数据传递
下一篇: 遍历逻辑驱动器片断code
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值