Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 177
от 09.12.2005, 21:03

Администратор:Калашников О.А.
В рассылке:Подписчиков: 265, Экспертов: 25
В номере:Вопросов: 1, Ответов: 4


Вопрос № 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
Здравствуйте, RedDevil!

#define IDC_BUTTON1 WM_APP + 1
#define IDC_BUTTON2 WM_APP + 2
...
LRESULT CALLBACK WndProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
hwndButton = CreateWindow("BUTTON","Button 1",
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 5,5,100,30,hDlg,
IDC_BUTTON1, hInst, NULL);
hwndButton2 = CreateWindow("BUTTON","Button 2",
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 200,5,300,30,hDlg,
IDC_BUTTON2, hInst, NULL);
return TRUE;

case WM_COMMAND:
switch (LOWORD (wParam)) {
case IDC_BUTTON1:
//была нажата 1-ая кнопка
break;
case IDC_BUTTON2:
//была нажата 2-ая кнопка
break;
}
break;
}
return DefWindowProc (hDlg, message, wParam, lParam) ;
}
Ответ отправил: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.winapifaq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное