Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1185474090
Sonic90
2007-07-26 22:21
2007.08.19
TTrackBar в PopupMenu


15-1184847220
de.
2007-07-19 16:13
2007.08.19
MapView своими руками...


15-1184780234
kami
2007-07-18 21:37
2007.08.19
Перенос системы с Raid массива на 1 винт


4-1173091631
Углук
2007-03-05 13:47
2007.08.19
Странность с вызовом функции из DLL


9-1158607607
Nic
2006-09-18 23:26
2007.08.19
Разработка GUI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский