Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форма облегает картинку 
:(
    Опции темы
X-Serge
Дата 10.10.2002, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.10.2002

Репутация: нет
Всего: нет



Народ, подскажите.
Вот есть форма, на ней расположена картинка.
Как сделать так, чтобы форма имела форму картинки (это я спрашиваю для Win98, в 2000 и выше это можно сделать с помощью транспорантности).
И вот еще что, желательно, чтобы при таскании шлейфа сильно не оставалось.
PM MAIL   Вверх
Dexter
Дата 10.10.2002, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: 1
Всего: 4



Пользуйся регионами


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
X-Serge
Дата 10.10.2002, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.10.2002

Репутация: нет
Всего: нет



Хотелось бы чуть-чуть по подробнее :-)
Если не трудно небольшой примерчик.
PM MAIL   Вверх
Dexter
Дата 10.10.2002, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: 1
Всего: 4



Уст. региона

SetWindowRgn(Handle, R, True);

Handle - указатель на форму, вид которой хотим поменять
R - указатель на регион
Третий параметр - флаг, при значении TRUE сразу после установки перерисовка

Создание:

CreateRectRgn(0, 0, Width, Height);

Ну и еще там всякие CombineRgn.

Код

constructor TForm1.Create(AOwner: TComponent);
begin
 inherited;
 HorzScrollBar.Visible:= False;  
 VertScrollBar.Visible:= False;  
 RebuildWindowRgn;              
end;

procedure TForm1.RebuildWindowRgn;
var
 FullRgn, Rgn: THandle;
 ClientX, ClientY, I: Integer;
begin
 ClientX:= (Width - ClientWidth) div 2;
 ClientY:= Height - ClientHeight - ClientX;
 FullRgn:= CreateRectRgn(0, 0, Width, Height);
 Rgn:= CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth,
                     ClientY +ClientHeight);
 CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
 for I:= 0 to ControlCount -1 do
   with Controls[I] do begin
     Rgn:= CreateRectRgn(ClientX + Left, ClientY + Top, ClientX + Left +Width,
                         ClientY + Top + Height);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
   end;
   SetWindowRgn(Handle, FullRgn, True);
end;

procedure TForm1.Resize;
begin
 inherited;
 RebuildWindowRgn;            
end;


Должны остаться одни кнопки


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
X-Serge
Дата 10.10.2002, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.10.2002

Репутация: нет
Всего: нет



Большое спасибо, сейчас попробую помутить.
PM MAIL   Вверх
Dapo
Дата 11.10.2002, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Этот пример есть где-то в интернете (не помню где). Немного переделан под свои нужды.
По нажатию на кнопку на форме рисуется обнаженная девушка (супер! :-) ) на белом фоне, после чего белый фон убирается и остается форма в виде этой самой девушки. :-) В общем класно. Картинку могу намылить. D6, W2K.

unit Modifi;
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
function BitmapToRgn(Image: TBitmap): HRGN;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
 MaskBmp: TBitmap;
begin
 MaskBmp := TBitmap.Create;
 try
   MaskBmp.LoadFromFile('C:\67.bmp');
Height := MaskBmp.Height;
Width := MaskBmp.Width;
   SetWindowRgn(Handle, BitmapToRgn(MaskBmp), True);
 finally
   MaskBmp.Free;
 end;
end;

function BitmapToRgn(Image: TBitmap): HRGN;
var
 TmpRgn: HRGN;
 x, y: integer;
 ConsecutivePixels: integer;
 CurrentPixel: TColor;
 CreatedRgns: integer;
 CurrentColor: TColor;
begin
 CreatedRgns := 0;
 Result := CreateRectRgn(0, 0, Form1.Width, Form1.Height);
 inc(CreatedRgns);

 if (Image.Width = 0 ) or (Image.Height = 0) then exit;

 for y := 0 to Image.Height - 1 do
   begin
   CurrentColor := Image.Canvas.Pixels[0,y];
   ConsecutivePixels := 1;
   for x := 0 to Image.Width - 1 do
     begin
     CurrentPixel :=Image.Canvas.Pixels[x,y];
          Form1.Canvas.Pixels[x,y]:=Image.Canvas.Pixels[x+4,y+23];
     if CurrentColor = CurrentPixel
       then inc(ConsecutivePixels)
       else begin
//Цвет фона не чисто белый а с градациями поэтому диапазон
            if (CurrentColor = 16777215) or (CurrentColor >=15724527 ) then
              begin
              TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
              CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
              inc(CreatedRgns);
              DeleteObject(TmpRgn);
              end;
            CurrentColor := CurrentPixel;
            ConsecutivePixels := 1;
            end;
     end;

  if ((CurrentColor <= 16777215) or (CurrentColor >=15724527 )) and (ConsecutivePixels > 0) then
     begin
      TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
      CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
      inc(CreatedRgns);
      DeleteObject(TmpRgn);
     end;
   end;
end;



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012;  { a magic number }
begin
  ReleaseCapture;
  Form1.perform(WM_SysCommand, SC_DragMove, 0);
end;

end.
PM MAIL   Вверх
Dexter
Дата 11.10.2002, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: 1
Всего: 4



Цитата

Этот пример есть где-то в интернете (не помню где). Немного переделан под свои нужды.


Да на CodeNet по-мойму


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.