Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2009, 18:03   #1
Лучик_света
Пользователь
 
Аватар для Лучик_света
 
Регистрация: 12.09.2008
Сообщений: 16
По умолчанию Доп кнопка в заголовке окна

Подскажите пожалуйста, как нарисовать дополнительную кнопку в заголовке окна.
Лучик_света вне форума Ответить с цитированием
Старый 05.04.2009, 18:21   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

нужно обрабатывать сообщения WM_NCxxx.
в WM_NCHITTEST - добавляем проверку попадания в эту кнопку
в WM_NCPAINT - рисуем эту кнопку. В ХР заголовок портится, так что придется наверно весь заголовок перерисовывать
pu4koff вне форума Ответить с цитированием
Старый 06.04.2009, 00:54   #3
Лучик_света
Пользователь
 
Аватар для Лучик_света
 
Регистрация: 12.09.2008
Сообщений: 16
По умолчанию

а как именно нарисовать кнопку?
Лучик_света вне форума Ответить с цитированием
Старый 06.04.2009, 14:30   #4
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Код:
//Четвёртая кнопка на заголовочной полосе окна 
// DElphiWorld......

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ExtCtrls, StdCtrls;

const
  wm_BtnClk = wm_User + 111;{Определяем своё сообщение}

type
  TForm1 = class(TForm)
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    R: TRect;{Переменная для обозначения прямоугольной области кнопки}
    Press: Boolean;
    procedure WmNcPaint(var Msg: TWmNcPaint); message wm_NcPaint;
    procedure WMNcActivate(var msg: TwmncActivate); message wm_NcActivate;
    procedure WmNcLButtonDown( var Msg: TWMNCLBUTTONDOWN); message Wm_NCLbuttonDown;
    procedure wmnchittest(var Msg: TWMncHITTEST); message wm_NcHittest;
    procedure wmSize(var Msg: TMessage); message wm_Size;
    procedure wmncLButtonUp(var msg: TWMncLBUTTONUP); message wm_NclButtonUp;
    procedure wmLbuttonUp(var Msg: TMessage); message wm_LbuttonUp;
    procedure wmBtnClk(var msg: TMessage); message wm_BtnClk;
  public
    { Public declarations }
    procedure DrawBtn;
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WmNcPaint(var Msg: TWmNcPaint);
begin
  inherited;
  Drawbtn;{При перерисовке окна прорисовываем кнопку}
end;

procedure TForm1.DrawBtn;{Код прорисовки кнопки}
var
  WDc: HDc;
  Cx, Cy: Integer;
  XFrame, Yframe: Integer;
begin
  {Получаем контекст нашего окна, снимаем мерки с оконных размеров, 
  вычисляем положение нашей кнопки и прорисовываем её в зависимости 
  от того нажата ли кнопка мыши над ней}
  WDc := GetWindowDc(Handle);
  Cx := GetSystemMetrics(SM_CXSize);
  Cy := GetSystemMetrics(SM_CYSize);
  xFrame := GetSystemMetrics(SM_CXFrame);
  yFrame := GetSystemMetrics(SM_CYFrame);
  R := Bounds(Width - xFrame - 4*Cx + 2, yFrame + 2, Cx - 2, Cy - 4);
  if Press then
    DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH or DFCS_PUSHED)
  else
    DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH);
  ReleaseDc(Handle,WDC);
end;

procedure TForm1.WMNcActivate(var msg: TwmncActivate);
begin
  inherited;
  DrawBtn;
end;

procedure TForm1.WmNcLButtonDown(var Msg: TWMNCLBUTTONDOWN);
var
  pt: TPoint;
begin
  inherited;
  drawbtn;
  pt := Point(msg.XCursor - Left,msg.YCursor - top);
  if PtInRect(R,pt) then
  begin
    Press := True;
    drawbtn;
  end;
end;


procedure TForm1.wmnchittest(var Msg: TWMncHITTEST);
var
  pt: tpoint;
begin
  inherited;
  pt :=Point(msg.XPos - Left, msg.YPos - Top);
  if PtinRect(r,pt) then
    msg.Result := htBorder;
end;

procedure TForm1.wmSize(var Msg: TMessage);
begin
  inherited;
  RedrawWindow(Handle, PRect(0), 0, RDW_FRAME or RDW_NOINTERNALPAINT
    or RDW_INVALIDATE);
end;

procedure TForm1.wmncLButtonUp(var msg: TWMncLBUTTONUP);
var
  pt: TPoint;
begin
  inherited;
  pt := Point(msg.XCursor - Left,msg.YCursor - top);
  if PtInRect(R,pt) then
  begin
    Press := False;
    drawbtn;
    PostMessage(Handle,wm_btnClk,0,0);
  end;
end;

procedure TForm1.wmLbuttonUp(var Msg: TMessage);
begin
  inherited;
  if Press then
  begin
    Press := False;
    DrawBtn;
  end;
