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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2011, 13:41   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Создание непрямоугольной формы

Ну, статей в интернете нашлось много, вот только ни одно толком ничего не объяснила.(ссылка)
Как же всё-таки нормально сделать непрямоугольное окно? Куда нужно прицеплять код из тех статей?
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.05.2011, 13:53   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ладно, с этим немного разобрался. Вот только такая проблема: окно появляется стандартное, но только моей формы.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function BitmapToRegion(Bitmap: TBitmap; TransColor: TColor): HRGN;
var
  X, Y: Integer;
  XStart: Integer;
begin
  Result := 0;
  with Bitmap do
    for Y := 0 to Height - 1 do
    begin
    X := 0;
    while X < Width do
    begin
      // Ïðîïóñêàåì ïðîçðà÷íûå òî÷êè
      while (X < Width) and (Canvas.Pixels[X, Y] = TransColor) do
        Inc(X);
      if X >= Width then
        Break;
      XStart := X;
      // Ïðîïóñêàåì íåïðîçðà÷íûå òî÷êè
      while (X < Width) and (Canvas.Pixels[X, Y] <> TransColor) do
        Inc(X);
      // Ñîçäà¸ì íîâûé ïðÿìîóãîëüíûé ðåãèîí è äîáàâëÿåì åãî ê ðåãèîíó âñåé êàðòèíêè
      if Result = 0 then
        Result := CreateRectRgn(XStart, Y, X, Y + 1)
      else
        CombineRgn(Result, Result, CreateRectRgn(XStart, Y, X, Y + 1), RGN_OR);
    end;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var Bmp : TBitmap;
    rgn : HRGN;
begin
      Bmp:=TBitmap.Create;
      Bmp.LoadFromFile('BackGround.bmp');
      rgn := BitmapToRegion(Bmp,clWhite);
      SetWindowRgn(Form1.Handle,rgn,true);
end;

procedure TForm1.WMLButtonDown(var Msg: TMessage);
begin
  Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
end;

end.
Что не так?
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.05.2011, 14:53   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Куда нужно прицеплять код из тех статей?
В процедуру события OnPaint формы.

Пример создание формы с закругленными краями и выноской.
В примере выноска создается функцией CreatePolygonRgn. Никто не мешает применяя эту функцию создавать окно произвольной формы.
Код:
procedure TForm1.FormPaint(Sender: TObject);
var rc : TRect; Rgn, Rgn2 : HRGN;
    a : array[0..3] of TPoint;
begin
  GetWindowRect(Handle, rc);
  OffsetRect(rc,  -rc.left,  -rc.top);
  rc.Bottom := rc.Bottom - 20;
  DeleteObject(Rgn);

// создание региона в виде прямоугольника с закругленными краями
  Rgn := CreateRoundRectRgn(
            rc.left, rc.top, rc.right, rc.bottom, 15, 15);

// выноска
   a[0] := Point(25, rc.Bottom-2);
   a[1] := Point(25, rc.Bottom+20);
   a[2] := Point(47, rc.Bottom-2);
   a[3] := Point(25, rc.Bottom-2);
   Rgn2 := CreatePolygonRgn(a, 4, WINDING);
  // объединение двух регионов
   CombineRgn(Rgn, Rgn, Rgn2, RGN_OR);

// рамка вокруг объединенного региона
  FrameRgn(GetDC(Handle), Rgn, CreateSolidBrush(clBlack), 1, 1);
  SetWindowRgn(Handle, Rgn, TRUE);
end;

Последний раз редактировалось Прик; 23.05.2011 в 15:48. Причина: Пример создания окна произвольной формы
Прик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание формы tae1980 Microsoft Office Excel 6 16.03.2010 08:03
Создание формы в C# Vedmac1662 Помощь студентам 0 15.12.2009 17:41
Создание формы Mylene79 Microsoft Office Excel 7 25.02.2009 13:29
Создание формы Pilot Microsoft Office Excel 2 15.11.2007 10:35