![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Client |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
function windowproc(wnd:hwnd; msg,wparam,lparam:LongInt):LongInt; stdcall;Вот простая оконная процедура, которая реагирует на выход. Зачем нужно Result:=0;и сразу после этого EXIT и после case Result:=DefWindowProc(wnd,msg,wparam,lparam)? |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ты ловишь нужное тебе сообщение, и обрабатываешь его. После этого надо выйти из обработчика, так? Вот и возвращается 0, чтобы показать, что сообщение уже обработано. А если поступило сообщение, которое ты НЕ предусмотрел (или не хочешь обрабатывать), то вызывается DefWindowProc - дефолтный обработчик сообщений окна. Именно в нем стандартно обрабатываются все изменения размеров окна, минимизация/максимизация, перетаскивание окна по десктопу, и т.д... Если будешь обрабатывать ВСЕ без исключения сообщения Windows, связанные с твоим окном - с ума сойдешь, их сотни, если не тысячи
![]() |
Client |
![]()
Сообщение
#3
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Result:=DefWindowProc(wnd,msg,wparam,lparam)Без нее даже не запустилась программа ![]() hIcon:=loadicon (0, IDI_APPLICATION);А как загрузить другой курсор и иконку? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Без нее даже не запустилась программа Потому что WM_CREATE и WM_PAINT остались необработанными ![]() Цитата А как загрузить другой курсор и иконку? Добавить к проекту RC-файл, в нем описАть иконку:101 ICON "Icon.ico" constТо же самое - с курсором... |
Client |
![]()
Сообщение
#5
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
а как добавить этот файл? PROJECT- add... ?
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Если он у тебя уже есть, то добавить можно через Project->Add. Если нет - то создай (через Windows Explorer) пустой файл в папке с проектом (с расширением RC), и добавляй его...
|
Client |
![]()
Сообщение
#7
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
создал файл и через блокнот в него добавил
101 ICON "Icon.ico"Призапуске ругается на эту строчку Эскизы прикрепленных изображений ![]() ![]() |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
А файл с иконкой (тот самый Icon.ico) где? Ты же хочешь свою иконку, а не стандартную, значит, она должна у тебя быть.
|
Client |
![]()
Сообщение
#9
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Списибо!
курсор получился) |
Client |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Вот я создал меню с пунктами и при нажатии на них выскакивает сообщение. А как при выборе пункта меню осуществить нажатие другого пункта? или вообще кнопки (что-то вроде Button2.click(sender))
|
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата А как при выборе пункта меню осуществить нажатие другого пункта? Не понял. Что, вместо одного пункта заставить программу думать, что был нажат другой? Тогда просто пошли (SendMessage) ID второго пункта окну. Когда окно его получит, тогда и обработает.С кнопкой - аналогично, посылай ее ID (когда создаешь кнопку через CreateWindowEx, третий от конца параметр - это и есть её ID) своему же окну. Только зачем тебе это - непонятно. Не проще нажать на кнопку? |
Client |
![]()
Сообщение
#12
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
У SendMessage же 4 параметра - hwnd, msg, и 2 параметра. Как тут быть?
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
SendMessage(hWnd, WM_COMMAND, btnID, 0); как раз 4, почему у тебя этот вопрос возник? |
Client |
![]()
Сообщение
#14
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Цитата почему у тебя этот вопрос возник? я думал надо
SendMessage(btn,?,0,0);и команду не знал. |
Client |
![]()
Сообщение
#15
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
по поводу сабклассинга я не понял как работают функции SetWindowLong, CallWindowProc, GetWindowLong.
Цитата Для вызова оконной процедуры по её адресу используется функция CallWindowProc Цитата SetWindowLong. Вообще, эта функция предназначена для изменения определённого атрибута окна С вингарда. |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Что непонятно с этими функциями? Ну, устанавливает она атрибут окна, это все, что тебе надо о ней знать. Как работает CreateWindow или GetDC тебе понятно? Оно тебе не надо на данном этапе.
Вот описание второй функции по-русски: Функция SetWindowLong, а CallWindowProc просто вызывает оконную функцию, передаваемую ей в первом параметре. Зачем это нужно? Ну, допустим, ты написал свою процедуру обработки тех сообщений, которые тебе нужны, обработал их. А что дальше? Те, которые НЕ обрабатываются твоей процедурой, что, будут потеряны? Нет, ты просто берешь адрес старой (настоящей, неподмененной) оконной процедуры того окна, которое сабклассируешь, и вызываешь ее. Помнишь, что произошло, когда ты не вызвал DefWindowProc для своего окна? Вот примерно то же самое будет, если не вызвать старую процедуру сабклассированного окна. Ты-то перехватил все, что тебе надо было, а мало ли что окно еще обрабатывает... Вот и пусть обрабатывает само, тебе-то это зачем? Подобная техника применяется при написании обработчиков прерываний (никогда не делал? ![]() |
Client |
![]()
Сообщение
#17
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
{ Модифицированная оконная процедура поля ввода } {Модифицированная оконная процедура кнопки }В 1 функции - если произошло нужное событие, то выполняем что надо и EXit- выход из функции. А во 2 функции, если в оригинальной оконной процедуре есть обработчик WM_LBUTTONDOWN то выполнится работа с таймером а потом и другое? Тут EXIT'а нету ![]() Добавлено через 4 мин. Цитата Как работает CreateWindow или GetDC тебе понятно? С помощью CreateWindow нашел как создавать окно, кнопку, edit, label. Чекбокс и радио еще в процессе ![]() Цитата никогда не делал? нет (еще нет ![]() Сообщение отредактировано: Client - 25.08.2009 22:13 |
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Цитата А во 2 функции, если в оригинальной оконной процедуре есть обработчик WM_LBUTTONDOWN то выполнится работа с таймером а потом и другое? Ну, раз ты написал БЕЗ Exit-а, значит, да. И твоя функция отследит события, и потом еще передаст их в оригинальную функцию окна. А что тебя так удивляет? Ты же пишешь модифицированную функцию, может тебе не надо ничего менять, только ДОБАВИТЬ кое-что к существующему обработчику. Вот и добавляешь. А события пропускаешь дальше, пускай их оригинальная функция обрабатывает, у нее это лучше получится ![]() |
Client |
![]()
Сообщение
#19
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Спасибо,понял. Теперь можно и спать идти
![]() |
Client |
![]()
Сообщение
#20
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Привет
По поводу суперклассинга - берем уже имеющийся класс, меняем его, указав новую процедуру, регистрируем класс и создаем окна нового класса. При выходе удаляем класс. Правильно понял? |
![]() ![]() |
![]() |
Текстовая версия | 8.07.2025 10:32 |