Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
21 / 22 / 5
Регистрация: 14.02.2013
Сообщений: 243
1

Своя кнопка в заголовке

12.05.2013, 10:47. Показов 4970. Ответов 17
Метки нет (Все метки)

Как добавить свою кнопку в заголовок как на рисунке:
Название: capture_05122013_094400.png
Просмотров: 725

Размер: 1.9 Кб
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2013, 10:47
Ответы с готовыми решениями:

Дополнительная кнопка в заголовке окна
Добрый день! Подскажите, пожалуйста, как можно добавить кнопку в заголовке окне (возле кнопок...

Своя кнопка
Как сделать свою кнопку, т.е. чтобы было одно изображение, при наведении второе и при нажатии 3.

Своя треугольная кнопка
Решил попробовать изменить шаблон стандартной кнопки. (Template -> Edit Copy) Нарисовал свою форму...

Своя кнопка выбора
Нужно сделать свою кнопку выбора элементов. Есть кнопка с тремя точками которая все делает...

17
LK
Заблокирован
12.05.2013, 11:11 2
Лучший ответ Сообщение было отмечено как решение

Решение

лехко...
Добавляем кнопку в заголовок окна

Автор: Tercio Ferdinando Gaudencio Filho

Приведённый здесь код создаёт кнопку в заголовке окна, создаёт MenuItem в системном меню и создаёт подсказку(Hint) в кнопке. Поместите код в Ваш Unit и замените "FrmMainForm" на Ваше имя формы, а так же некоторые кусочки кода, ткст подсказки и т.д.

Совместимость: Delphi 3.x (или выше)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
... 
 
  private 
    { Private declarations } 
    procedure WMNCPAINT          (var msg: Tmessage); message WM_NCPAINT; 
    procedure WMNCACTIVATE       (var msg: Tmessage); message WM_NCACTIVATE; 
    procedure WMNCMOUSEDOWN      (var msg: Tmessage); message WM_NCLBUTTONDOWN; 
    procedure WMNCMOUSEMOVE      (var Msg: TMessage); message WM_NCMOUSEMOVE; 
    procedure WMMOUSEMOVE        (var Msg: TMessage); message WM_MOUSEMOVE; 
    procedure WMLBUTTONUP        (var msg: Tmessage); message WM_LBUTTONUP; 
    procedure WNCLBUTTONDBLCLICK (var msg: Tmessage); message WM_NCLBUTTONDBLCLK; 
    procedure WMNCRBUTTONDOWN    (var msg: Tmessage); message WM_NCRBUTTONDOWN; 
    procedure WMNCHITTEST        (var msg: Tmessage); message WM_NCHITTEST; 
    procedure WMSYSCOMMAND       (var msg: Tmessage); message WM_SYSCOMMAND; 
 
... 
 
var 
... 
  Pressed         : Boolean; 
  FocusLost       : Boolean; 
  Rec             : TRect; 
  NovoMenuHandle  : THandle; 
  PT1             : TPoint; 
  FHintshow       : Boolean; 
  FHint           : THintWindow; 
  FHintText       : String; 
  FHintWidth      : Integer; 
 
... 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMSYSCOMMAND(var Msg: TMessage); 
begin 
  if Msg.WParam=LongInt(NovoMenuHandle) then 
    //********************************************* 
    //Кнопка была нажата! Добавьте сюда Вашу функцию 
    //********************************************* 
  inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMNCHITTEST(var Msg: TMessage); 
var 
  Tmp : Boolean; 
begin 
  if Pressed then 
  begin 
    Tmp:=FocusLost; 
    PT1.X := Msg.LParamLo - FrmMainForm.Left; 
    PT1.Y := Msg.LParamHi - FrmMainForm.Top ; 
    if PTInRect(Rec, PT1) then 
      FocusLost := False 
    else 
      FocusLost := True; 
    if FocusLost <> Tmp then 
      InvalidateRect(FrmMainForm.Handle, @Rec, True); 
  end; 
  inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMLBUTTONUP(var Msg: TMessage); 
var 
  Tmp : Boolean; 
begin 
  ReleaseCapture; 
  Tmp     := Pressed; 
  Pressed := False; 
  if Tmp and PTInRect(Rec, PT1) then 
  begin 
    InvalidateRect(FrmMainForm.Handle, @Rec, True); 
    FHintShow := False; 
    FHint.ReleaseHandle; 
    //********************************************* 
    //Кнопка была нажата! Добавьте сюда Вашу функцию 
    //********************************************* 
  end 
  else 
    inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WNCLBUTTONDBLCLICK(var Msg: TMessage); 
begin 
  PT1.X := Msg.LParamLo - FrmMainForm.Left; 
  PT1.Y := Msg.LParamHi - FrmMainForm.Top ; 
  if not PTInRect(Rec, PT1) then 
    inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMNCRBUTTONDOWN(var Msg: TMessage); 
begin 
  PT1.X := Msg.LParamLo - FrmMainForm.Left; 
  PT1.Y := Msg.LParamHi - FrmMainForm.Top ; 
  if not PTInRect(Rec, PT1) then 
    inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMNCMOUSEDOWN(var Msg: TMessage); 
begin 
  PT1.X := Msg.LParamLo - FrmMainForm.Left; 
  PT1.Y := Msg.LParamHi - FrmMainForm.Top ; 
  FHintShow := False; 
  if PTInRect(Rec, PT1) then 
  begin 
   Pressed   := True; 
   FocusLost := False; 
   InvalidateRect(FrmMainForm.Handle, @Rec, True); 
   SetCapture(TWinControl(FrmMainForm).Handle); 
  end 
  else 
  begin 
   FrmMainForm.Paint; 
   inherited; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
//That function Create a Hint 
procedure TFrmMainForm.WMNCMOUSEMOVE(var Msg: TMessage); 
begin 
  PT1.X := Msg.LParamLo - FrmMainForm.Left; 
  PT1.Y := Msg.LParamHi - FrmMainForm.Top ; 
  if PTInRect(Rec, PT1) then 
  begin 
    FHintWidth  := FHint.Canvas.TextWidth(FHintText); 
    if (FHintShow = False) and (Length(Trim(FHintText)) <> 0) then 
      FHint.ActivateHint( 
        Rect( 
          Mouse.CursorPos.X, 
          Mouse.CursorPos.Y + 20, 
          Mouse.CursorPos.X + FHintWidth + 10, 
          Mouse.CursorPos.Y + 35 
          ), 
        FHintText 
      ); 
      FHintShow := True; 
  end 
  else 
  begin 
    FHintShow := False; 
    FHint.ReleaseHandle; 
  end; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMMOUSEMOVE(var Msg: TMessage); 
begin 
  FHintShow := False; 
  FHint.ReleaseHandle; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMNCACTIVATE(var Msg: TMessage); 
begin 
  InvalidateRect(FrmMainForm.Handle, @Rec, True); 
  inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.WMNCPAINT(var Msg: TMessage); 
begin 
  InvalidateRect(FrmMainForm.Handle, @Rec, True); 
  inherited; 
end; 
 
//------------------------------------------------------------------------------ 
 
procedure TFrmMainForm.FormPaint(Sender:TObject); 
var 
  Border3D_Y, Border_Thickness, Btn_Width, 
  Button_Width, Button_Height  : Integer; 
  MyCanvas                      : TCanvas; 
begin 
  MyCanvas        := TCanvas.Create; 
  MyCanvas.Handle := GetWindowDC(FrmMainForm.Handle); 
  Border3D_Y      := GetSystemMetrics(SM_CYEDGE); 
  Border_Thickness:= GetSystemMetrics(SM_CYSIZEFRAME); 
  Button_Width    := GetSystemMetrics(SM_CXSIZE); 
  Button_Height   := GetSystemMetrics(SM_CYSIZE); 
 
  //Создаём квадратную кнопку, но если Вы захотите создать кнопку другого размера, то
  //измените эту переменную на Вашу ширину. 
  Btn_Width  := Border3D_Y  + Border_Thickness + Button_Height - (2 * Border3D_Y) - 1; 
 
  Rec.Left   := FrmMainForm.Width - (3 * Button_Width + Btn_Width); 
  Rec.Right  := FrmMainForm.Width - (3 * Button_Width + 03); 
  Rec.Top    := Border3D_Y  + Border_Thickness - 1; 
  Rec.Bottom := Rec.Top     + Button_Height - (2 * Border3D_Y); 
  FillRect(MyCanvas.Handle,Rec,HBRUSH(COLOR_BTNFACE+1)); 
  If not Pressed or Focuslost Then 
    DrawEdge(MyCanvas.Handle, Rec, EDGE_RAISED, BF_SOFT or BF_RECT) 
  Else If Pressed and Not Focuslost Then 
    DrawEdge(MyCanvas.Handle, Rec, EDGE_SUNKEN, BF_SOFT or BF_RECT); 
 
  //It draw a the application icon to the button. Easy to change. 
  DrawIconEX(MyCanvas.Handle, Rec.Left+4, Rec.Top+3, Application.Icon, 8, 8, 0, 0, DI_NORMAL); 
 
  MyCanvas.Free; 
end; 
 
... 
 
procedure TFrmMainForm.FormCreate(Sender: TObject); 
 
... 
 
  InsertMenu(GetSystemMenu(Handle,False), 4, MF_BYPOSITION+MF_STRING, NovoMenuHandle,pchar('TEXT OF THE MENU')); 
  Rec             := Rect(0,0,0,0); 
  FHintText       := 'Put the text of your Hint HERE'; 
  FHint           := THintWindow.Create(Self); 
  FHint.Color     := clInfoBk;  //Вы можете изменить бэкграунд подсказки
 
...
Источник: http://delphi7.org/lit2/393.php
Осталась мелочь - оформить это все на С++ .

Есть еще Visual C++ - Кнопки в заголовке окна, но чёт в Вынь7 кнопок не видно, хотя на нажатие реагирует.

Своя кнопка в заголовке


ну и
Дополнительная кнопка в заголовке окна
3
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
12.05.2013, 12:53 3
Цитата Сообщение от LK Посмотреть сообщение
Совместимость: Delphi 3.x (или выше)
А точнее ниКакая )

