|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Creating a Multiple-Selection List Box
The following example displays and initializes the dialog box used in the preceding example. However, this code uses the LBS_MULTIPLESEL style to enable the user to select more than one file at a time. When the user chooses the Delete button, the example sends the LB_GETSELCOUNT message (to retrieve the number of files selected) and the LB_GETSELITEMS message (to retrieve an array of selected list box items). After deleting a file, the code removes the corresponding item from the list box by sending the LB_DELETESTRING message.
#define BUFFER MAX_PATH #define BIGBUFF 8192 /* * FUNCTION: DlgDelFilesProc(HWND, unsigned, UINT, LONG) * * PURPOSE: "Delete files" dialog box */ BOOL APIENTRY DlgDelFilesProc( HWND hDlg, /* window handle of dialog box */ UINT message, /* type of message */ UINT wParam, /* message-specific information */ LONG lParam) { DWORD cchCurDir; LPTSTR lpszCurDir; LPTSTR lpszFileToDelete;
int nSelItems; int nSelItemsInBuffer; TCHAR tchBuffer[BUFFER]; TCHAR tchMsgBuff[BUFFER]; int nBuffer[BIGBUFF]; int i; BOOL fResult; HWND hListBox; switch (message) { case WM_INITDIALOG: /* * Initialize the list box by filling it with files from * the current directory. */ lpszCurDir = tchBuffer; GetCurrentDirectory(cchCurDir, lpszCurDir);
DlgDirList(hDlg, lpszCurDir, IDL_FILES, IDS_PATHTOFILL, 0); SetFocus(GetDlgItem(hDlg, IDL_FILES)); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: /* * When the user presses the Delete (IDOK) * button, delete all the selected files. */ lpszFileToDelete = tchBuffer;
hListBox = GetDlgItem(hDlg, IDL_FILES); nSelItems = SendMessage(hListBox, LB_GETSELCOUNT, 0, 0); nSelItemsInBuffer = SendMessage(hListBox, LB_GETSELITEMS, 512, (LPARAM) nBuffer); if (nSelItems > nSelItemsInBuffer) { MessageBox(hDlg, "Too many items selected.", NULL, MB_OK);
} else { /* * Go through the list backwards because after * deleting an item the indices change for every * subsequent item. By going backward, the * indice are never invalidated. */ for (i = nSelItemsInBuffer - 1; i >= 0; i--) { SendMessage(hListBox, LB_GETTEXT,
nBuffer[i], (LPARAM) lpszFileToDelete); fResult = DeleteFile(lpszFileToDelete); if (!fResult) { sprintf(tchMsgBuff, "Could not delete file: %s " "GetLastError = %u", (LPARAM) lpszFileToDelete);
/* Call app-defined error handler. */ ErrorHandler(tchMsgBuff); } else { SendMessage(hListBox, LB_DELETESTRING, nBuffer[i], 0); } } SendMessage(hListBox, LB_SETCARETINDEX, 0, 0); }
return TRUE; case IDCANCEL: /* Destroy the dialog box. */ EndDialog(hDlg, TRUE); return TRUE; default: return FALSE; } default: return FALSE; } }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Ящик Списка Создания Multiple-Selection
Следующий пример отображает и инициализирует диалоговый ящик использованный в предыдущем примере. Тем не менее, этот код использует стиль LBS_MULTIPLESEL, чтобы приспосабливаться потребителя, чтобы выбираться более, чем один файл за один раз. Когда потребитель выбирает кнопку Delete, пример посылает сообщение LB_GETSELCOUNT (чтобы извлекать количество выбранных файлов) и сообщение LB_GETSELITEMS (чтобы извлекать массив пунктов ящика выбранного списка). После удалять файла, код удаляет соответствующий пункт из ящика списка посылая сообщение LB_DELETESTRING.
#define БУФЕР MAX_PATH #define BIGBUFF 8192 /* * ФУНКЦИЯ: DlgDelFilesProc(HWND, неподписанный, UINT, ДОЛГО (ДЛИНОЙ)) * * ЦЕЛЬ: диалоговый ящик "Удаляет файлы" */ BOOL APIENTRY DlgDelFilesProc( HWND hDlg, /* РУЧКА окна диалогового блока */ сообщение UINT, /* тип сообщения */ UINT wParam, /* сообщеняя-специфическая информация */ ДОЛГО (ДЛИНОЙ) lParam) { DWORD cchCurDir; LPTSTR lpszCurDir; LPTSTR lpszFileToDelete;
int nSelItems; int nSelItemsInBuffer; TCHAR tchBuffer[BUFFER]; TCHAR tchMsgBuff[BUFFER]; int nBuffer[BIGBUFF]; int i; BOOL fResult; HWND hListBox; ключ (сообщение) { случай WM_INITDIALOG: /* * Инициализируйте блока списка заполняя это файлами из * текущий директорий. */ lpszCurDir = tchBuffer; GetCurrentDirectory(cchCurDir, lpszCurDir);
DlgDirList(hDlg, lpszCurDir, IDL_FILES, IDS_PATHTOFILL, 0); SetFocus(GetDlgItem(hDlg, IDL_FILES)); обратная ЛОЖЬ; случай WM_COMMAND: ключ (LOWORD(wParam)) { случай IDOK: /* * Когда пользователь нажимает Delete (IDOK) * кнопка, удаляет все выбранные файлы. */ lpszFileToDelete = tchBuffer;
hListBox = GetDlgItem(hDlg, IDL_FILES); nSelItems = SendMessage(hListBox, LB_GETSELCOUNT, 0, 0); nSelItemsInBuffer = SendMessage(hListBox, LB_GETSELITEMS, 512, (LPARAM) nBuffer); если (nSelItems > nSelItemsInBuffer) { MessageBox(hDlg, "Слишком много пунктов выбирались бы.", НЕДЕЙСТВИТЕЛЬНЫЙ, MB_OK);
} еще { /* * Пройдите через список обратно (задом наперед) поскольку впоследствии * удаляя пункт индексы заменяют каждое * последующий пункт. Ходя отсталый, .Jчемjтем * indice никогда не аннулированы. */ для (i = nSelItemsInBuffer - 1; я >= 0; я--) { SendMessage(hListBox, LB_GETTEXT,
nBuffer[i], (LPARAM) lpszFileToDelete); fResult = DeleteFile(lpszFileToDelete); если (!fResult) { sprintf(tchMsgBuff, "не Могло удалять файл: %s " "GetLastError = %u", (LPARAM) lpszFileToDelete);
/* Вызовите кв.;инф)прил.- определенного вручителя ошибки. */ ErrorHandler(tchMsgBuff); } еще { SendMessage(hListBox, LB_DELETESTRING, nBuffer[i], 0); } } SendMessage(hListBox, LB_SETCARETINDEX, 0, 0); }
возвращайтесь ВЕРНО; случай IDCANCEL: /* Уничтожьте диалог box. */ EndDialog(hDlg, TRUE); возвращайтесь ВЕРНО; умолчание: обратная ЛОЖЬ; } умолчание: обратная ЛОЖЬ; } }
|
|
|
|
| |