![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по чистому WINapi [D7, NT4, Win2k, WinXP]
Xion © (2007-07-19 11:29:00)Доброе время суток.
у меня вопрос как отресовать caption на окне если я заменил WNDProc ?
Xion (2007-07-24 14:12:00) [1][32] кто может разказать про стили ?
Xion (2007-07-23 19:48:00) [2]я толькочто заметил что у с Caption отрисовуется с XP темами и не отрисовуется с класическими. В чом может быть причина ?
Dib@zol (2007-07-20 19:06:00) [3]Для каждого системного оконного класса есть в SDK статейка "Default Message Processing". Это как понимаю и есть нужный хелп.
Xion (2007-07-20 19:00:00) [4]а как узнать что виполняет родной WNDPROC окна ? может какойто хелп есть
Dib@zol (2007-07-20 17:24:00) [5]ДыкЪ TThread за собой весь ВЦЛ и потянул!.. А в Classes'ах и где-то ещё помоему есть initialization, который обязателен к компилированию. Вывод: Ищи корень проблемы там, т.к.
> Наверняка какая нибудь побрякушка из VCL мешает правильной
> работе...
Xion (2007-07-20 17:08:00) [6]TThread я взял чтоб интерфейс нормальный был ну а само Окно же не VCL
Dib@zol (2007-07-20 16:49:00) [7]А поток типа TThread у нас что использует? Праально, VCL.
Xion (2007-07-20 16:46:00) [8][24] ето поток вобщето
DVM (2007-07-20 13:37:00) [9]
> у меня с VCL ничего нету тут только API
да ну?
Dib@zol (2007-07-20 12:46:00) [10]
> TThreadWindow.WNDProc
Точно?
Xion (2007-07-20 12:39:00) [11]у меня с VCL ничего нету тут только API
Dib@zol (2007-07-20 12:31:00) [12]Епт дык тыж её унаследовал уже, т.к. вызываешь CallWindowProc! Походу проблема в несовместимости VCL c API. Наверняка какая нибудь побрякушка из VCL мешает правильной работе... Лучше уж на чёмнить одном ваять, а то такой жуткий компот выходит ;)
Xion (2007-07-20 12:26:00) [13]Если я не могу переопредилить WNDProc то как мне ее унаследовать если у меня есть handle окна ?
Xion (2007-07-19 18:07:00) [14]да видно предложений нету больше
Xion (2007-07-19 17:41:00) [15]я тоже про ето думал но я решил попробывать и заремарел обработку WM_ERASEBKGND и оно себя точно так ведет (при создании окна дотого как я заменил WNDproc он отображает его а потом после смены активности затерает)
DVM (2007-07-19 17:24:00) [16]WM_ERASEBKGND
hdc = (HDC) wParam; // handle of device context
Parameters
hdc
Value of wParam. Identifies the device context.
Return Values
An application should return nonzero if it erases the background; otherwise, it should return zero.
DVM (2007-07-19 17:22:00) [17]Потом, результат обработки сообщения пушкин возвращать будет?
DVM (2007-07-19 17:19:00) [18]
> [13] если не всегода тогда когда
Если твоя новая оконная процедура рисует фон окна, то старую оконную процедуру для этого сообщения вызывать наверное не надо или старая оконная процедура затрет весь твой фон своим.
DVM (2007-07-19 17:18:00) [19]
> а окно содаётся потоком причом не обичним способом
Ну особенно ничего необычного здесь нет. Я вот только не пойму - если ты сам окно создаешь - зачем тебе заменять оконную процедуру
Xion (2007-07-19 17:11:00) [20][13] если не всегода тогда когда
а окно содаётся потоком причом не обичним способом
ClassRegistered := GetClassInfo(HInst, PChar(NameClass), TempClassInfo);
if not ClassRegistered then begin
WndClass.style := CS_GLOBALCLASS or CS_NOCLOSE or CS_SAVEBITS {or CS_DROPSHADOW};
WndClass.lpfnWndProc := @DefWindowProc;
WndClass.hInstance := HInst;
WndClass.hbrBackground := 0;
WndClass.lpszMenuName := '';
WndClass.lpszClassName := PChar(@A);
HA := Windows.RegisterClass(WndClass);
if HA = 0 then
RaiseLastOSError;;
end;
//Создание окна
if (fBoundRect.Right - fBoundRect.Left) = 0 then begin //Получаем координаты окна по умолчанию
R.Left := (GetSystemMetrics(SM_CXFULLSCREEN) - 350)div(2);
R.Top := (GetSystemMetrics(SM_CYFULLSCREEN) - 58)div(4);
R.Right := R.Left + 400;
R.Bottom := R.Top + 120;
fBoundRect := R;
end else
R := fBoundRect;
fWND := CreateWindowEx({WS_EX_TOOLWINDOW OR} {WS_EX_TOPMOST {or WS_EX_NOACTIVATE or} WS_EX_APPWINDOW {or WS_EX_LAYOUTRTL},
PChar(@A),
'Подождите',
{WS_POPUP or} WS_VISIBLE or WS_Caption or WS_DISABLED ,
R.Left, R.Top, Abs(R.Right-R.Left), Abs(R.Bottom-R.Top), 0, 0,
HInst,
nil);
if fWND=0 then
RaiseLastOSError;
Windows.GetWindowRect(fWND,fBoundRect);
if Assigned(Method) then begin
fHObj := MakeObjectInstance(Method);
fAdrPrevWNDProc := GetWindowLong(fWND,GWL_WNDPROC);
Windows.SetWindowLong(fWnd,GWL_WNDPROC,Integer(fHObj));
InvalidateRect(fWnd,nil,true);
end;