你好,我是 WTL 的新手,我不明白如何在 CListViewCtrl 上重新接收消息

问题描述

我在放置我的 DialogBar 的地方创建了 .rc 文件。在此 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),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,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*/,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);
};

解决方法

    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 在 <atlcrack.h> 标头中有更好的消息破解程序,您需要从那里获得 NOTIFY_HANDLER_EX

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...