Добавлено через 48 секунд
Цитата Сообщение от LK Посмотреть сообщение
Есть еще Visual C++ - Кнопки в заголовке окна, но чёт в Вынь7 кнопок не видно, хотя на нажатие реагирует.
Ото ж ...

В Win7 окнах большинство таких трюков либо не работает либо выглядит калечно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31187 / 20385 / 7940
Регистрация: 22.10.2011
Сообщений: 35,345
Записей в блоге: 6
12.05.2013, 13:53 4
Цитата Сообщение от LK Посмотреть сообщение
но чёт в Вынь7 кнопок не видно
Аналогично и приведенный по последней ссылке Дельфийский код не показывает доп. кнопку. А тот, что отцитирован здесь - просто вешает форму намертво, ни изменить положение, ни изменить размеры нельзя. Тестировалось на Win7 + Delphi XE2...

А вот код, приведенный в Delphi Heaven прекрасно добавляет в заголовок окна кнопку:
Своя кнопка в заголовке


, и оставляет окно полностью работоспособным. Так что уж если переводить - то тот код, который работает...
2
LK
Заблокирован
12.05.2013, 14:26 5
Цитата Сообщение от Avazart Посмотреть сообщение
А точнее ниКакая
- ссылка на источник добавлена как раз для тех, кто в танке.
Цитата Сообщение от UI Посмотреть сообщение
уж если переводить
- информация, предоставляемая на форумах, далеко не всегда имеет тип "взял - и использовал", гораздо чаще - это направление думания, и сей тезис подтверждает последующее обсуждение .
0
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
17.04.2015, 12:01 6
У некоего товарища Rodrigo Ruz ("Road to Delphi") есть бесплатная библиотечка VCL Styles Utils. Там есть Vcl.Styles.NC.pas файл (NC - no client area). Описание можно почитать в интернете.
Его достаточно добавить в проект и в опциях: "Delphi Compiler -> Search Path" указать папку с Vcl.Styles.NC.pas и Vcl.Styles.Utils.SystemMenu.pas, также указать путь к папке с Detours файлами DDetours.pas, GenericsCast.pas и InstDecode.pas.
Перед тем, как использовать .pas файлы, необходимо генерировать .hpp: выделяем .pas файл в дереве проектов двойным кликом и жмём "Alt + F9" -> в папке рядом с .pas появляется .hpp.
После всего, можно создавать кнопки в загаловке (проверено в XE2):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    NCControls = new TNCControls(this);
    TNCButton *but;
    for (int i = 0; i <= 5; i++) {
        but = new TNCButton(NCControls);
        NCControls->AddToList(but);
        NCControls->ShowSystemMenu = true;
        TVarRec args[1] = {i + 1};
        NCControls->List->Items[i]->Name       = Format(L"NCButton%d", args, 1);
        NCControls->List->Items[i]->Hint       = Format(L"Hint for NCButton%d", args, 1);
        NCControls->List->Items[i]->ShowHint   = true;
        NCControls->List->Items[i]->Caption    = L"Btn" + IntToStr(i+1);
        NCControls->List->Items[i]->Style      = TNCButton::nsPushButton;
        NCControls->List->Items[i]->ImageStyle = TNCButton::isGrayHot;
        NCControls->List->Items[i]->AlignWithMargins = false;
        //NCControls->List->Items[i]->Images     = ImageList1;
        //NCControls->List->Items[i]->ImageIndex = i;
        NCControls->List->Items[i]->BoundsRect = Rect(30+(i*110), 5, 90+(i*110), 25);
        NCControls->List->Items[i]->OnClick    = NULL;
    }
