Форум: "WinAPI";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизDrawThemeBackground - CaptionButton - Windows XP (.NET) Найти похожие ветки
← →
Ученик (2002-10-02 09:01) [0]Рисуется кнопка (своя) в заголовке окна с использованием DrawThemeBackground (WP_MINBUTTON),
Проблема: на кнопке присутствует значок минимизации;
Вопрос: возможно ли рисование кнопки без картинки, может режим какой-то надо установить, или в параметры чего-нибудь добавить ?
← →
Ученик (2002-10-04 10:35) [1]Проблема еще не решена, может есть идеи ?
← →
Игорь Шевченко (2002-10-04 11:30) [2]А поподробнее ?
← →
Ученик (2002-10-04 11:49) [3]>Игорь Шевченко © (04.10.02 11:30)
Какую часть сообщения ?
← →
Игорь Шевченко (2002-10-04 11:57) [4]WP_MINBUTTON - это кнопка минимизации.
Может, BP_xxxx поможет ?
(XP под рукой нет, если не получится, давай код, дома попробую)
← →
Ученик (2002-10-04 12:14) [5]>BP_xxxx
Кнопка будет не того стиля.
uses
Themes;
var
ThemedWindow : TThemedWindow;
...
ThemedWindow := twMinButtonNormal;
if ThemeServices.ThemesEnabled then begin
Details := ThemeServices.GetElementDetails(ThemedWindow);
ThemeServices.DrawElement(FCanvas.Handle, Details, FButtonRect);
end;
← →
Termik (2002-10-04 12:16) [6]Обязательно так рисовать ?
А вот так не подойдет ?
type
TMyForm=class(TForm)
procedure wmSysCommand(var Message:TMessage); message WM_SYSCOMMAND;
end;
const
ID_ABOUT = WM_USER+1;
ID_CALENDAR=WM_USER+2;
ID_EDIT = WM_USER+3;
ID_ANALIS = WM_USER+4;
implementation
procedure TMyForm.wmSysCommand;
begin
case Message.wParam of
ID_CALENDAR:DatBitBtnClick(Self) ;
ID_EDIT :EditBitBtnClick(Self);
ID_ANALIS:AnalisButtonClick(Self);
end;
inherited;
end;
procedure TMyForm.FormCreate(Sender: TObject);
var SysMenu:THandle;
begin
SysMenu:=GetSystemMenu(Handle,False);
InsertMenu(SysMenu,Word(-1),MF_SEPARATOR,ID_ABOUT,"");
InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Calendar, "Calendar");
InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Analis, "Analis");
InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Edit, "Edit");
end;
← →
Ученик (2002-10-04 12:24) [7]>Игорь Шевченко © (04.10.02 11:57)
Код получше (это Delphi 7)
procedure WMNCPaint(var Message : TWMNCPaint); message WM_NCPAINT;
uses
Themes, XPMan;
procedure TForm1.WMNCPaint(var Message : TWMNCPaint);
var
DC : HDC;
Details: TThemedElementDetails;
begin
inherited;
DC := GetWindowDC(Handle);
if DC <> 0 then try
if ThemeServices.ThemesEnabled then begin
Details := ThemeServices.GetElementDetails(twMinButtonNormal);
ThemeServices.DrawElement(DC, Details, Rect(100, 5, 125, 30));
end
finally
ReleaseDC(Handle, DC)
end
end;
← →
Ученик (2002-10-04 12:25) [8]>Termik © (04.10.02 12:16)
Спасибо, но нужны кнопки
← →
Игорь Шевченко (2002-10-04 12:25) [9]Ученик © (04.10.02 12:14)
По моему скромному мнению, DrawThemeBackground не распозанет такого пользовательского элемента, как нестандартная кнопка в заголовке окна. Может, я и ошибаюсь...
← →
Ученик (2002-10-04 12:33) [10]>Игорь Шевченко © (04.10.02 12:25)
Поэтому и вопрос в форуме, как добиться, пока рисунок затирается после DrawThemeBackground (но решение не очень),
есть еще идея перехватить вывод картинки, но какой функцией это делается пока не понятно.
← →
Ученик (2002-10-04 12:34) [11]>Ученик © (04.10.02 12:33)
Имеется ввиду как рисуется значок минимизации, перехват, вроде, налажен
← →
Игорь Шевченко (2002-10-04 12:54) [12]Ученик © (04.10.02 12:34)
Значок минимизации рисуется функцией DrawFrameControl
← →
Ученик (2002-10-04 13:00) [13]>Игорь Шевченко © (04.10.02 12:54)
Нет
← →
Ученик (2002-10-04 13:04) [14]Ученик © (04.10.02 13:00)
Использование DrawFrameControl отключает XP-стиль окна
← →
Игорь Шевченко (2002-10-04 13:08) [15]Ученик © (04.10.02 13:04)
Весьма вероятно. Но я совсем понимаю, что тебе надо. Может, поподробнее ?
← →
Ученик (2002-10-04 13:20) [16]>Игорь Шевченко © (04.10.02 13:08)
Нарисовать кнопку такую же как системные кнопки в заголовке окна (XP, .NET), но со своей картинкой
← →
Игорь Шевченко (2002-10-04 13:22) [17]Ученик © (04.10.02 13:20)
Нарисовать свой Glyph для кнопки, по WM_NCPAINT рисовать.
← →
Ученик (2002-10-04 13:35) [18]>Игорь Шевченко © (04.10.02 13:22)
А кнопку без Glyph-а ? (чтобы Glyph нарисовать надо сначала Face кнопки нарисовать :-)
← →
Игорь Шевченко (2002-10-04 13:56) [19]Ученик © (04.10.02 13:35)
Glyph вместе с Face. По DrawFrameControl именно такие Glyph"ы рисуются.
← →
Ученик (2002-10-04 13:58) [20]>Игорь Шевченко © (04.10.02 13:56)
Темы бывают разные, например Microsoft XP Plus
← →
Игорь Шевченко (2002-10-04 14:11) [21]Ученик © (04.10.02 13:58)
Кнопка Minimize - элемент темы.
Твоя кнопка - не элемент темы.
Glyph - оно рулез. Честно.
← →
Ученик (2002-10-04 14:13) [22]>Игорь Шевченко © (04.10.02 14:11)
Размер системных кнопок можно изменить, например, до 100 пикселей, кнопка не Glyph
← →
Игорь Шевченко (2002-10-04 14:32) [23]Ученик © (04.10.02 14:13)
Glyph. Кнопки рисуются через StretchBlt
← →
Ученик (2002-10-04 14:35) [24]>Игорь Шевченко © (04.10.02 14:32)
Вы ошибаетесь
← →
Игорь Шевченко (2002-10-04 14:39) [25]Ученик © (04.10.02 14:35)
Glyph"ы на системных кнопках (minimize, maximize, restore, ...) рисуются с помощью StretchBlt. Сами Glyph"ы находятся в файле темы в виде ресурсов типа RT_BITMAP или RT_ICON, что в принципе, без разницы.
В чем именно я ошибаюсь ?
← →
Ученик (2002-10-04 14:42) [26]С определенного размера системной кнопки размер рисунка на ней не меняется, также не меняется рамка вокруг кнопки
← →
Игорь Шевченко (2002-10-04 14:54) [27]Ученик © (04.10.02 14:42)
А до определенного размера меняется ? Значит - StretchBlt. win32k.sys считает, до какого момента можно выводить без видимых искажений, а потом просто не увеличивает размер Glyph"а.
← →
Ученик (2002-10-04 14:58) [28]>Игорь Шевченко © (04.10.02 14:54)
Рисуется Face-кнопки, потом рисуется Glyph с Transparent, поэтому измененения размеров не сказываются на рамке кнопки и значок на кнопке увеличивается до определенного размера.
← →
Игорь Шевченко (2002-10-04 15:01) [29]Ученик © (04.10.02 14:58)
Дома в XP посмотрю
← →
Игорь Шевченко (2002-10-07 10:09) [30]День добрый, Ученик ©,
Поглядел я дома в Windows XP. Действительно, DrawFrameControl, будучи тупо выданный из приложения, не рисует картинку в стиле текущей темы XP. Тогда как DrawThemeBackground - рисует.
Но, дело в том, что фукнция DrawFrameControl перехватывается в user32.dll библиотекой UxTheme.dll и заменяется на функцию ThemeDrawFrameControl. Может, у окна, на котором рисуется FrameControl просто не установлены какие-то атрибуты ? Может, OpenThemeData недостаточно ?
Вопрос по-прежнему открыт :-)
С уважением,
С уважением,
← →
Ученик (2002-10-07 11:34) [31]Если не ошибаюсь, кнопка рисуется функцией GdiDrawStream, но что ей дается на вход (в каком виде) не знаю, думаю, что-то типа метафайла из файла описывающего тему,
DrawFrameControl подменяется с целью отключения поддержки XP, если программа вызывает DrawFrameControl.
Обнаружил функцию RegisterUserApiHook, есть ли какая-либо информация по ней ?
← →
Игорь Шевченко (2002-10-07 11:42) [32]Ученик © (07.10.02 11:34)
Есть. Это та самая функция, вызов которой заменяет следующие функции в USER32.DLL:
DefWindowProcA,
DefWindowProcW,
GetScrollInfo,
SetScrollInfo,
EnableScrollBar,
AdjustWindowRectEx,
SetWindowRgn,
GetSystemMetrics,
SystemParametersInfoA,
SystemParametersInfoW,
DrawFrameControl,
DrawCaption,
MDIRedrawFrame
Кнопка (стандартная, в заголовке окна) рисуется функцией NtUserBitBltSysBmp, а не GDIDrawStream.
> DrawFrameControl подменяется с целью отключения поддержки
> XP, если программа вызывает DrawFrameControl
Сомнительное утверждение. Есть источник или ссылка ?
С уважением,
← →
Ученик (2002-10-07 11:52) [33]Посмотрел ресурсы Windows\Resources\Themes\Luna\luna.msstyles, Fac-ы кнопок и значки на них отдельные BMP-ки,
При вызове DrawFrameControl окно меняет стиль на старый, поэтому такое утверждение.
NtUserBitBltSysBmp можно подменить в пользовательской программе ?
Есть описание параметров RegisterUserApiHook ?
← →
Игорь Шевченко (2002-10-07 12:35) [34]Ученик © (07.10.02 11:52)
Я не знаю деталей UxTheme.dll, поэтому ответить ничего не могу.
Кстати, не факт, что это что-то может значить, что отдельные картинки. Например, стандартный битмап для кнопки Close окна (OBM_CLOSE) нигде не хранится, а рисуется каждый раз в спец. DC.
Я не удивлюсь, если для кнопок из тем применен аналогичный способ.
На оба вторых вопроса ответ: Нет
По самому последнему вопросу можешь обратиться ко мне через пару месяцев или поискать в инете.
С уважением,
← →
Ученик (2002-10-07 12:44) [35]>Игорь Шевченко © (07.10.02 12:35)
Ok, спасибо.
← →
Игорь Шевченко (2002-10-07 13:22) [36]Если интересна дальнейшая дискуссия, со мной можно по аське связаться. Аська в анкете.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c