列表框未正确填充

listbox not populating correctly

本文关键字:填充 列表      更新时间:2023-10-16

这是我在这里的第一篇文章,我正在尝试学习在代码块 32 中编写 win12.11 GUI,但问题是,

我在对话框窗口(IDC_LISTP>个人项目笔记)和(IDC_LISTS>共享项目笔记)上有 2 个列表框,

(个人项目笔记)在

创建的对话框中自动填充,我也可以从正确的文件夹(更新共享)填充(共享项目笔记)。

当我单击(更新个人)后单击按钮(更新个人)时出现问题,它将(共享项目注释)的内容加载到(个人项目注释)

列表框中,即使也使用清除按钮,单击(更新个人)按钮时,这仍然会填充(个人项目注释),

我该如何阻止这种情况发生???

请有人帮我解决这个问题,我已经把头撞在墙上好几天了,

这是我目前正在试验的代码,请原谅混乱的代码,因为其中大部分来自我已经转换为适合我的 GUI 的示例。

其他帖子也 http://forums.codeguru.com/showthread.php?540733-win32-listbox-not-populating-right 附有图片

 BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){
            switch(Message){
                case WM_INITDIALOG:
                CheckRadioButton(HWND (hwnd),IDRADIO, IDRADIO2, IDRADIO);
                {
                DlgDirList(HWND (ID_PROJECT_PROJECT_NOTES), pbuffer, IDC_LISTP, 0, DDL_EXCLUSIVE);
                HWND hListBox = GetDlgItem(hwnd, IDC_LISTP);
                SendMessage(hListBox, LB_DIR, 0, (LPARAM)("*.txt*"));
                }
            break;
                case WM_COMMAND:
                    switch(LOWORD(wParam)){
                        case ID_UPDATEP:{
                        SendDlgItemMessage(HWND(hwnd), IDC_LISTP, LB_RESETCONTENT, 0, 0);
                        DlgDirList(HWND (ID_PROJECT_PROJECT_NOTES), pbuffer, IDC_LISTP, 0, DDL_EXCLUSIVE);
                        HWND hListBox = GetDlgItem(hwnd, IDC_LISTP);
                        SendMessage(hListBox, LB_DIR, 0, (LPARAM)("*.txt"));
                        }
                        break;
                        case ID_UPDATES:{
                        SendDlgItemMessage(HWND(hwnd), IDC_LISTS, LB_RESETCONTENT, 0, 0);
                        DlgDirList(HWND (ID_PROJECT_PROJECT_NOTES), sbuffer, IDC_LISTS, 0, DDL_EXCLUSIVE);
                        HWND hList = GetDlgItem(hwnd, IDC_LISTS);
                        SendMessage(hList, LB_DIR, 0, (LPARAM)("*.txt"));
                        }
                        break;
                        case IDCLEAR:
                        SendDlgItemMessage(HWND(hwnd), IDC_LISTP, LB_RESETCONTENT, 0, 0);
                        SendDlgItemMessage(HWND(hwnd), IDC_LISTS, LB_RESETCONTENT, 0, 0);
                            break;
                        case IDCREATE:{
                        DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDPAD), NULL, DlgProc);
                        }
                            break;
                        case IDOK:
                        EndDialog(hwnd, IDOK);
                        break;
                        case IDCANCEL:
                        EndDialog(hwnd, IDCANCEL);
                        break;
                    }
                    break;
                case WM_CLOSE:
                    EndDialog(hwnd, 0);
                break;
                default:
                    return FALSE;
            }
            return TRUE;
        }

您的代码有几个问题,请查看 MSDN Docs for DlgDirList():

a) 要DlgDirList()的第一个参数必须是handle to the dialog box that contains the list box;代码中没有错误检查,我怀疑对DlgDirList()的调用失败并出现错误

b) 文档说DlgDirList sends the LB_RESETCONTENT and LB_DIR messages to the list box

所以你需要做的就是

int nResult;
nResult = DlgDirList(hwnd, pbuffer, IDC_LISTP, 0, 0);
TRACE("Filling P (ID %d) from %s: result = %dn", IDC_LISTP, pbuffer, nResult);
nResult = DlgDirList(hwnd, sbuffer, IDC_LISTS, 0, 0);
TRACE("Filling S (ID %d) from %s: result = %dn", IDC_LISTS, sbuffer, nResult);

确保pbuffersbuffer都包含一个路径和一个通配符字符串,如"C:\personal\*.txt"和"C:\shared\*.txt"。

此链接包含如何使用DlgDirList的示例。