您好,我是 WTL 的新手,我不明白如何在 ListView Ctrl 上接收消息

Posted

技术标签:

【中文标题】您好,我是 WTL 的新手,我不明白如何在 ListView Ctrl 上接收消息【英文标题】:Hello, i am new in WTL, i dont understand how to reseive messages on CListViewCtrl 【发布时间】:2021-06-25 20:37:07 【问题描述】:

我创建 .rc 文件来放置我的 DialogBar。在此 DialogBar 的部分中,我创建 CListViewCtrl.并填充它。 然后我需要在 SelectedItem 上接收消息。 请给我一些代码或链接以了解我的问题。谢谢你。 这是我的 DialogBar 代码,我在其中调用该函数来创建 CListViewCtrl


#include <thread>

#include "resource.h"
#include "resource2.h"
#include "MyListView.h"

class MyDialogBar:public CDialogImpl<MyDialogBar>

public:
    enum  IDD = IDD_MYDIALOGBAR ;


    BEGIN_MSG_MAP(MyDialogBar)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        MESSAGE_HANDLER(WM_COMMAND,OnCommand)
        MESSAGE_HANDLER(WM_NOTIFY,OnLButtonDown)
        MESSAGE_HANDLER(WM_CLOSE,OnCloseCmd)
    END_MSG_MAP()

    LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    
        CString parameter = TEXT("C:\\Users\\Огурчик\\Desktop\\");
        switch (wParam)
        
        case IDC_BUTTON_EXIT:
            OnCloseCmd(uMsg,wParam,lParam,bHandled);
            return 0;
        case IDC_BUTTON_APPLY:
            ListView_DeleteAllItems(this->myListView.m_hWnd);
            if (FindThread.joinable())
            
                FindThread.detach();
                FindThread = std::thread((&MyListView::FindFile),this->myListView, parameter);
            
            else
            
                FindThread = std::thread((&MyListView::FindFile), this->myListView, parameter);
            
            return 0;
        case IDC_SEARCH_TEXT_BAR :
            GetDlgItemText(IDC_SEARCH_TEXT_BAR, FileName);
            return 0;
        case IDC_EXTENTION_TEXT_BAR:
            GetDlgItemText(IDC_EXTENTION_TEXT_BAR, FileExtention);
            return 0;
        
        return 0;
    
    
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    
        
        switch (LOWORD(wParam))
        
        case (int)LVN_ITEMCHANGED:
            MessageBox(TEXT("U am here"), TEXT("Here"), NULL);
        
        return 0;
    
    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    
        myListView.Create(m_hWnd);
        return 0;
    

    LRESULT OnCloseCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    
        if (FindThread.joinable())
        
            FindThread.detach();
        
        EndDialog(NULL);
        return 0;
    

    
private:
    CString FileName;
    CString FileExtention;
    MyListView myListView;
    std::thread FindThread;
;

//code of CListViewCtrl
#pragma once
#include <atlbase.h>
#include <atlapp.h>
#include <atlmisc.h>
#include <atlwin.h>
#include <atlctrls.h>
#include <atlfile.h>
#include <atlstr.h>



class MyListView:public CListViewCtrl

private:
    LVITEM lvItem;
    CListViewCtrl myListView; 
    CString path;
    int i;
public:

    void Create(HWND m_hWnd);
    void FindFile(CString szPath);
    void View_List(CString buf, int i,CString path);
    BOOL InitListViewImage(int size, CString path);
;

【问题讨论】:

根据您的尝试,您可能会发现How to detect a selection change in my WTL::CListViewCtrl, and not in the parent? 很有帮助。请务必阅读所有答案。 【参考方案1】:
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    
        
        switch (LOWORD(wParam))
        
        case (int)LVN_ITEMCHANGED:
            MessageBox(TEXT("U am here"), TEXT("Here"), NULL);
        
        return 0;
    

这看起来不对。

WM_NOTIFY 处理程序应使用lParam 并将其转换为NMHDR 结构,并且不应使用wParam。见docs:

wParam

发送消息的公共控件的标识符。这 不保证标识符是唯一的。应用程序应该使用 NMHDR 结构的 hwndFrom 或 idFrom 成员(作为 lParam 参数)来识别控件。

lParam

指向包含通知代码的 NMHDR 结构的指针 和附加信息。对于某些通知消息,这 参数指向具有 NMHDR 结构的更大结构 它的第一个成员。

您最好使用NOTIFY_HANDLER 宏而不是MESSAGE_HANDLER 宏。

WTL 在&lt;atlcrack.h&gt; 标头中有更好的消息破解程序,您需要从那里获得NOTIFY_HANDLER_EX

【讨论】:

以上是关于您好,我是 WTL 的新手,我不明白如何在 ListView Ctrl 上接收消息的主要内容,如果未能解决你的问题,请参考以下文章

我不明白如何在 Java 中正确使用 NaN [重复]

如何等待 ThreadPoolExecutor 完成

Java:如何在画布中绘制?

表单中的复选框

在联系人中添加应用程序

我如何在我的反应应用程序中实现 jwt 验证