сабклассинг стандартной кнопки
От: sfates  
Дата: 18.10.05 09:41
Оценка:
Господа, есть следующий код, который работает отлично:

HANDLE az;
WNDPROC fOldProc = NULL;
//---------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------
LRESULT WINAPI StartProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT aa;
aa = ::CallWindowProc((FARPROC)fOldProc,hwnd, uMsg, wParam, lParam);

if(uMsg ==WM_LBUTTONDOWN)MessageBox(NULL,"aa","asas",MB_OK);

return aa;
}

//------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
az = ::CreateWindow("BUTTON","my",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,30,30,70,70,Form1->Handle,NULL,HInstance,NULL);
SetWindowLong(az,GWL_ID,555);
fOldProc = (WNDPROC)SetWindowLong(az, GWL_WNDPROC,(LONG)StartProc);
}

Но если в оконной процедуре кнопки сделать так

LRESULT WINAPI StartProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT aa;
if(uMsg ==WM_LBUTTONDOWN)MessageBox(NULL,"aa","asas",MB_OK);

aa = ::CallWindowProc((FARPROC)fOldProc,hwnd, uMsg, wParam, lParam);

return aa;
}

то возникает глюк, который заключается в том, что в дальнейшем все сообщения от окон данного потока идут на кнопку, и соответственно, на каком бы окошке потока не щелкнул мышой левой кнопкой — вылазит MessageBox.
Кто-нить может объяснить почему так происходит?
Re: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 09:47
Оценка:
Здравствуйте, sfates, Вы писали:

S>то возникает глюк, который заключается в том, что в дальнейшем все сообщения от окон данного потока идут на кнопку, и соответственно, на каком бы окошке потока не щелкнул мышой левой кнопкой — вылазит MessageBox.

S>Кто-нить может объяснить почему так происходит?

Очевидно какой-то глюк с Mouse Capture.

Можно
1. Не использовать стандартную кнопку, а рисовать самому.
2. В Дельфи/Билдере нотификации автоматически отражаются, т.е. можно попытаться обрабатывать не WM_LBUTTONDOWN а что-то вроде CN_CLICKED или как его там.
3. Попытаться пофиксить поведение захвата мыши.
Re[2]: сабклассинг стандартной кнопки
От: sfates  
Дата: 18.10.05 10:10
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Очевидно какой-то глюк с Mouse Capture.


это понятно, просто сам факт того что MessageBox так убивает — это странно, такого не должно же быть....


Кё>Можно

Кё>1. Не использовать стандартную кнопку, а рисовать самому.
Кё>2. В Дельфи/Билдере нотификации автоматически отражаются, т.е. можно попытаться обрабатывать не WM_LBUTTONDOWN а что-то вроде CN_CLICKED или как его там.
Кё>3. Попытаться пофиксить поведение захвата мыши.

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

Мож все-таки кто-нить знает причину????

Самое прикольное, что если также поступить с Builder-овской кнопкой (TButton) или VC++ (CButton), то получается то же самое, хотя они-то не используют стандартные кнопки, а сами рисуют....
Re[3]: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 10:21
Оценка:
Здравствуйте, sfates, Вы писали:

S>Самое прикольное, что если также поступить с Builder-овской кнопкой (TButton) или VC++ (CButton), то получается то же самое, хотя они-то не используют стандартные кнопки, а сами рисуют....


Они оба используют стандартную кнопку.
Re[4]: сабклассинг стандартной кнопки
От: sfates  
Дата: 18.10.05 10:57
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Они оба используют стандартную кнопку


Как так? Ведь если посмотреть, то они имеют классы окон CButton и TButton, и просто button-ом там и не пахнет? Я ошибаюсь?
Re[5]: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 11:01
Оценка:
Здравствуйте, sfates, Вы писали:

Кё>>Они оба используют стандартную кнопку


S>Как так? Ведь если посмотреть, то они имеют классы окон CButton и TButton, и просто button-ом там и не пахнет? Я ошибаюсь?


Они просто подменили имя класса окна, либо исопльзуют свой класс, но стандартную оконную процедуру (кнопки).
Re[4]: сабклассинг стандартной кнопки
От: GU Glez  
Дата: 18.10.05 11:03
Оценка:
Здравствуйте, Кодёнок, Вы писали:
[skip]
Кё>Они оба используют стандартную кнопку.
Не факт. Delphi/Builder 1..6 — все время рисовали через DrawFrameControl()
С уважением,
GU Glez [Джи Ю Глиз]
Re[5]: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 11:11
Оценка: 1 (1)
Здравствуйте, GU Glez, Вы писали:

Кё>>Они оба используют стандартную кнопку.

GG>Не факт. Delphi/Builder 1..6 — все время рисовали через DrawFrameControl()

Это они TBitBtn рисовали, а TButton нет. Ничего кроме куска исходника VCL опровержением не считаю
Re[6]: сабклассинг стандартной кнопки
От: sfates  
Дата: 18.10.05 11:14
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>Они просто подменили имя класса окна, либо исопльзуют свой класс, но стандартную оконную процедуру (кнопки).


А исходя из чего сделаны данные выводы? И я не поиню ф-цию, которая подменяет имя класса окна.....
Re[7]: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 11:23
Оценка:
Здравствуйте, sfates, Вы писали:

Кё>>Они просто подменили имя класса окна, либо исопльзуют свой класс, но стандартную оконную процедуру (кнопки).


S>А исходя из чего сделаны данные выводы? И я не поиню ф-цию, которая подменяет имя класса окна.....


Исходя из копания в исходниках VCL давным-давно, с наивным желанием слегка модифицировать TButton под свои нужды Это верно для Delphi 3..7.
Re[8]: сабклассинг стандартной кнопки
От: sfates  
Дата: 18.10.05 11:26
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Исходя из копания в исходниках VCL давным-давно, с наивным желанием слегка модифицировать TButton под свои нужды Это верно для Delphi 3..7.


Ну и интрига.... я думал у них все по-честному , ну а все-таки ф-цию, которая подменяет имя класса окна не помните случаем, мож пригодиться......
Re[9]: сабклассинг стандартной кнопки
От: Кодёнок  
Дата: 18.10.05 11:32
Оценка:
Здравствуйте, sfates, Вы писали:

Кё>>Исходя из копания в исходниках VCL давным-давно, с наивным желанием слегка модифицировать TButton под свои нужды Это верно для Delphi 3..7.


S>Ну и интрига.... я думал у них все по-честному , ну а все-таки ф-цию, которая подменяет имя класса окна не помните случаем, мож пригодиться......


Я тоже не знаю такой Скорее всего и нет. Они зарегистрировали класс TButton, а в вместо DefWindowProc используют процедуру класса Button.
Re[6]: сабклассинг стандартной кнопки
От: GU Glez  
Дата: 18.10.05 11:33
Оценка:
Здравствуйте, Кодёнок, Вы писали:
Кё>Это они TBitBtn рисовали, а TButton нет. Ничего кроме куска исходника VCL опровержением не считаю
+1
Имелось ввиду про TBitBtn, а TButton — рисуют вызовом CallWindowProc(WNDPROC_OF_BUTTON_CLASS, ...) . Исходников VCL нет — не пользуемся.
С уважением,
GU Glez [Джи Ю Глиз]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.