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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 23:34   #1
RUSlan48
Пользователь
 
Аватар для RUSlan48
 
Регистрация: 06.12.2009
Сообщений: 65
Восклицание Нестандартный вид формы

Помогите, пожалуйста, сделать внешность формы в виде bmp рисунка, без фонового цвета.

Код:
//функция получения области картинки, без фона (trc)
function TForm1.RegFromPic(pict:TPicture):HRGN;
var rgn, resrgn:HRGN;
    x, y, xFirst:Integer;
    trc:Tcolor;
begin
  trc:=image1.Canvas.Pixels[1, 1]; //цвет фона
  resRgn:=CreateRectRgn(0,0,0,0);
  for y:=0 to pict.Height do begin
    x:=0;
    while x<pict.Width do begin
      if pict.Bitmap.Canvas.Pixels[x,y]<>trc then begin
        xFirst:=x;
        inc(x);
        while (x<pict.Width) and (pict.Bitmap.Canvas.Pixels[x,y]<>trc)  do inc(x);
        rgn:=CreateRectRgn(xFirst, y, x-1, y+1);
        CombineRgn(resRgn, resRgn, rgn, RGN_OR); //объединение
        DeleteObject(rgn);
      end;
      inc(x);
    end;
  end;
  Result:=resRgn;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowRgn(image1.Picture.Bitmap.Handle, RegFromPic(Image1.Picture), true);
end;
в итоге ничего нету - просто невидимая форма.
Делай что должен, и будь что будет
RUSlan48 вне форума Ответить с цитированием
Старый 08.03.2011, 23:50   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот попробуи
Код:
{$R *.dfm}

procedure TForm1.WMNCHitTest (var M:TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then M.Result := htCaption;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  regn, tmpRegn: integer; // регион окна и временный регион
  x, y: integer; // координаты пикселя
  nullClr: TColor; // <прозрачный цвет>
begin
  nullClr := image1.picture.Bitmap.Canvas.Pixels[0, 0];
  // Image1 это картинка по которой создается форма окна
  regn := CreateRectRgn(0, 0, image1.picture.Graphic.Width,
  image1.picture.Graphic.Height);
  for x := 1 to image1.picture.Graphic.Width do
    for y := 1 to image1.picture.Graphic.Height do
      if image1.picture.Bitmap.Canvas.Pixels[x - 1, y - 1] = nullClr then
      begin
        tmpRegn := CreateRectRgn(x - 1, y - 1, x, y);
        CombineRgn(regn, regn, tmpRegn, RGN_DIFF);
        DeleteObject(tmpRegn);
      end;
  SetWindowRgn(Form1.handle, regn, true);
end;

end.
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 09.03.2011, 21:23   #3
RUSlan48
Пользователь
 
Аватар для RUSlan48
 
Регистрация: 06.12.2009
Сообщений: 65
По умолчанию

а для чего
Код:
procedure TForm1.WMNCHitTest (var M:TWMNCHitTest)
и что с ней делать?

а вот это
Код:
SetWindowRgn(Form1.handle, regn, true);
выводит кусок формы в виде части рисунка, а мне нужно чтобы показывалась именно часть рисунка...
Делай что должен, и будь что будет
RUSlan48 вне форума Ответить с цитированием
Старый 09.03.2011, 23:22   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот, запусти ехе, ето не то что надо?
Вложения
Тип файла: zip ArtForm.zip (30.8 Кб, 80 просмотров)
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 10.03.2011, 22:33   #5
RUSlan48
Пользователь
 
Аватар для RUSlan48
 
Регистрация: 06.12.2009
Сообщений: 65
По умолчанию

да, действительно, - то, что надо, если ещё BorderStyle:=bsNone поставить, а то картинка съезжает. Спасибо.

Но я так и не понял:
Код:
procedure TForm1.WMNCHitTest (var M:TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then M.Result := htCaption;
end;
Если можно, объясните, пожалуйста...

И ещё: после запуска программа висит секунд так 10, это по ходу FormCreate выполняется, почему так долго? Неужели просто двойной цикл всё так тормозит?
Делай что должен, и будь что будет

Последний раз редактировалось RUSlan48; 10.03.2011 в 22:45.
RUSlan48 вне форума Ответить с цитированием
Старый 10.03.2011, 23:56   #6
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Цитата:
Сообщение от RUSlan48 Посмотреть сообщение
да, действительно, - то, что надо, если ещё BorderStyle:=bsNone поставить, а то картинка съезжает. Спасибо.
Но я так и не понял:
Код:
procedure TForm1.WMNCHitTest (var M:TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then M.Result := htCaption;
end;
Если можно, объясните, пожалуйста...
И ещё: после запуска программа висит секунд так 10, это по ходу FormCreate выполняется, почему так долго? Неужели просто двойной цикл всё так тормозит?
Процедура для того, чтобы Винда думала что мышка хватает форму за заголовок, и можно будет ее(форму) таскать за любое место формы.

Погугли компонент TPlasmaForm. Там очень удобно в делфи во время дизайна создаетя маска\регион из любой картинки, а во время выполнения регион моментально применяется к форме средствами WinAPI
xexxex вне форума Ответить с цитированием
Старый 09.05.2011, 21:28   #7
metra52
 
Регистрация: 25.04.2011
Сообщений: 6
По умолчанию

Ребят скачал исходник который вы предложили у меня вапще ничо не запускается
metra52 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нестандартный вывод из БД sersr Помощь студентам 3 08.11.2010 21:32
Как изменить внешний вид формы? quarty Общие вопросы Delphi 7 10.10.2010 16:18
Нестандартный график в Excel vfr800 Microsoft Office Excel 4 18.03.2010 01:01
нестандартный массив wasabi Фриланс 7 20.01.2010 12:27
Нестандартный вопрос ?! Adamant PHP 9 08.02.2008 21:28