end;

procedure TForm1.wmBtnClk(var msg: TMessage);
begin
  {Объявили константу своего сообщения, 
  посылаем его своему окну при отпускании кнопки мыши над новой кнопкой, 
  а здесь обрабатываем своё сообщение}
  ShowMessage('О, круто, наша кнопка нажимается! Спасибо проекту Delphi World!');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  RedrawWindow(Handle, PRect(0), 0, RDW_FRAME or RDW_NOINTERNALPAINT
    or RDW_INVALIDATE);
end;
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 06.04.2009, 14:45   #5
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

Иногда появляется необходимость нарисовать, что-нибудь (например, кнопку) в заголовке чужого окна (а возможно и своего). Это можно сделать очень и очень просто.
Пpоцедуpа DrawFrameControl
Синтаксис: function DrawFrameControl (DC:HDC;Rc :Trect; uType,uStyle:Word ): Bool;
Описание: Рисует один из элементов в заголовке окна.
DC : контекст устройства в котором происходит рисование.
Rc : Область в которой будет происходить рисование
UType: Тип элемента одна из констант:
DFC_BUTTON Кнопка
DFC_CAPTION Заголовок
DCF_MENU Меню
DFC_SCROLL Полоса прокрутки
Ustyle : Стиль элемента одна из констант:
Для кнопок
DFCS_BUTTON3STATE Кнопка с тремя состояниями
DFCS_BUTTONCHECK Флажок
DFCS_BUTTONPUSH Кнопка
DFCS_BUTTONRADIO Переключатель
DFCS_BUTTONRADIOIMAGE Картинка для переключателя
DFCS_BUTTONRADIOMASK Маска для переключателя

Для заголовков
DFCS_CAPTIONCLOSE Кнопка закрыть
DFCS_CAPTIONHELP Кнопка помощь (только Window 9x)
DFCS_CAPTIONMAX Кнопка развернуть
DFCS_CAPTIONMIN Кнопка свернуть
DFCS_CAPTIONRESTORE Кнопка восстановить

Для меню
DFCS_MENUARROW Стрелка подменю
DFCS_MENUBULLET Маркер
DFCS_MENUCHECK Маркер - флажек

Для полос прокрутки
DFCS_SCROLLCOMBOBOX Линейка прокрутки выпадаюшего списка DFCS_SCROLLDOWN Кнопка вниз DFCS_SCROLLLEFT Кнопка влево DFCS_SCROLLRIGHT Кнопка вправо DFCS_SCROLLSIZEGRIP Размерная ручка DFCS_SCROLLUP Кнопка вверх
Возвращаемое значение: В случае успешного завеpшения - не нуль; в пpотивном случае - 0.
Заметьте, что это функция только рисует элемент заголовка.

14 Отрисовка <фальшивой> кнопки закрыть в заголовке окна.
Procedure DrawFalseClose (Wd:HWND; xPos:Integer);
Var DC:HDC;
begin
DC:=GetWindowDC(Wd); // Получим контекст устройства окна
If DC>0 then
Begin
DrawFrameControl (DC,Rect(xPos,4,xPos+16,020),DFC_Ca ption,DFCS_CaptionClose);
ReleaseDC(Wd,DC); // Освободим контекст устройства.
End;
end;
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 06.04.2009, 16:59   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Можете просто использовать готовый компонент CaptionButton. Кидаете его на форму и потом в заголовке программы появляется кнопка. Этих кнопок можете ставить сколько угодно. Сам компонент: CaptionButton.rar
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 08.04.2009, 19:40   #7
Лучик_света
Пользователь
 
Аватар для Лучик_света
 
Регистрация: 12.09.2008
Сообщений: 16
По умолчанию

это на Delphi все, а для С++? там совсем не тоже самое
Лучик_света вне форума Ответить с цитированием
Старый 08.04.2009, 20:48   #8
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Цитата:
это на Delphi все, а для С++? там совсем не тоже самое
а про С++ мы как должны были узнать?
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 11.09.2010, 20:43   #9
Котонхомон
Новичок
Джуниор
 
Регистрация: 11.09.2010
Сообщений: 1
По умолчанию

При рисовании новой кнопки в delphi стиль формы меняется со стиля Windows 7 Aero на стиль Win 98. У меня стоит Windows 7.
А нету подписи)
Котонхомон вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Позиция курсора в заголовке NieL Общие вопросы Delphi 3 17.12.2008 18:01
Бегущая строка в заголовке приложения (Delphi 7) Sinx Помощь студентам 2 08.12.2008 02:35
Сортировка с доп параметрами. Хелп Ice_Juice Microsoft Office Excel 22 15.03.2008 20:21
Рисунок в заголовке TabbedNotebook Aleksandr Общие вопросы Delphi 0 28.09.2007 16:03
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13