2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Небольшой вопрос по MFC
Сообщение18.08.2008, 10:45 


25/03/08
43
Небольшой вопрос, по основам MFC.

Почему-то перерыл много сайтов, но не смог найти

Я создал кнопки функцией CreateWindow, а в какой функции можно обработать нажатие мышкой на эти кнопки?

В WinApi это обрабатывалось в функции OnCommand, а как в MFC непонятно.

Спасибо.

 Профиль  
                  
 
 
Сообщение18.08.2008, 16:49 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
В карте сообщений родительского окна функцию-обработчик назначает макрос ON_BN_CLICKED

Добавлено спустя 1 минуту 3 секунды:

Но в принципе использование MFC совершенно не препятствует использованию всех возможностей WinAPI.

 Профиль  
                  
 
 
Сообщение19.08.2008, 10:16 


25/03/08
43
Да, спасибо, но там надо в параметрах писать ON_BN_CLICKED(id, Function)

Вот что такое id - непонятно.

 Профиль  
                  
 
 Вопрос по MFC побольше
Сообщение19.08.2008, 12:23 


25/03/08
43
Вот хотелось бы узнать можно ли реализовать на MFC такую вещь.

Делаю приложение под PocketPC. Внизу bottom_bar реализуется через класс CCommandBar.
При нажатии на кнопку CommandBar начинается некоторый процесс и необходимо, чтобы CommandBar менялся на другой, с кнопкой Cancel, а по завершению процесса автоматически менялся обратно. При нажатии Cancel, соответственно, процесс отменяется и CommandBar также меняется на начальный.

Я так понимаю тут необходимо использовать несколько потоков, но в другом потоке у меня никак не получается обработать удаление и отрисовку заново CommandBar'a, где-то прочитал что не получится обработать методы этого класса в другом потоке. Можно ли это как-нибудь реализовать, может вообще с другой стороны как-то подойти?

 Профиль  
                  
 
 
Сообщение19.08.2008, 15:24 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
id - это идентификатор кнопки (целое число), который Вы присвоили ей, когда создавали функцией Create. Когда происходит клик по кнопке, то она посылает своему родительскому окну сообщение, передавая в нем свой идентификатор. По нему оконная функция родительского окна определяет, какую функцию вызвать. Будет вызвана функция Functuin.

 Профиль  
                  
 
 
Сообщение19.08.2008, 15:33 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Да, здесь нужен другой поток. Я бы реализовал это одним из следующих двух способов.

1. При нажатии на кнопку создается новый поток, который начинает решать поставленную задачу. Если задача завершается, то поток должен послать окну сообщение об успешном завершении, обработка которого заключается в возвращении кнопки к первоначальному виду. Если же происходит нажатие на кнопку Cancel, то оконная функция принудительно завершает поток.

Недостаток этого метода заключается в принудительном завершении потока, что чревато утечками памяти и других ресурсов, которые возможно занимает процедура. Если хочется завершить поток корректно, то можно сделать внутри него периодическую проверку некоторого флага, который выставляется, если поток нужно прервать.

По завершении своей работы поток посылает окну сообщение о том, что работа успешно завершена.

 Профиль  
                  
 
 
Сообщение19.08.2008, 22:16 
Модератор
Аватара пользователя


11/01/06
5660
 !  kdm, предупреждение за дублирование тем. Начали обсуждать MFC в одной теме - там и продолжайте.

 Профиль  
                  
 
 
Сообщение19.08.2008, 23:27 


25/03/08
43
//темы созданы в разное время, и вопросы АБСОЛЮТНО разные.

//как теперь различать ответы непонятно, т.к. говорить сразу о двух вопросах в одной теме сложно.

//ок, модератор всегда прав.

так вот проблема в том, что я кнопки создал не как класс CButton или CBitmapButton, а как APIшный элемент CreateWindow - там вроде бы ID кнопки в параметрах нету, поэтому и возникает проблема с обработкой нажатия на неё.

 Профиль  
                  
 
 
Сообщение20.08.2008, 00:25 
Заслуженный участник


15/05/05
3445
USA
kdm писал(а):
так вот проблема в том, что я кнопки создал не как класс CButton или CBitmapButton, а как APIшный элемент CreateWindow - там вроде бы ID кнопки в параметрах нету, поэтому и возникает проблема с обработкой нажатия на неё.
Если Вы создали кнопку не через MFC, то и вопрос Ваш к MFC не имеет отношения.
Как программировать в чистом WinAPI описано, например, в старых книгах Петцольда. Например, у каждого окна есть hWnd, возвращаемый CreateWindow.

 Профиль  
                  
 
 
Сообщение20.08.2008, 08:35 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
kdm в сообщении #139642 писал(а):
так вот проблема в том, что я кнопки создал не как класс CButton или CBitmapButton, а как APIшный элемент CreateWindow - там вроде бы ID кнопки в параметрах нету, поэтому и возникает проблема с обработкой нажатия на неё.


Это параметр

HMENU hMenu

почитайте его описание в MSDN

Добавлено спустя 4 минуты 4 секунды:

http://msdn.microsoft.com/en-us/library/ms632679.aspx

 Профиль  
                  
 
 
Сообщение20.08.2008, 12:14 


25/03/08
43
Спасибо, понял.

Попробовал сделать, как Вы сказали, но не хочет он заходить в эту функцию

Так создается окно:
Код:
#define IDB_m_hButtonSrcCut 123

...
Код:
m_hButtonSrcCut   = CreateWindow(TEXT("button"),0,BS_NOTIFY | WS_VISIBLE | WS_CHILD | BS_OWNERDRAW,  rc.left,rc.top,rc.right,rc.bottom,GetSafeHwnd(),(HMENU)IDB_m_hButtonSrcCut,hinstance,0);


А так я пытаюсь обработать сообщение нажатия:
Код:
ON_BN_CLICKED(IDB_m_hButtonSrcCut, CChildView::OnCut)


Попытался упростить и сделать кнопки через CBitmapButton, но мне необходимо, чтобы при нажатии кнопка меняла изображение пока кнопка нажата, а при использовании CBitmapButton, оно меняется почему-то на мгновение и сразу возвращается к исходному(приложение под Pocket PC). Используя CreateWindow отрисовку получается отработать в OnDrawItem, а вот нажатие пока непонятно как.

Сейчас специально проверил CBitmapButtob в приложении под Windows. Там все отлично - пока кнопка нажата - BITMAP висит соответсвующий, а в приложении под PocketPC сразу исчезает. Непонятно абсолютно.

 Профиль  
                  
 
 
Сообщение20.08.2008, 12:54 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Попробуйте добавить стиль BS_PUSHBUTTON

В функции какого именно окна вызывается CreateWindow? Именно оно является родительским для кнопки и получает уведомления о нажатии. Может быть, Вы вставили ON_BN_CLICKED в карту сообщений другого окна? Зачем в карте сообщений указывать CChildView:: я так никогда не делаю, попробуйте просто

Код:
ON_BN_CLICKED(IDB_m_hButtonSrcCut, OnCut)


Добавлено спустя 1 минуту 10 секунд:

Про PocketPC ничего сказать не могу, никогда не работал.

 Профиль  
                  
 
 
Сообщение21.08.2008, 16:18 


25/03/08
43
Спасибо большое, разобрался.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group