Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизЗаголовок формы Найти похожие ветки
← →
Е. (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 1.501 c