问题描述
我在放置我的 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
。