тонкости
Удалять кнопки в runtime-е так просто не получиться. Удалять из дельфийского класса TObjectList<>, в котором храняться кнопки, из под Builder-а у меня получилось только добавив в .pas конкретный метод удаления.
2
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
17.04.2015, 12:24 7
Ну так, а ссылку на либу?
1
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
17.04.2015, 13:53 8
Конечно!
А вот сам сайт (новость от August 24, 2014)
Без серьёзных знаний Delphi в C++ Builder-е сложновато жить.
2
0 / 0 / 1
Регистрация: 15.02.2013
Сообщений: 27
18.01.2017, 22:02 9
Цитата Сообщение от Whatson2 Посмотреть сообщение
У некоего товарища Rodrigo Ruz ("Road to Delphi") есть бесплатная библиотечка VCL Styles Utils. Там есть Vcl.Styles.NC.pas файл (NC - no client area). Описание можно почитать в интернете.
Его достаточно добавить в проект и в опциях: "Delphi Compiler -> Search Path" указать папку с Vcl.Styles.NC.pas и Vcl.Styles.Utils.SystemMenu.pas, также указать путь к папке с Detours файлами DDetours.pas, GenericsCast.pas и InstDecode.pas.
Перед тем, как использовать .pas файлы, необходимо генерировать .hpp: выделяем .pas файл в дереве проектов двойным кликом и жмём "Alt + F9" -> в папке рядом с .pas появляется .hpp.
После всего, можно создавать кнопки в загаловке (проверено в XE2):
Спасибо) библиотеку переписали, судя по всему.

