Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Заголовок формы   Найти похожие ветки 

 
Е.   (2006-01-05 10:42) [0]

У формы FormStyle=fsStayOnTop. Можно ли сделать так чтобы заголовок формы имел активный вид, даже когда сама форма неактивна?


 
TUser ©   (2006-01-05 11:45) [1]

procedure WmNcActivate (var M: TWMNcActivate); message WM_NCACTIVATE;

procedure TForm1.WmNcActivate (var M: TWMNcActivate);
begin
 if M.Active then
   inherited;
end;


 
Е.   (2006-01-05 13:02) [2]

Это конечно работает, но остальные формы в приложении становятся неуправляемыми.


 
КиТаЯц ©   (2006-01-05 14:15) [3]


> Е.   (05.01.06 10:42)
>
> У формы FormStyle=fsStayOnTop. Можно ли сделать так чтобы
> заголовок формы имел активный вид, даже когда сама форма
> неактивна?

Позвольте поинтересоваться для чего?


 
Е.   (2006-01-08 14:12) [4]

>КиТаЯц ©   (05.01.06 14:15) [3]

На основной форме имеется DBGrid, на второй форме (FormStyle=sStayOnTop) отображается информация об активной записи основной формы. Для отображения этой информации используется в т.ч. заголовок второй формы, поэтому необходимо, чтобы он имел активный вид.

PS. Интересно, почему мордератор переместил вопрос в категорию «Начинающим», может он сам и ответит на этот простой вопрос?


 
Е.   (2006-01-08 16:07) [5]

Кто-нибудь поможет новичку программирования?


 
Юрий Зотов ©   (2006-01-09 02:58) [6]

> Е. (08.01.06 16:07) [5]

Вообще говоря, не следует желать странного и вводить бедного юзера в недоумение столь нестандартным интерфейсом. Но если так уж сильно хочется непременно удивить мир, то придется, видимо, отрисовывать заголовок самому. Делается это примерно так:

procedure TForm1.WndProc(var Message: TMessage);
var
 DC: HDC;
 F, B, H: integer;
 G: BOOL;
 Flags: cardinal;
begin
 inherited;
 if Message.Msg in [WM_NCPAINT, WM_NCACTIVATE] then
 begin
   F := GetSystemMetrics(SM_CYSIZEFRAME);
   B := GetSystemMetrics(SM_CXSIZE);
   H := GetSystemMetrics(SM_CYCAPTION);
   SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, @G, 0);
   Flags := DC_ACTIVE or DC_ICON or DC_TEXT or DC_BUTTONS;
   if G then
     Flags := Flags or DC_GRADIENT;
   DC := GetWindowDC(Handle);
   try
     DrawCaption(Handle, DC, Rect(F, F, Width - F - 3 * B, H + F - 2), Flags)
   finally
     ReleaseDC(Handle, DC)
   end
 end
end;

Но код этот нужно рассматривать именно как пример, потому что он не решает всех вопросов. Во-первых, при градиентном заголовке запросто могут возникнуть трудности с отрисовкой зоны, в которой расположены системные кнопки. Во-вторых, этот код не поддерживает темы XP.

И когда Вы с этими проблемами намучаетесь, то, надеюсь, убедитесь, что овчинка не стоит выделки. И что странного действительно желать не следует (кстати, это характерно именно для начинающих).

Best regards.


 
Е.   (2006-01-09 08:50) [7]


> > Е. (08.01.06 16:07) [5]


В любом случае, спасибо за конструктивный ответ, именно это и было нужно.


 
Е.   (2006-01-09 08:53) [8]


> Юрий Зотов ©   (09.01.06 02:58) [6]

(С цитатой промахнулся:)


 
TUser ©   (2006-01-09 11:29) [9]


> Юрий Зотов ©   (09.01.06 02:58) [6]

А почему нельзя просто не обрабатывать wm_ncactivate при деактивировании формы? При обработке этого события что-то еще происходит, кроме ненужной (в смысле [0]) перерисовки заголовка?


 
Юрий Зотов ©   (2006-01-09 12:41) [10]

> TUser ©   (09.01.06 11:29) [9]

Если Вы имеете в виду [1], то ответ в [2]. Если же имеется в виду перерисовка при деактивации, то этого, видимо, будет недостаточно. Например, если по неактивной форме повозить другим окном, то деактивации не происходит, а перерисовка все равно требуется.

Первоначально я предполагал, что достаточно будет обрабатывать только WM_NCPAINT, но оказалось, что нет - поэтому в [6] и появилось WM_NCACTIVATE. Вообще говоря, перерисовка [6] происходит чаще, чем нужно и в этом смысле код далек от хорошего. Я не стал усложнять его только потому, что писал пример, а не готовое решение.



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
3-1132913502
Index
2005-11-25 13:11
2006.01.29
Как правильно создать индекс


2-1137081654
g.town
2006-01-12 19:00
2006.01.29
dbgrid


6-1129721825
mmms
2005-10-19 15:37
2006.01.29
Передача файла по сети, D7


1-1135449800
SEN
2005-12-24 21:43
2006.01.29
Значение текстового поля в Word


3-1133243727
Lex_!
2005-11-29 08:55
2006.01.29
XMLDataSource - примерно что-то такое есть? ..