2008-12-16 6 views
1

Я говорю о настольном приложении Windows. Я хочу написать такую ​​функцию, как SelectObject (например), которая блокирует вызывающего абонента, пока пользователь не нажмет на объект в клиентской области приложения. Как только пользователь выбрал объект, функция возвращает указатель на него.Вторичное сообщение Loop vs Separate Thread Thread

Один из способов сделать это - запустить небольшой цикл сообщений и отфильтровать WM_MOUSE*, передавая другие сообщения обратно в контур внешнего сообщения. (CRectTracker делает это я думаю.)

Это также может быть изменено для запуска вызывающего абонента в отдельном потоке его собственного. SelectObject будет использовать CreateEvent/SetEvent/ResetEvent для синхронизации с основным потоком, который обрабатывает сообщения мыши и возвращает управление после выполнения условий, удовлетворяющих выбору объекта.

Каковы плюсы и минусы каждого подхода? Где я могу найти дополнительную информацию о таких проектах? Каковы формальные условия для таких вещей?

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

ответ

1

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

Я думаю, что ваша идея потока просто усложнится для небольшой выгоды. Сообщения для базового окна по-прежнему будут поступать в поток этого окна, а не в отдельный поток, и любая картина, которую вы делаете в этом окне, должна появиться и в потоке этого окна.

Знаете ли вы, что SetCapture? Я думаю, что было бы полезно получить то, куда вы пытаетесь пойти. Это позволяет вам перетаскивать все события мыши в одно окно, даже если мышь не находится над этим окном.

-1

Модаль не имеет смысла в Win32. SelectObject полностью не по теме (GDI)

+0

Пожалуйста, внимательно прочитайте вопрос. Я не говорю о функции SelectObject GDI. – 2010-08-12 11:19:29