Вопрос № 30781: Опять я с кнопками. Проблема заключается в том, как мне узнать от какого контрола поступило сообщение WM_COMMAND. Например у меня две кнопки, я хочу чтобы при нажатии на одну из них выводилось одно сообщение, а ну другую соответсвенно другое. Какое м...
Вопрос № 30.781
Опять я с кнопками. Проблема заключается в том, как мне узнать от какого контрола поступило сообщение WM_COMMAND. Например у меня две кнопки, я хочу чтобы при нажатии на одну из них выводилось одно сообщение, а ну другую соответсвенно другое. Какое мне нужно условие поставить, чтобы понять что делать, или есть какие-то другие способы ?
Код оконный процедуры в приложении.
Приложение:
Отправлен: 04.12.2005, 21:02
Вопрос задал: RedDevil (статус: 2-ой класс)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: azat
Здравствуйте, RedDevil!
В самом начале добавьте, например:
#define IDButton1 1000
#define IDButton2 1030
Когда создается кнопка в параметре HMENU нужно написать IDButton1.
Т.е.
hwndButton = CreateWindow("button","Button 1", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 5,5,100,30,hwnd,(HMENU) IDButton1, NULL, NULL);
Для второй кнопки соответственно IDButton2.
В обработчике сообщений будет слудующее:
case WM_COMMAND:
switch(wParam)
{
case IDButton1:
MessageBox(NULL,"Button №1","Info", MB_OK);
case IDButton2:
MessageBox(NULL,"Button №2","Info", MB_OK);
};
И Всё.
Вообще, Вам лучше найти какую-либо книгу и читать...
Могу порекомендовать: Р.М.Ганеева "Проектирование интерфейса пользователя средствами WIN32 API". К сожалению, ссылки незнаю...
Удачи.
Ответ отправил: azat (статус: 5-ый класс)
Отправлен: 04.12.2005, 21:28
Ответ отправил: estiGi (статус: 8-ой класс)
Отправлен: 04.12.2005, 22:27
Отвечает: Raptor1
Здравствуйте, RedDevil!
Функция CreateWindow имеет такой формат,
HWND CreateWindow(
LPCTSTR lpClassName, // registered class name
LPCTSTR lpWindowName, // window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // menu handle or child identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // window-creation data
);
но если окно является элементом управления, то параметр hMenu содержит идентификатор элемента управления, вот что по этому поводу говорится в MSDN:
hMenu
[in] Handle to a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window
Т.е. тебе надо при создании кнопок указать в этом параметре уникальный идентификатор и потом пользоваться следующей конструкцией
case WM_COMMAND:
{
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_BUTTON1: {break;}
case IDC_BUTTON2: {break;}
}
}
}
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 04.12.2005, 23:40
Отвечает: Jadd
Здравствуйте, RedDevil!
WM_COMMAND - очень многогранное сообщение. Тут нужно внимательно читать MSDN. Ну ок. Давайте разбираться. Сначала посмотрим на wParam. HIWORD(wParam) вернет код события, если послано сообщение контролом. В нашем случае BN_CLICKED. Оно-то нам и нужно. Дальше. LOWORD(wParam) вернет идентификатор контрола. lParam вернет хэндл контрола. Каким способом Вам удобнее удостовериться какая именно кноба была кликнута?
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 04.12.2005, 23:45