пример для кнопки меню в строке заголовка (c попапом)
xe4, VCL Styles Utils версии вчерашнего дня

C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::FormCreate(TObject *Sender) {
NCControls = new TNCControls(this);
NCControls->ShowSystemMenu = true;
NCControls->ButtonsList->Add();
NCControls->ButtonsList->Items[0]->ShowHint   = false;
NCControls->ButtonsList->Items[0]->Caption    = L"Меню";
NCControls->ButtonsList->Items[0]->Style      = TNCButton::nsSplitTrans;
NCControls->ButtonsList->Items[0]->BoundsRect = Rect(30, 5, 80, 25);
NCControls->ButtonsList->Items[0]->DropDownMenu = PopupMenu1;
NCControls->ButtonsList->Items[0]->OnClick    = NCClick;
}
0
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 4
05.12.2018, 23:21 10
Простите за некропост, но как его установить в c++ builder? У меня XE8.

Цитата Сообщение от Whatson2 Посмотреть сообщение
У некоего товарища Rodrigo Ruz ("Road to Delphi") есть бесплатная библиотечка VCL Styles Utils. Там есть Vcl.Styles.NC.pas файл (NC - no client area). Описание можно почитать в интернете.
Его достаточно добавить в проект и в опциях: "Delphi Compiler -> Search Path" указать папку с Vcl.Styles.NC.pas и Vcl.Styles.Utils.SystemMenu.pas, также указать путь к папке с Detours файлами DDetours.pas, GenericsCast.pas и InstDecode.pas.
Перед тем, как использовать .pas файлы, необходимо генерировать .hpp: выделяем .pas файл в дереве проектов двойным кликом и жмём "Alt + F9" -> в папке рядом с .pas появляется .hpp.
После всего, можно создавать кнопки в заголовке (проверено в XE2)
Либо в этой инструкции чего-то не хватает, либо я совсем тупой.
0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
06.12.2018, 00:46 11
Забей это извращение пихать кнопку в заголовок.
1
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 4
06.12.2018, 03:58 12
Avazart, не хочется лишнюю кнопку на форме делать. Некрасиво будет.
0
Avazart
06.12.2018, 12:31
  #13

