Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-59403
Semion
2002-10-30 08:22
2002.11.18
Borland Paskal


1-59275
Тори
2002-11-07 13:32
2002.11.18
написать программу


1-59243
pheonix_ash
2002-11-06 22:30
2002.11.18
Как скомпилировать проект так чтобы exe потом *.bpl не просил


8-59285
_alx_
2002-07-22 15:25
2002.11.18
ПОворот канваса


1-59123
_acme
2002-11-08 06:39
2002.11.18
Разбиение колонки StringGrid на несколько колонок с общей шапкой





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский