好的,我有一个 ListView,我刚刚弄清楚了如何手动设置它的回调过程:
// Sets the list view procedure
listproc = (D_ListView *) LocalAlloc(LMEM_FIXED, sizeof(D_ListView));
listproc->oldproc = (WNDPROC)SetWindowLongPtr(g_hList, GWL_WNDPROC, (LONG)&ListViewProc);
SetWindowLongPtr(g_hList, GWL_USERDATA, (LONG)&listproc);
我使用了一个我发现的代码示例 - D_ListView
只是一个 struct
和一个名为 oldproc
的 WNDPROC
变量.
无论如何,我正在向我的 ListView 发送消息以添加项目。但我不想手动处理 ADD 消息,我想将它们传递给 ListView 的默认过程,并且只处理我需要覆盖其功能的消息。
LRESULT CALLBACK ListViewProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
// Just a test - we're getting this message so it worked
case LVM_INSERTCOLUMN:
{
cout << "CREATED" << endl;
}
}
WNDPROC* wp;
wp = (WNDPROC*)(::GetWindowLongPtr(hwnd, GWL_WNDPROC));
return ::CallWindowProc(*wp, hwnd, msg, wParam, lParam);
}
在上面,我不想处理 LVM_INSERTCOLUMN:我只是想传递它。
有人能帮忙吗?
谢谢, 罗布
最佳答案
使用 getWindowLongPtr (...GWL_USERDATA)
获取指向您的 D_ListView
实例的指针,然后将任何不需要的消息转发到 oldproc
::CallWindowProc(*listproc->oldproc, hwnd, msg, wParam, lParam);
关于C++ Windows API - 如何使用 ListView 的默认 WIndows Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13563251/