Не по теме:

Цитата Сообщение от wserfer Посмотреть сообщение
Некрасиво будет.
Не стану спорить с извращенцем...

0
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
06.12.2018, 20:17 14
wserfer, теме уже 3.5 года, тем более phobos7 через 2 года уточнил, что "библиотеку переписали, судя по всему."
И третье - самое главное - есть замечательная Qt с её css стилизацией. Имхо, Embarcadero не стоит использовать.
0
0 / 0 / 0
Регистрация: 05.12.2018
Сообщений: 4
07.12.2018, 01:20 15
Цитата Сообщение от Whatson2 Посмотреть сообщение
wserfer, теме уже 3.5 года, тем более phobos7 через 2 года уточнил, что "библиотеку переписали, судя по всему."
Теме уже 3.5, а нормального решения так и нет. Дело не в том, что код не работает, а в том, что библиотека не подключается. Об этом я и спросил.

Не по теме:


Цитата Сообщение от Whatson2 Посмотреть сообщение
есть замечательная Qt с её css стилизацией. Имхо, Embarcadero не стоит использовать
Цитата Сообщение от Avazart Посмотреть сообщение
Забей это извращение пихать кнопку в заголовок.
Этот форум застрял в нулевых? Не помню, чтобы я спрашивал, что мне нужно юзать.

0
Эксперт С++
8378 / 6114 / 613
Регистрация: 10.12.2010
Сообщений: 28,531
Записей в блоге: 30
07.12.2018, 20:04 16
Цитата Сообщение от wserfer Посмотреть сообщение
Этот форум застрял в нулевых? Не помню, чтобы я спрашивал, что мне нужно юзать.
А Вы в каком месте застряли? Когда объясняли что нужно главным образом уделять внимание логике/ф-ционалу программы, а не кнопочки лепить куда непоподя?

Я считаю за заголовок должна отвечать система и программист не должен туда лезть своими руками.
Результаты могут быть неожиданными например при смене темы виндовс или же вообще при упрощённых настройках типа "аля XP стайл".

Можно конечно изменить тип окна, убрать стандартный бордюр и заголовок и рисовать это "все руками" но в таком случае получите приложение-"урод" который и зимой и летом ...
0
wserfer
08.12.2018, 01:42
  #17

Не по теме:

Avazart, я делаю приложения, в основном, для себя. Исключительно "as is". Никого их использовать не заставляю, деньги за это не требую. Так в чем проблема?

0
69 / 62 / 36
Регистрация: 26.07.2015
Сообщений: 126
08.12.2018, 09:37 18
alphaskins http://www.alphaskins.com/index.php прекрасно справляется с рисованием кнопок в заголовке и есть подробная инструкция по установке.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2018, 09:37

Своя кнопка в чужом окне
Здравствуйте Господа!!! Хочу внедрить свою кнопку в чужой процесс , при помощи DLL , итак делаю...

Своя кнопка на панель mvb6
Как создать свой инструмент на панели Microsoft Visual Studio 6 Только не из стандартных...

Кнопка в заголовке формы
Подскажите, как сделать кнопку в заголовке? Пишу программу и хочу красиво ее оформить.

Доп кнопка в заголовке окна
Подскажите пожалуйста, как нарисовать дополнительную кнопку в заголовке окна.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.