Это мое первое сообщение здесь, я пытаюсь научиться программировать GUI win32 в блоках кода 12.11, но вот проблема,
У меня есть 2x окна списка в окне диалогового окна (IDC_LISTP> Personal Project Notes) и (IDC_LISTS> Общие проектные заметки),
В диалоговом окне автоматически создаются (личные заметки проекта), я также могу получить (общие заметки проекта) для заполнения из правильной папки (обновление общего).
Проблема возникает, когда я нажимаю кнопку (обновлять личную) после щелчка (обновление общего), оно загружает содержимое (общие заметки проекта) в окно списка личных проектов, даже после использования кнопки очистки тоже, это все еще заполняет (личные заметки проекта) при нажатии кнопки (обновить личную)
как я могу отказаться от этого?
пожалуйста, кто-то может помочь мне решить эту проблему, я уже несколько дней стуча головой о стену,
Это код, с которым я в настоящее время экспериментировал, пожалуйста, извините грязный код, так как большая часть его из примеров, которые я преобразовал в соответствии с моим графическим интерфейсом.
дополнительные сообщения 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 для DlgDirList():
a) Первым параметром для DlgDirList()
должен быть handle to the dialog box that contains the list box
; в коде отсутствует проверка ошибок, я подозреваю, что вызов DlgDirList()
завершается с ошибкой
б) документы говорят, что 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 = %d\n", IDC_LISTP, pbuffer, nResult);
nResult = DlgDirList(hwnd, sbuffer, IDC_LISTS, 0, 0);
TRACE("Filling S (ID %d) from %s: result = %d\n", IDC_LISTS, sbuffer, nResult);
Убедитесь в том, что pbuffer
и sbuffer
каждый из которых содержит путь и подстановочные-строку, например "C:.\Персональный\*.txt" и "C:\Shared\*.txt.".
Эта ссылка содержит пример использования DlgDirList
.