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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2010, 17:10   #1
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
Радость отрисовка контролов UpdateLayeredWindow()

Всем доброго времени суток!
мне нужно научиться отрисовывать контролы самостоятельно с UpdateLayeredWindow().. меня на это натолкнул код взятый где-то в недрах паутины вот он:

Код:
unit mainWin;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  last_pos: TPoint;
  hbmp: HBITMAP;
  backdc: HDC;
implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

procedure TForm1.FormCreate(Sender: TObject);
var
  img: TGPBitmap;
  screendc: HDC;
  pt1, pt2 : TPoint;
  sz : TSize;
  bf : TBlendFunction;
begin
  self.BorderStyle := bsNone;

  if SetWindowLong(Handle, GWL_EXSTYLE,
                    GetWindowLong(Handle,
                    GWL_EXSTYLE) or
                    WS_EX_LAYERED) = 0
  then ShowMessage(SysErrorMessage(GetLastError));
  img := TGPBitmap.Create('bg.png', True);
  with img do begin
    GetHBITMAP(0,hbmp);
    Width := GetWidth;
    Height := GetHeight;
    Free;
  end;
  screendc := GetDC(0);
  backdc := CreateCompatibleDC(screendc);
  SelectObject(backdc, hbmp);
  pt1 := Point(Left, Top);
  pt2 := Point(0,0);
  sz.cx := Width;
  sz.cy := Height;
  with bf do begin
    BlendOp := AC_SRC_OVER;
    BlendFlags := 0;
    SourceConstantAlpha := $FF;
    AlphaFormat := AC_SRC_ALPHA;
  end;
  UpdateLayeredWindow(Handle, screendc, @pt1,
                      @sz, backdc, @pt2,0,
                      @bf,ULW_ALPHA);
  ReleaseDC(0,screendc);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteObject(hbmp);
  DeleteDC(backdc);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  last_pos.X := X;
  last_pos.Y := Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  cur_pos: TPoint;
begin
  if ssLeft in Shift then
  begin
    GetCursorPos(cur_pos);
    Left := cur_pos.X - last_pos.X;
    Top := cur_pos.Y - last_pos.Y;
  end;

end;

end.
То есть, собственно говоря, код создает регион по изображению *.png с альфаканалом, тенью и иже с ними. Ну это понятно.. Понятно так же, что, контролы помещенные на форму отображаться никак не будут, а надо бы
так вот, может подкините примерчик отрисовки изображения или текста, или кнопки простой буду очень признателен в долгу не останусь, если что
skalt12 вне форума Ответить с цитированием
Старый 14.07.2010, 10:10   #2
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

сложная задача, по всей видимости
skalt12 вне форума Ответить с цитированием
Старый 14.07.2010, 10:24   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
отрисовывать контролы самостоятельно с UpdateLayeredWindow()
А просто описать для них обработчик WM_PAINT и WM_ERASEBACKGROUND не проще?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2010, 10:54   #4
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А просто описать для них обработчик WM_PAINT и WM_ERASEBACKGROUND не проще?
может и проще сейчас поищу что-нибудь по этому поводу

хех.. что-то не получается осилить WM_PAINT ... не поможете примерчиком?

Последний раз редактировалось Stilet; 14.07.2010 в 12:59.
skalt12 вне форума Ответить с цитированием
Старый 14.07.2010, 12:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

skalt12, давай уточним задачу - ты хочешь сделать форму со скином, ну типа этого. так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2010, 13:43   #6
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
skalt12, давай уточним задачу - ты хочешь сделать форму со скином, ну типа этого. так?
Так точно! Но при всем при этом, пользовать всякие AlphaSkins и ALMDevSkin не тянет... я понимаю, можно использовать просто регионы по изображению, типа *.bmp .. и не париться, но в таком случае, скругленные края будут рваными..
skalt12 вне форума Ответить с цитированием
Старый 14.07.2010, 16:19   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

хм... Да как то я из виду упустил работу с скинами...
В основном только регионами и пользовался...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2010, 19:08   #8
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
хм... Да как то я из виду упустил работу с скинами...
В основном только регионами и пользовался...
так вот я тоже только ими и пользовался, но как-то "обрубки" по краям надоели... да и красивостей хочется, типа тени от окошка, переменной прозрачности и т.п.

А по отрисовке или WM_PAINT идей нету никаких?
skalt12 вне форума Ответить с цитированием
Старый 14.07.2010, 20:22   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ничего у вас не выйдет. Почему? Ищем по форуму год назад а то и больше наверное уже обсуждали такие темы, поверьте вы не первый!
BOBAH13 вне форума Ответить с цитированием
Старый 14.07.2010, 21:35   #10
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Ничего у вас не выйдет. Почему? Ищем по форуму год назад а то и больше наверное уже обсуждали такие темы, поверьте вы не первый!
обидно, однако
skalt12 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
activeform размещение контролов varelik Общие вопросы Delphi 14 21.01.2010 15:42
Создание динамических контролов (MFC, API) Xkey Visual C++ 6 07.11.2009 00:07
Как получить коллекцию контролов в документе WORD в VBA? Dima_S Microsoft Office Word 4 06.11.2009 17:52
Разработка своих контролов - HexEdit Control Ivan_32 Win Api 1 02.03.2009 09:10
Массив контролов Iogan Gamba Puti Win Api 3 24.05.2008 23:45