IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> общие вопросы по WINAPI
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


function windowproc(wnd:hwnd; msg,wparam,lparam:LongInt):LongInt; stdcall;
begin
case msg of
WM_DESTROY: begin
PostQuitMessage(0);
Result:=0;
exit;
end;
end;
Result:=DefWindowProc(wnd,msg,wparam,lparam)
end;
Вот простая оконная процедура, которая реагирует на выход. Зачем нужно
Result:=0;
и сразу после этого EXIT и после case
Result:=DefWindowProc(wnd,msg,wparam,lparam)
?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ты ловишь нужное тебе сообщение, и обрабатываешь его. После этого надо выйти из обработчика, так? Вот и возвращается 0, чтобы показать, что сообщение уже обработано. А если поступило сообщение, которое ты НЕ предусмотрел (или не хочешь обрабатывать), то вызывается DefWindowProc - дефолтный обработчик сообщений окна. Именно в нем стандартно обрабатываются все изменения размеров окна, минимизация/максимизация, перетаскивание окна по десктопу, и т.д... Если будешь обрабатывать ВСЕ без исключения сообщения Windows, связанные с твоим окном - с ума сойдешь, их сотни, если не тысячи smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Result:=DefWindowProc(wnd,msg,wparam,lparam)
Без нее даже не запустилась программа smile.gif
hIcon:=loadicon (0, IDI_APPLICATION);
hCursor:=loadcursor(0, IDC_ARROW);
А как загрузить другой курсор и иконку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Без нее даже не запустилась программа
Потому что WM_CREATE и WM_PAINT остались необработанными smile.gif

Цитата
А как загрузить другой курсор и иконку?
Добавить к проекту RC-файл, в нем описАть иконку:
101 ICON "Icon.ico"
, и подключить ее:

const
IDI_MyOwnIcon = 101; // <--- должно совпадать с ID в файле ресурсов

...
hIcon := LoadIcon(GetModuleHandle(nil), MAKEINTRESOURCE(IDI_MyOwnIcon));
То же самое - с курсором...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


а как добавить этот файл? PROJECT- add... ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Если он у тебя уже есть, то добавить можно через Project->Add. Если нет - то создай (через Windows Explorer) пустой файл в папке с проектом (с расширением RC), и добавляй его...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


создал файл и через блокнот в него добавил
101 ICON "Icon.ico"
Призапуске ругается на эту строчку


Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






А файл с иконкой (тот самый Icon.ico) где? Ты же хочешь свою иконку, а не стандартную, значит, она должна у тебя быть.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Списибо!
курсор получился)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Вот я создал меню с пунктами и при нажатии на них выскакивает сообщение. А как при выборе пункта меню осуществить нажатие другого пункта? или вообще кнопки (что-то вроде Button2.click(sender))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
А как при выборе пункта меню осуществить нажатие другого пункта?
Не понял. Что, вместо одного пункта заставить программу думать, что был нажат другой? Тогда просто пошли (SendMessage) ID второго пункта окну. Когда окно его получит, тогда и обработает.

С кнопкой - аналогично, посылай ее ID (когда создаешь кнопку через CreateWindowEx, третий от конца параметр - это и есть её ID) своему же окну. Только зачем тебе это - непонятно. Не проще нажать на кнопку?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


У SendMessage же 4 параметра - hwnd, msg, и 2 параметра. Как тут быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






SendMessage(hWnd, WM_COMMAND, btnID, 0);

как раз 4, почему у тебя этот вопрос возник?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
почему у тебя этот вопрос возник?
я думал надо
SendMessage(btn,?,0,0);
и команду не знал.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


по поводу сабклассинга я не понял как работают функции SetWindowLong, CallWindowProc, GetWindowLong.
Цитата
Для вызова оконной процедуры по её адресу используется функция CallWindowProc
Цитата
SetWindowLong. Вообще, эта функция предназначена для изменения определённого атрибута окна
С вингарда.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Что непонятно с этими функциями? Ну, устанавливает она атрибут окна, это все, что тебе надо о ней знать. Как работает CreateWindow или GetDC тебе понятно? Оно тебе не надо на данном этапе.

Вот описание второй функции по-русски: Функция SetWindowLong, а CallWindowProc просто вызывает оконную функцию, передаваемую ей в первом параметре. Зачем это нужно? Ну, допустим, ты написал свою процедуру обработки тех сообщений, которые тебе нужны, обработал их. А что дальше? Те, которые НЕ обрабатываются твоей процедурой, что, будут потеряны? Нет, ты просто берешь адрес старой (настоящей, неподмененной) оконной процедуры того окна, которое сабклассируешь, и вызываешь ее.

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

Подобная техника применяется при написании обработчиков прерываний (никогда не делал? smile.gif ) - пишешь свой обработчик, скажем, таймера, выполняешь что-то свое, а потом вызываешь прежний, системный обработчик...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


{ Модифицированная оконная процедура поля ввода }
function EditWinProc(hWnd: HWND; uMsg: UINT;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case uMsg of
{ Запрещаем показ контекстного меню }
WM_CONTEXTMENU:
begin
Result := 0;
MessageBeep(0);
Exit; // тут выходим из всей процедуры или из case?
end;
end;
{ Не забываем вызвать оригинальную оконную процедуру }
Result := CallWindowProc(Pointer(GetWindowLong(hWnd, GWL_USERDATA)),
hWnd, uMsg, wParam, lParam);
end;
{Модифицированная оконная процедура кнопки }
function BtnWinProc(hWnd: HWND; uMsg: UINT;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case uMsg of
{ При нажатии мыши запускаем таймер, интервал - 10 миллисекунд }
WM_LBUTTONDOWN: SetTimer(hWnd, BtnTimer, 10, @BtnTimerProc);

{ При отпускании мыши уничтожаем таймер }
WM_LBUTTONUP:
begin
KillTimer(hWnd, BtnTimer);
{ Восстанавливаем прежний текст }
SetWindowText(hWnd, BtnText);
end;
end;
{ Не забываем вызвать оригинальную оконную процедуру }
Result := CallWindowProc(Pointer(GetWindowLong(hWnd, GWL_USERDATA)),
hWnd, uMsg, wParam, lParam);
end;
В 1 функции - если произошло нужное событие, то выполняем что надо и EXit- выход из функции. А во 2 функции, если в оригинальной оконной процедуре есть обработчик WM_LBUTTONDOWN то выполнится работа с таймером а потом и другое? Тут EXIT'а нету wacko.gif

Добавлено через 4 мин.
Цитата
Как работает CreateWindow или GetDC тебе понятно?
С помощью CreateWindow нашел как создавать окно, кнопку, edit, label. Чекбокс и радио еще в процессе smile.gif
Цитата
никогда не делал?
нет (еще нет smile.gif )

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата
А во 2 функции, если в оригинальной оконной процедуре есть обработчик WM_LBUTTONDOWN то выполнится работа с таймером а потом и другое?
Ну, раз ты написал БЕЗ Exit-а, значит, да. И твоя функция отследит события, и потом еще передаст их в оригинальную функцию окна. А что тебя так удивляет? Ты же пишешь модифицированную функцию, может тебе не надо ничего менять, только ДОБАВИТЬ кое-что к существующему обработчику. Вот и добавляешь. А события пропускаешь дальше, пускай их оригинальная функция обрабатывает, у нее это лучше получится smile.gif ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Спасибо,понял. Теперь можно и спать идти smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Привет
По поводу суперклассинга - берем уже имеющийся класс, меняем его, указав новую процедуру, регистрируем класс и создаем окна нового класса. При выходе удаляем класс. Правильно понял?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.10.2020 7:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name