сабклассинг стандартной кнопки
От: 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.
Кто-нить может объяснить почему так происходит?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.