• SOUI中启用拖文件


        本文所用SOUI版本为1.0版本,在拖文件上与一般的消息略有不同。

    1.添加拖文件消息响应

    先与常规添加消息相同。

    class CMainFrm : public SHostWnd
    {
    public:
        CMainFrm(void);
        ~CMainFrm(void);
        
        void OnDropFile(HDROP hDropInfo)
        {
            SetMsgHandled(FALSE);
    
            UINT  nFileCount = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
            TCHAR szFileName[_MAX_PATH] = _T("");
            DWORD dwAttribute;
    
            // 获取拖拽进来文件和文件夹
            for (UINT i = 0; i < nFileCount; i++)
            {
                ::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName));
                dwAttribute = ::GetFileAttributes(szFileName);
    
                // 是否为文件夹
                if ( dwAttribute & FILE_ATTRIBUTE_DIRECTORY )
                {          
                    SMessageBox(m_hWnd, "注意:不支持拖拽添加文件夹", "系统提示", MB_OK|MB_ICONWARNING);
                }
                else
                {
                    std::string file_path = szFileName;
                    
                    //添加代码...........
                }
            }
            ::DragFinish(hDropInfo);
            
        }
        
        void OnClose() ;
        
    protected:
        //soui消息
        EVENT_MAP_BEGIN()
            EVENT_NAME_COMMAND(L"btn_close", OnClose)
        EVENT_MAP_END()
    
        //HostWnd真实窗口消息处理
        BEGIN_MSG_MAP_EX(CMainFrm)
            MSG_WM_DROPFILES(OnDropFile)
        CHAIN_MSG_MAP(SHostWnd)
        REFLECT_NOTIFICATIONS_EX()
        END_MSG_MAP()
    }

    到这里完成了SOUI添加消息的比较完整的过程。但是发现窗口并不响应拖文件。

    2.使窗口可以拖文件

    参考简单方法解决Vista/Win7 无法接收WM_DROPFILES问题 ,添加如下函数

    BOOL ChangeWndMessageFilter(UINT uMessage, BOOL bAllow)
    {
        typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)(UINT, DWORD);  
        HMODULE hUserMod = NULL;  
        BOOL bResult = FALSE;  
        hUserMod = LoadLibrary( "user32.dll" );  
        if ( hUserMod == NULL )  
        {  
            return FALSE;  
        }  
    
        // 获取ChangeWindowMessageFilter函数接口指针  
        ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );  
        if ( pfnChangeWindowMessageFilter == NULL )  
        {  
            FreeLibrary( hUserMod );  
            return FALSE;  
        }  
    
        bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?1:2 ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE  
        FreeLibrary( hUserMod );  
        return bResult;  
    }

    然后在初始化函数中添加如下:

    BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam)
    {
        SetMsgHandled(FALSE);
    
        shellNotifyIcon.Create(m_hWnd,GETRESPROVIDER->LoadIcon(_T("ICON_LOGO"),16));
        shellNotifyIcon.Show();
    
        m_bLayoutInited=TRUE;
    
        //拖文件相关
        DragAcceptFiles(m_hWnd, TRUE);
        ChangeWndMessageFilter(0x0049, MSGFLT_ADD);
        ChangeWndMessageFilter(WM_DROPFILES, MSGFLT_ADD);
        
        return TRUE;
    }

    这样就实现了文件拖曳。

    完整代码如下:

    class CMainFrm : public SHostWnd
    {
    public:
        CMainFrm(void);
        ~CMainFrm(void);
        
        BOOL ChangeWndMessageFilter(UINT uMessage, BOOL bAllow)
        {
            typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)(UINT, DWORD);  
            HMODULE hUserMod = NULL;  
            BOOL bResult = FALSE;  
            hUserMod = LoadLibrary( "user32.dll" );  
            if ( hUserMod == NULL )  
            {  
                return FALSE;  
            }  
    
            // 获取ChangeWindowMessageFilter函数接口指针  
            ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );  
            if ( pfnChangeWindowMessageFilter == NULL )  
            {  
                FreeLibrary( hUserMod );  
                return FALSE;  
            }  
    
            bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?1:2 ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE  
            FreeLibrary( hUserMod );  
            return bResult;  
        }
        
        BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam)
        {
            SetMsgHandled(FALSE);
    
            m_bLayoutInited=TRUE;
    
            //拖文件相关
            DragAcceptFiles(m_hWnd, TRUE);
            ChangeWndMessageFilter(0x0049, MSGFLT_ADD);
            ChangeWndMessageFilter(WM_DROPFILES, MSGFLT_ADD);
            
            return TRUE;
        }
    
        
        void OnDropFile(HDROP hDropInfo)
        {
            SetMsgHandled(FALSE);
    
            UINT  nFileCount = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
            TCHAR szFileName[_MAX_PATH] = _T("");
            DWORD dwAttribute;
    
            // 获取拖拽进来文件和文件夹
            for (UINT i = 0; i < nFileCount; i++)
            {
                ::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName));
                dwAttribute = ::GetFileAttributes(szFileName);
    
                // 是否为文件夹
                if ( dwAttribute & FILE_ATTRIBUTE_DIRECTORY )
                {          
                    SMessageBox(m_hWnd, "注意:不支持拖拽添加文件夹", "系统提示", MB_OK|MB_ICONWARNING);
                }
                else
                {
                    std::string file_path = szFileName;
                    
                    //添加代码...........
                }
            }
            ::DragFinish(hDropInfo);
            
        }
        
        void OnClose() ;
        
    protected:
        //soui消息
        EVENT_MAP_BEGIN()
            EVENT_NAME_COMMAND(L"btn_close", OnClose)
        EVENT_MAP_END()
    
        //HostWnd真实窗口消息处理
        BEGIN_MSG_MAP_EX(CMainFrm)
        MSG_WM_INITDIALOG(OnInitDialog)
            MSG_WM_DROPFILES(OnDropFile)
        CHAIN_MSG_MAP(SHostWnd)
        REFLECT_NOTIFICATIONS_EX()
        END_MSG_MAP()
        
    private:
        BOOL        m_bLayoutInited;/**<UI完成布局标志 */
    }
  • 相关阅读:
    下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
    c语言二级指针简单练习
    C++ Dlib库介绍和编译使用
    Win10怎么设置开机自动启动程序?
    C 可变参数
    Qt 进程守护程序(windows、linux)
    Leetcode 面试题 17.04. 消失的数字
    TCP的三次握手与四次挥手理解及面试题(很全面)
    studio visual 插件下载太慢 visual studio 下载慢的解决办法
    人脸检测(Python dlib)
  • 原文地址:https://www.cnblogs.com/betterwgo/p/7892618.html
Copyright © 2020-2023  润新知