Как сделать так, чтобы элемент управления listbox, расположенный в немодальном диалоговом окне, реагировал на нажатия клавиш.
Я бы просто хотел, чтобы элемент управления ListBox, расположенный в Немодальном диалоговом окне, реагировал на нажатия клавиш. например: сначала нужно нажать на элемент в списке, а затем нажать клавишу Delete, чтобы удалить его из списка.
Я обнаружил, что пустое диалоговое окно отвечает через WM_KEYDOWN. Но когда я помещаю список в диалог. Тот же WM_KEYDOWN не обрабатывается. Затем я прочитал, что фокус установлен на элемент управления в диалоговом окне. Затем я натыкаюсь на WM_GETDLGCODE и считаю, что это ключ к решению моей проблемы. Но я так и не смог этого понять.
Я тоже буду продолжать читать.
-Скотт
Что я уже пробовал:
#include <windows.h> #include <shobjidl.h> #include <string> #include <fstream> #include <stdio.h> #include "resource.h" #include <sstream> using namespace std; // Dialog handle HWND ghListDlg = 0; // Combobox dialog window procedure BOOL CALLBACK listDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { // Text buffer to be filled with string user entered into edit control wchar_t msgText[256] = L""; // Handles to the combo box controls static HWND hListBox = 0; static HWND hEditBox = 0; static HWND hAddButton = 0; int index = 0; switch (msg) { case WM_GETDLGCODE: MessageBox(0, L"WM_GETDLGCODE recieved", L"ListBox Message", MB_OK); return DLGC_WANTALLKEYS; case WM_ACTIVATE: if (0 == wParam) // becoming inactive { } else // becoming active { ghListDlg = hDlg; } return true; case WM_INITDIALOG: // Controls are child windows to the dialog they lie on. In order to get and send information to and from a control // we will need a handle to it. So save a handle to the controls as the dialog is being initialized. // Recall that we get a handle to a child control on a dialog box with the GetDlgItem hListBox = GetDlgItem(hDlg, IDC_LISTBOX); hEditBox = GetDlgItem(hDlg, IDC_EDIT_MSG); hAddButton = GetDlgItem(hDlg, IDC_ADDBUTTON); return true; case WM_COMMAND: switch (HIWORD(wParam)) { //User selected a combo box item case LBN_SELCHANGE: index = SendMessage(hListBox, LB_GETCURSEL, 0, 0); SendMessage(hListBox, LB_GETTEXT, (WPARAM)index, (LPARAM)msgText); MessageBox(0, msgText, L"ListBox Message", MB_OK); return true; } switch (LOWORD(wParam)) { // User pressed the "Add" button case IDC_ADDBUTTON: // Get the text from the edit box GetWindowText(hEditBox, msgText, 256); // Add the text to the combo box only if the user entered a string greater than zero if (wcslen(msgText) > 0) SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)msgText); return true; } return true; case WM_CLOSE: DestroyWindow(hDlg); return true; case WM_DESTROY: PostQuitMessage(0); return true; } return false; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR cmdLine, int showCmd) { // Create the modeless dialog window. This program is a pure dialog window application, and the //dialog window application, and the dialog window is the "main" window. // Create the modless dialog window ghListDlg = CreateDialog( hInstance, // Application instance MAKEINTRESOURCE(IDD_LISTDLG), // Dialog resource ID 0, // Parent window--null for no parent listDlgProc); // Dialog window procedure // Show the list button dialog ShowWindow(ghListDlg, showCmd); // Enter the message loop MSG msg; ZeroMemory(&msg, sizeof(MSG)); while (GetMessage(&msg, NULL, 0, 0)) { if (NULL == ghListDlg || !IsDialogMessage(ghListDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; }