Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизВопрос по чистому WINapi Найти похожие ветки
← →
Xion © (2007-07-19 11:29) [0]Доброе время суток.
у меня вопрос как отресовать caption на окне если я заменил WNDProc ?
← →
DVM © (2007-07-19 15:45) [1]Что понимается под caption - весь заголовок окна или надпись на заголовке окна?
← →
Xion © (2007-07-19 16:19) [2]надпись на заголовке окна
← →
Strange man (2007-07-19 16:32) [3]SetWindowText?
← →
clickmaker © (2007-07-19 16:35) [4]TextOut, DrawText
← →
Xion © (2007-07-19 16:39) [5]ето я пробывал но на панели задач оно меняется а на шапке окна нет. вобще какая метод отвечаеть за отресовку шапки окна (без VCL)
← →
DVM © (2007-07-19 16:45) [6]
> ето я пробывал но на панели задач оно меняется а на шапке
> окна нет.
А ты точно у того окна у кого надо менял? На панели задач может быть кнопка совсем от другого окна.
← →
DVM © (2007-07-19 16:46) [7]
> вобще какая метод отвечаеть за отресовку шапки окна
WM_NCPAINT + надо смотреть сообщения, начинающиеся на WM_NC....
← →
DVM © (2007-07-19 16:48) [8]Но может случиться и так, что шапка окна самопальная - картинка за которую можно таскать - тогда найти способ замены текста маловероятно.
← →
Xion © (2007-07-19 16:54) [9]дело втом что я заменил WNDProc (спомощу SetWindowLong) етого окна на свой после етого он перестал отрисововать Caption
← →
DVM © (2007-07-19 16:57) [10]
> Xion © (19.07.07 16:54) [9]
Покажи свой WNDProc
← →
clickmaker © (2007-07-19 16:58) [11]
> [9] Xion © (19.07.07 16:54)
Дык это... DefWindowProc надо в конце вызывать. Или старую процедуру
← →
Xion © (2007-07-19 16:59) [12]procedure TThreadWindow.WNDProc(var Message: TMessage);
var OldBrush:HBrush;
OldPen:HPen;
OldFont:HFont;
OldBk:Integer;
NeedDC:boolean;
begin
case Message.Msg of
WM_ERASEBKGND:
With TWMERASEBKGND(Message) do begin
NeedDC := DC = 0;
if NeedDC then
DC := GetWindowDC(fWND);
try
if fBrush <> 0 then
OldBrush := SelectObject(DC,fBrush)
else
OldBrush := SelectObject(DC,GetStockObject(NULL_BRUSH));
OldPen := SelectObject(DC,GetStockObject(BLACK_PEN));
OldFont := SelectObject(DC,fFont);
OldBk := GetBkMode(DC);
try
SetBkMode(DC,TRANSPARENT);
DrawWND(DC);
finally
SetBkMode(DC,OldBk);
SelectObject(DC,OldFont);
SelectObject(DC,OldPen);
SelectObject(DC,OldBrush);
end;
finally
if NeedDC then ReleaseDC(fWND,DC);
end;
exit;
end;
end;
//CallWindowProc(pointer(fAdrPrevWNDProc),fWND,Message.Msg,Message.WParam,Message. LParam);
DefWindowProc(fWND, Message.Msg, Message.WParam, Message.LParam);
//Windows.SetWindowLong(fWnd,GWL_WNDPROC,Integer(fAdrPrevWNDProc));
end;
← →
DVM © (2007-07-19 17:02) [13]Чет я не понял окно твое или чужое и зачем DefWindowProc вызывать всегда?
← →
Xion © (2007-07-19 17:11) [14][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;
← →
DVM © (2007-07-19 17:18) [15]
> а окно содаётся потоком причом не обичним способом
Ну особенно ничего необычного здесь нет. Я вот только не пойму - если ты сам окно создаешь - зачем тебе заменять оконную процедуру
← →
DVM © (2007-07-19 17:19) [16]
> [13] если не всегода тогда когда
Если твоя новая оконная процедура рисует фон окна, то старую оконную процедуру для этого сообщения вызывать наверное не надо или старая оконная процедура затрет весь твой фон своим.
← →
DVM © (2007-07-19 17:22) [17]Потом, результат обработки сообщения пушкин возвращать будет?
← →
DVM © (2007-07-19 17:24) [18]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.
← →
Xion © (2007-07-19 17:41) [19]я тоже про ето думал но я решил попробывать и заремарел обработку WM_ERASEBKGND и оно себя точно так ведет (при создании окна дотого как я заменил WNDproc он отображает его а потом после смены активности затерает)
← →
Xion © (2007-07-19 18:07) [20]да видно предложений нету больше
← →
Xion © (2007-07-20 12:26) [21]Если я не могу переопредилить WNDProc то как мне ее унаследовать если у меня есть handle окна ?
← →
Dib@zol © (2007-07-20 12:31) [22]Епт дык тыж её унаследовал уже, т.к. вызываешь CallWindowProc! Походу проблема в несовместимости VCL c API. Наверняка какая нибудь побрякушка из VCL мешает правильной работе... Лучше уж на чёмнить одном ваять, а то такой жуткий компот выходит ;)
← →
Xion © (2007-07-20 12:39) [23]у меня с VCL ничего нету тут только API
← →
Dib@zol © (2007-07-20 12:46) [24]
> TThreadWindow.WNDProc
Точно?
← →
DVM © (2007-07-20 13:37) [25]
> у меня с VCL ничего нету тут только API
да ну?
← →
Xion © (2007-07-20 16:46) [26][24] ето поток вобщето
← →
Dib@zol © (2007-07-20 16:49) [27]А поток типа TThread у нас что использует? Праально, VCL.
← →
Xion © (2007-07-20 17:08) [28]TThread я взял чтоб интерфейс нормальный был ну а само Окно же не VCL
← →
Dib@zol © (2007-07-20 17:24) [29]ДыкЪ TThread за собой весь ВЦЛ и потянул!.. А в Classes"ах и где-то ещё помоему есть initialization, который обязателен к компилированию. Вывод: Ищи корень проблемы там, т.к.
> Наверняка какая нибудь побрякушка из VCL мешает правильной
> работе...
← →
Xion © (2007-07-20 19:00) [30]а как узнать что виполняет родной WNDPROC окна ? может какойто хелп есть
← →
Dib@zol © (2007-07-20 19:06) [31]Для каждого системного оконного класса есть в SDK статейка "Default Message Processing". Это как понимаю и есть нужный хелп.
← →
Xion © (2007-07-23 19:48) [32]я толькочто заметил что у с Caption отрисовуется с XP темами и не отрисовуется с класическими. В чом может быть причина ?
← →
Xion © (2007-07-24 14:12) [33][32] кто может разказать про стили ?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.041 c