Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:50[Войти] | [Зарегистрироваться]
Ответ на вопрос № 48509

18-01-2007 08:03
Здравствуйте!
Создаю LayeredWindow по PNG картинке (картинки загружаю с помощью модуля pngimage:
http://pngdelphi.sourceforge.net). Код ниже.
Только почему-то никакие контролы на ней не отображаются.
Копался в MSDN, пробовал методом тыка - не получилось :(
Кто знает, в чем загвоздка?

uses
  ..., pngimage;

type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = array [WORD] of TRGBQuad;

...

procedure TForm1.FormCreate(Sender: TObject);
var
  DC: HDC;
  WS: Cardinal;
  R: TRect;
  i, j: integer;
  Row: pRGBQuadArray;
  PNGAlpha: pByteArray;
  Blend: TBlendFunction;
  BmpSize: TSize;
  TopLeft, BmpTopLeft: TPoint;
  FWorkPNG: TPNGObject;
  FWorkBMP: TBitmap;
begin
  WS := GetWindowLong(Self.Handle, GWL_EXSTYLE);
  SetWindowLong(Self.Handle, GWL_EXSTYLE, WS or WS_EX_LAYERED);
  SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_LAYERED);

  GetWindowRect(Self.Handle, R);
  TopLeft.X := R.Left;
  TopLeft.Y := R.Top;

  BmpTopLeft := Point(0, 0);

  FWorkPNG := TPNGObject.Create;
  FWorkPNG.LoadFromFile('help.png');

  BmpSize.cx := FWorkPNG.Width;
  BmpSize.cy := FWorkPNG.Height;

  FWorkBMP := TBitmap.Create;
  FWorkBMP.PixelFormat := pf32Bit;
  FWorkBMP.Width := BmpSize.cx;
  FWorkBMP.Height := BmpSize.cy;
  FWorkBMP.Canvas.Draw(0, 0, FWorkPNG);

  for i := 0 to FWorkBMP.Height - 1 do
  begin
    Row := FWorkBMP.Scanline[i];
    PNGAlpha := FWorkPNG.AlphaScanline[i];
    for j := 0 to FWorkBMP.Width - 1 do
    begin
      Row[j].rgbReserved := PNGAlpha[j];
      Row[j].rgbBlue := Round(Row[j].rgbBlue * Row[j].rgbReserved / 255);
      Row[j].rgbGreen := Round(Row[j].rgbGreen * Row[j].rgbReserved / 255);
      Row[j].rgbRed := Round(Row[j].rgbRed * Row[j].rgbReserved / 255);
    end;
  end;

  DC := GetDC(0);

  with Blend do
  begin
    BlendOp := AC_SRC_OVER;
    BlendFlags := 0;
    SourceConstantAlpha := 255;
    AlphaFormat := AC_SRC_ALPHA;
  end;
 
  UpdateLayeredWindow(Self.Handle, DC, @TopLeft, @BmpSize,
    FWorkBMP.Canvas.Handle, @BmpTopLeft, clNone, @Blend, ULW_ALPHA);

  ReleaseDC(0, DC);
  FWorkPNG.Free;
  FWorkBMP.Free;
end;

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

20-03-2007 05:38
Кстати оффсет у вас получается, потому что не берете в расчет стиль окна - а он с Caption. Либо делайте стиль окна без WS_CAPTION (ну или borderstyle = bsNone), либо учитывайте высоту Caption (см.GetSystemMetrics)

05-03-2007 11:41
2RentGen:
>>>Что-то не въехал, что "это"...
под "этим" я подразумевал что собрал твой код в одну кучу,
немного подшаманил чтоб заработало и добавил пример с двумя картинками
Извини не сразу понял вопрос=)

05-03-2007 11:37
здесь просто не вижу куда можно прикрепить файлы.
хотя форму можно попробовать так
unit.dfm:


object Form1: TForm1
  Left = 294
  Top = 93
  BorderStyle = bsDialog
  Caption = 'Form1'
  ClientHeight = 227
  ClientWidth = 329
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnMouseDown = FormMouseDown
  OnMouseEnter = FormMouseEnter
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 216
    Top = 111
    Width = 33
    Height = 23
    AutoSize = True
    Picture.Data = {
      07544269746D617032090000424D320900000000000036000000280000002100
      0000170000000100180000000000FC080000120B0000120B0000000000000000
      0000E8E8E8E7E7E7E7E7E7E5E5E5E3E3E3E2E2E2DFDFDFDBDBDBD9D9D9D7D7D7
      D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5
      D5D5D5D5D5D5D5D7D7D7D9D9D9DBDBDBDFDFDFE2E2E2E3E3E3E5E5E5E7E7E7E7
      E7E7E8E8E8E8E7E7E7E6E6E6E5E5E5E3E3E3DFDFDFDADADAD6D6D6D0D0D0CDCD
      CDC9C9C9C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6
      C6C6C6C6C6C6C6C6C6C6C6C9C9C9CDCDCDD0D0D0D6D6D6DADADADFDFDFE3E3E3
      E5E5E5E6E6E6E7E7E7E8E6E6E6E4E4E4E2E2E2DDDDDDD7D7D7D0D0D0C9C9C9C2
      C2C2BCBCBCB9B9B9B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5
      B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B9B9B9BCBCBCC2C2C2C9C9C9D0D0D0D7D7
      D7DDDDDDE2E2E2E4E4E4E6E6E6E8E4E4E4E2E2E2DCDCDCD5D5D5CCCCCCC3C3C3
      BBBBBBB2B1B0A7A4A1A09891998D83998D83998D83998D83998D83998D83998D
      83998D83998D83998D83998D83998D83998D83A09891A7A4A1B2B1B0BBBBBBC3
      C3C3CCCCCCD5D5D5DCDCDCE2E2E2E4E4E4E8E3E3E3DDDDDDD5D5D5CBCBCBC0C0
      C0B3B3B2A8A09AB59B81D0AF8DE7C39CF7D2A7F7D2A7F7D2A7F7D2A7F7D2A7F7
      D2A7F7D2A7F7D2A7F7D2A7F7D2A7F7D2A7F7D2A7F7D2A7E7C39CD0AF8DB59B81
      A8A09AB3B3B2C0C0C0CBCBCBD5D5D5DDDDDDE3E3E3E8DFDFDFD7D7D7CDCDCDC0
      C0C0B1AFADB29E8BDDB38DFED2A2FEDBADFFE3B8FFE7BCFFE7BCFFE7BCFFE7BC
      FFE7BCFFE7BCFFE7BCFFE7BCFFE7BCFFE7BCFFE7BCFFE7BCFFE7BCFFE3B8FEDB
      ADFED2A2DDB38DB29E8BB1AFADC0C0C0CDCDCDD7D7D7DFDFDFE8DADADAD0D0D0
      C3C3C3B5B3B1BDA286EEBD8DFECE9DFFD9ABFFE3B6FFEBC0FFF0C4FFF0C4FFF0
      C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FFF0C4FF
      EBC0FFE3B6FFD9ABFECE9DEEBD8DBDA286B5B3B1C3C3C3D0D0D0DADADAE8D6D6
      D6C9C9C9B9B9B8B49B84E1AE80F0BF91FECFA0FFDBAEFFE6BAFFEBC1FFF0C7FF
      F0C7FFF0C7FFF0C7FFF0C7FFF0C7FFF0C7E7DBBA6664600A0A0A474745D4CAAE
      FFF0C7FFEBC1FFE6BAFFDBAEFECFA0F0BF91E1AE80B49B84B9B9B8C9C9C9D6D6
      D6E8D0D0D0C2C2C2B0A49AD39E6DE4B281F0C092FECFA2FFD8ACFFE5B9FFE9BD
      FFECC3FFECC3FFECC3FFECC3FFECC3FFECC3FFECC39590842929283C3B3ABFB5
      A0EADBB8D4C7ACFFE9BDFFE5B9FFD8ACFECFA2F0C092E4B281D39E6DB0A49AC2
      C2C2D0D0D0E8CDCDCDBCBBB9B98D64D39E6DE1AF80EBBC8EF5C89EFED0A6FFDC
      B2FFE1B8FFE5BCFFE5BCFFE5BCFFE5BCFFE5BCFFE5BCFFE5BC8882790B0B0B7F
      7A72DBC9ACBFB19C474645FFE1B8FFDCB2FED0A6F5C89EEBBC8EE1AF80D39E6D
      B98D64BCBBB9CDCDCDE8C9C9C9B7AFA8C38B56D09C6ADCAC7DE5B589EEC195F5
      CAA0FAD0A7FFD6AEFFDBB4FFDBB4FFDBB4FFDBB4FFDBB4FFDBB4FFDBB48B8279
      0C0C0C0F0F0F7F78703C3B390A0A0AFFD6AEFAD0A7F5CAA0EEC195E5B589DCAC
      7DD09C6AC38B56B7AFA8C9C9C9E8C7C7C7B19B85BF8650CD9664D8A574E0B182
      E5B98EEBC096EFC69EF3CAA5F8CFAAF8CFAAF8CFAAF8CFAAF8CFAAF8CFAAD2B6
      9D5956530606060A0A0A0B0B0B27272765615DF3CAA5EFC69EEBC096E5B98EE0
      B182D8A574CD9664BF8650B19B85C7C7C7E8C6C6C6A97F5BBA7E49C8925DD29E
      6DDAA87BE0B387E4B88DE6BC95EAC29BECC69FECC69FECC69FECC69FECC69FC9
      AF9554514E111111585552867D74837B7390857AD8B99AEAC29BE6BC95E4B88D
      E0B387DAA87BD29E6DC8925DBA7E49A97F5BC6C6C6E8C9C9C99F6C40AC6C34BA
      7E47C68D58CF9A68D4A272D9A87CDBAD82DEB187E0B58CCEAC8A8C807481776E
      83797057545111111153504DC1A488E0B58CE0B58CE0B58CE0B58CDEB187DBAD
      82D9A87CD4A272CF9A68C68D58BA7E47AC6C349F6C41C9C9C9E8CDCDCDA6876D
      A06027AF7139BD8049C78D59CD9767D4A272D8A77ADAAC80DBAF86625D592727
      260B0B0B0A0A0A060606575451BEA084DBAF86DBAF86DBAF86DBAF86DBAF86DA
      AC80D8A77AD4A272CD9767C78D59BD8049AF7139A06027A6886ECDCDCDE8D0D0
      D0B6AA9F97541BA6632AB37339C0824DCA9765D5A77EDBB38CDFB893E0BB970A
      0A0A3B3A3979726B0F0F0F0C0C0C837B72E0BB97E0BB97E0BB97E0BB97E0BB97
      E0BB97DFB893DBB38CD5A77ECA9765C0824DB37339A6632A97541BB6ABA0D0D0
      D0E8D6D6D6C7C5C389440C965118A56128B87B44CEA075DCBB9AE3C3A5E5C8AC
      E6C9AF474544B2A395C9B5A37A756F0B0B0B827C76E6C9AFE6C9AFE6C9AFE6C9
      AFE6C9AFE6C9AFE5C8ACE3C3A5DCBB9ACEA075B87B44A5612896511889450DC7
      C6C4D6D6D6E8DADADAD0D0D0AD9587874007954F15AC6F38CDA37CDEC1A5E3C8
      ADE4C9B1E6CEB5C3B3A2D6C1ADB2A5983B3B3A2828288E8780E6CEB5E6CEB5E6
      CEB5E6CEB5E6CEB5E6CEB5E4C9B1E3C8ADDEC1A5CDA37CAC6F37954F15874008
      AE9689D0D0D0DADADAE8DFDFDFD7D7D7CAC8C78A53358338029B5820C2966DD9
      BB9FDEC3AAE1C8AFE3CCB3E3CCB3C1B2A14645450A0A0A63605ED1BEAAE3CCB3
      E3CCB3E3CCB3E3CCB3E3CCB3E3CCB3E1C8AFDEC3AAD9BB9FC2956C9B571F8338
      028B5436CAC9C8D7D7D7DFDFDFE8E3E3E3DDDDDDD5D5D5C3BCB97C3D1C843E0B
      AD7947CDA887D6B99DDABDA3DCC2A8DCC2A8DCC2A8DCC2A8DCC2A8DCC2A8DCC2
      A8DCC2A8DCC2A8DCC2A8DCC2A8DCC2A8DCC2A8DABDA3D6B99DCDA786AC784684
      3E0B7D3E1DC4BDBAD5D5D5DDDDDDE3E3E3E8E4E4E4E2E2E2DCDCDCD5D5D5C4BD
      BB854D3889441CAB774FC29B75CAAA88CFAF91CFAF91CFAF91CFAF91CFAF91CF
      AF91CFAF91CFAF91CFAF91CFAF91CFAF91CFAF91CFAF91CAAA88C29A74AA764E
      89441C864E39C5BEBCD5D5D5DCDCDCE2E2E2E4E4E4E8E6E6E6E4E4E4E2E2E2DD
      DDDDD7D7D7CECCCCAD938E7A30168E4E2EA06A46AB7953AB7953AB7953AB7953
      AB7953AB7953AB7953AB7953AB7953AB7953AB7953AB7953AB7953A06A468E4E
      2E7A3117AE948FCECDCDD7D7D7DDDDDDE2E2E2E4E4E4E6E6E6E8E7E7E7E6E6E6
      E5E5E5E3E3E3DFDFDFDADADAD6D6D6CDCACABAACA99F7B74844B3A844B3A844B
      3A844B3A844B3A844B3A844B3A844B3A844B3A844B3A844B3A844B3A844B3A9F
      7B74BAACA9CDCACAD6D6D6DADADADFDFDFE3E3E3E5E5E5E6E6E6E7E7E7E8}

    Visible = False
    OnMouseLeave = Image1MouseLeave
  end
  object Image2: TImage
    Left = 216
    Top = 111
    Width = 33
    Height = 23
    AutoSize = True
    Picture.Data = {
      07544269746D617032090000424D320900000000000036000000280000002100
      0000170000000100180000000000FC080000120B0000120B0000000000000000
      0000E8E8E8E7E7E7E7E7E7E5E5E5E3E3E3E2E2E2DFDFDFDBDBDBD9D9D9D7D7D7
      D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5
      D5D5D5D5D5D5D5D7D7D7D9D9D9DBDBDBDFDFDFE2E2E2E3E3E3E5E5E5E7E7E7E7
      E7E7E8E8E8E8E7E7E7E6E6E6E5E5E5E3E3E3DFDFDFDADADAD6D6D6D0D0D0CDCD
      CDC9C9C9C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6
      C6C6C6C6C6C6C6C6C6C6C6C9C9C9CDCDCDD0D0D0D6D6D6DADADADFDFDFE3E3E3
      E5E5E5E6E6E6E7E7E7E8E6E6E6E4E4E4E2E2E2DDDDDDD7D7D7D0D0D0C9C9C9C2
      C2C2BCBCBCB9B9B9B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5
      B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B9B9B9BCBCBCC2C2C2C9C9C9D0D0D0D7D7
      D7DDDDDDE2E2E2E4E4E4E6E6E6E8E4E4E4E2E2E2DCDCDCD5D5D5CCCCCCC3C3C3
      BBBBBBADACAC9B98958B837E7970687970687970687970687970687970687970
      687970687970687970687970687970687970688B837E9B9895ADACACBBBBBBC3
      C3C3CCCCCCD5D5D5DCDCDCE2E2E2E4E4E4E8E3E3E3DDDDDDD5D5D5CBCBCBC0C0
      C0B0AFAF968F898775619C836AAD9275B99D7DB99D7DB99D7DB99D7DB99D7DB9
      9D7DB99D7DB99D7DB99D7DB99D7DB99D7DB99D7DB99D7DAD92759C836A877561
      968F89B0AFAFC0C0C0CBCBCBD5D5D5DDDDDDE3E3E3E8DFDFDFD7D7D7CDCDCDC0
      C0C0AAA8A6928172A6866ABE9D79BEA482BFAA8ABFAD8DBFAD8DBFAD8DBFAD8D
      BFAD8DBFAD8DBFAD8DBFAD8DBFAD8DBFAD8DBFAD8DBFAD8DBFAD8DBFAA8ABEA4
      82BE9D79A6866A928172AAA8A6C0C0C0CDCDCDD7D7D7DFDFDFE8DADADAD0D0D0
      C3C3C3ADABA9957F69B28E6ABE9A76BFA380BFAA88BFB090BFB493BFB493BFB4
      93BFB493BFB493BFB493BFB493BFB493BFB493BFB493BFB493BFB493BFB493BF
      B090BFAA88BFA380BE9A76B28E6A957F69ADABA9C3C3C3D0D0D0DADADAE8D6D6
      D6C9C9C9B6B5B4947F6CA98260B48F6DBE9B78BFA482BFAC8BBFB091BFB495BF
      B495BFB495BFB495BFB495BFB495BFB495B4AB915F5E5A0A0A0A454543A9A28D
      BFB495BFB091BFAC8BBFA482BE9B78B48F6DA98260947F6CB6B5B4C9C9C9D6D6
      D6E8D0D0D0C2C2C29F948B9E7652AB8561B4906DBE9B79BFA281BFAC8BBFAF8E
      BFB192BFB192BFB192BFB192BFB192BFB192BFB192837F762828283A3A399E96
      86B5A98FA9A08BBFAF8EBFAC8BBFA281BE9B79B4906DAB85619E76529F948BC2
      C2C2D0D0D0E8CDCDCDB7B6B58A6A4C9E7652A98360B08D6AB89676BE9C7CBFA5
      85BFA98ABFAC8DBFAC8DBFAC8DBFAC8DBFAC8DBFAC8DBFAC8D7A756F0B0B0B73
      6F69AEA18B9E9483454443BFA98ABFA585BE9C7CB89676B08D6AA983609E7652
      8A6A4CB7B6B5CDCDCDE8C9C9C9ABA39D9268409C754FA5815EAC8867B29170B8
      9778BB9C7DBFA082BFA487BFA487BFA487BFA487BFA487BFA487BFA4877C756F
      0C0C0C0F0F0F736D683A39380A0A0ABFA082BB9C7DB89778B29170AC8867A581
      5E9C754F926840ABA39DC9C9C9E8C7C7C79986738F643C9A704BA27C57A88561
      AC8B6AB09070B39476B6977CBA9B7FBA9B7FBA9B7FBA9B7FBA9B7FBA9B7FA893
      7F5552500606060A0A0A0B0B0B2726265E5B58B6977CB39476B09070AC8B6AA8
      8561A27C579A704B8F643C998673C7C7C7E8C6C6C68665488B5E37966D469D76
      52A37E5CA88665AB8A6AAC8D70AF9174B19477B19477B19477B19477B19477A1
      8D7A4F4D4B11111154514F78716B76706A7F776EA89179AF9174AC8D70AB8A6A
      A88665A37E5C9D7652966D468B5E37866548C6C6C6E8C9C9C97F56338151278B
      5E35946A429B734E9F7955A37E5DA48261A68565A88869A1876E7C736A746D67
      766F6753504E1111114F4D4A9B8570A88869A88869A88869A88869A68565A482
      61A37E5D9F79559B734E946A428B5E358151277F5734C9C9C9E8CDCDCD8F745E
      78481D83552B8E6037956A439A714D9F7955A27D5BA38160A483645C58552626
      260B0B0B0A0A0A06060653504E99826DA48364A48364A48364A48364A48364A3
      8160A27D5B9F79559A714D956A438E603783552B78481D8F755FCDCDCDE8D0D0
      D0A99E94713F147C4A1F86562B90613A97714CA07D5EA48669A78A6EA88C710A
      0A0A3938386E69630F0F0F0C0C0C767069A88C71A88C71A88C71A88C71A88C71
      A88C71A78A6EA48669A07D5E97714C90613A86562B7C4A1F713F14AA9F95D0D0
      D0E8D6D6D6C3C0BF673309703D127C491E8A5C339A7858A58C73AA927CAC9681
      AC978344434394897EA192846F6B670B0B0B75716CAC9783AC9783AC9783AC97
      83AC9783AC9783AC9681AA927CA58C739A78588A5C337C491E703D1267340AC4
      C1C0D6D6D6E8DADADAD0D0D09C877A653005703B1081532A9A7A5DA6917CAA96
      82AB9785AC9A889C9084A59687948A813A39392828287E7873AC9A88AC9A88AC
      9A88AC9A88AC9A88AC9A88AB9785AA9682A6917C9A7A5D81532A703B10653006
      9D887CD0D0D0DADADAE8DFDFDFD7D7D7C7C5C372452C622A01744218917052A3
      8C77A6927FA99683AA9986AA99869B90834443430A0A0A5D5B59A29585AA9986
      AA9986AA9986AA9986AA9986AA9986A99683A6927FA38C77917051744218622A
      0173462DC8C6C4D7D7D7DFDFDFE8E3E3E3DDDDDDD5D5D5BCB5B3623016632E08
      825B359A7E65A08B76A38E7AA5917EA5917EA5917EA5917EA5917EA5917EA591
      7EA5917EA5917EA5917EA5917EA5917EA5917EA38E7AA08B769A7E65825A3463
      2E08633117BDB6B4D5D5D5DDDDDDE3E3E3E8E4E4E4E2E2E2DCDCDCD5D5D5BCB5
      B46C3F2D67331580593B917458977F669B836D9B836D9B836D9B836D9B836D9B
      836D9B836D9B836D9B836D9B836D9B836D9B836D9B836D977F6691745880583A
      6733156D402EBDB6B5D5D5D5DCDCDCE2E2E2E4E4E4E8E6E6E6E4E4E4E2E2E2DD
      DDDDD7D7D7CBC9C99C857F5C24106A3A22784F34805B3E805B3E805B3E805B3E
      805B3E805B3E805B3E805B3E805B3E805B3E805B3E805B3E805B3E784F346A3A
      225C25119D8680CCCACAD7D7D7DDDDDDE2E2E2E4E4E4E6E6E6E8E7E7E7E6E6E6
      E5E5E5E3E3E3DFDFDFDADADAD6D6D6C8C6C6ADA09E886A63683C2D683C2D683C
      2D683C2D683C2D683C2D683C2D683C2D683C2D683C2D683C2D683C2D683C2D88
      6A63ADA09EC8C6C6D6D6D6DADADADFDFDFE3E3E3E5E5E5E6E6E6E7E7E7E8}

    OnMouseEnter = Image2MouseEnter
  end
  object Button1: TButton
    Left = 216
    Top = 80
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end



ты не первый кто сказал что пример не рабочий=(
но у меня работает

05-03-2007 11:19
2 qnxoid:
Что-то не въехал, что "это"...
Может я image'и не так расположил или еще что-то?
Вижу ту же Layered форму, но с двумя черными квадратами (image'ми) на ней.
Можете пояснить?

я там в тех имиджах две картинки кнопки засунул. если интересуют исходники пиши в личку - вышлю.

26-02-2007 16:25 | Сообщение от автора вопроса
2 qnxoid:
>сейчас за 3 минуты заделал это
Что-то не въехал, что "это"...
Может я image'и не так расположил или еще что-то?
Вижу ту же Layered форму, но с двумя черными квадратами (image'ми) на ней.
Можете пояснить?

>вот на этих двух сайтах чёто есть
Как раз по этому примеру на VC++ с CodeProject'а собственно и создавал такую форму в Delphi.
К сожалению, там ничего нет по отрисовке дочерних форм на LayeredWindow.

Интересно, что на форумах sources.ru зарегистрироваться удалось почему-то только после указания в поле "пол" значения "я не знаю :)" ))) До этого страница не грузилась :)

25-02-2007 14:09
по яндексу можно врубить поиск UpdateLayeredWindow

вот на этих двух сайтах чёто есть, а там региться надо, но лень было
http://www.codeproject.com/gdi/pxalphablend.asp
http://forum.sources.ru/index.php?showtopic=124875&view=showall

24-02-2007 04:28
Да и плюс ко всему надо ещё проверять рабочую платформу на Windows 9х.
А то юзер так и не воспользуется ФУНКЦИОНАЛЬНОСТЬЮ проги
И под Win9x выдавать пользователю более простую форму.

24-02-2007 04:14
тупо, не вникая в суть кода RentGen'a
сейчас за 3 минуты заделал это:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, pngimage, StdCtrls, Buttons, ExtCtrls;

type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = array [WORD] of TRGBQuad; 

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure Image1MouseLeave(Sender: TObject);
    procedure Image2MouseEnter(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseEnter(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure UpdateWindow;
    procedure PremultiplyBitmapRect(BMP: TBitmap; const Rect: TRect);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  FWorkBMP: TBitmap;
  Blend: TBlendFunction;
  BmpSize: TSize;
  TopLeft, BmpTopLeft: TPoint;
implementation

{$R *.dfm}

function ShiftRect(const R: TRect; const P: TPoint): TRect;
begin
  result.Left := R.Left + P.X;
  result.Top := R.Top + P.Y;
  result.Right := R.Right + P.X;
  result.Bottom := R.Bottom + P.Y;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  DC: HDC;
  WS: Cardinal;
  R: TRect;
  i, j: integer;
  Row: pRGBQuadArray;
  PNGAlpha: pByteArray;
  FWorkPNG: TPNGObject;

begin
  WS := GetWindowLong(Self.Handle, GWL_EXSTYLE);
  SetWindowLong(Self.Handle, GWL_EXSTYLE, WS or WS_EX_LAYERED);
  SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_LAYERED);

  GetWindowRect(Self.Handle, R);
  TopLeft.X := R.Left;
  TopLeft.Y := R.Top;

  BmpTopLeft := Point(0, 0);

  FWorkPNG := TPNGObject.Create;
  FWorkPNG.LoadFromFile('back.png');

  BmpSize.cx := FWorkPNG.Width;
  BmpSize.cy := FWorkPNG.Height;

  FWorkBMP := TBitmap.Create;
  FWorkBMP.PixelFormat := pf32Bit;
  FWorkBMP.Width := BmpSize.cx;
  FWorkBMP.Height := BmpSize.cy;
  FWorkBMP.Canvas.Draw(0, 0, FWorkPNG);

  for i := 0 to FWorkBMP.Height - 1 do
  begin
    Row := FWorkBMP.Scanline[i];
    PNGAlpha := FWorkPNG.AlphaScanline[i];
    for j := 0 to FWorkBMP.Width - 1 do
    begin
      Row[j].rgbReserved := PNGAlpha[j];
      Row[j].rgbBlue := Round(Row[j].rgbBlue * Row[j].rgbReserved / 255);
      Row[j].rgbGreen := Round(Row[j].rgbGreen * Row[j].rgbReserved / 255);
      Row[j].rgbRed := Round(Row[j].rgbRed * Row[j].rgbReserved / 255);
    end;
  end;

  DC := GetDC(0);

  with Blend do
  begin
    BlendOp := AC_SRC_OVER;
    BlendFlags := 0;
    SourceConstantAlpha := 255;
    AlphaFormat := AC_SRC_ALPHA;
  end;
 
  UpdateLayeredWindow(Self.Handle, DC, @TopLeft, @BmpSize,
    FWorkBMP.Canvas.Handle, @BmpTopLeft, clNone, @Blend, ULW_ALPHA);

  ReleaseDC(0, DC);
  FWorkPNG.Free;
//  FWorkBMP.Free;
end;

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

procedure TForm1.FormMouseEnter(Sender: TObject);
begin
UpdateWindow;
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
Image2.Visible:=true;
Image1.Visible:=false;
UpdateWindow;
end;

procedure TForm1.Image2MouseEnter(Sender: TObject);
begin
Image1.Visible:=true;
Image2.Visible:=false;
UpdateWindow;
end;

procedure TForm1.UpdateWindow;
var
  DC: HDC;
begin
  if Assigned(FWorkBMP) then
  begin
    DC := GetDC(0);
    TopLeft.X := Left;
    TopLeft.Y := Top;
    Button1.PaintTo(FWorkBMP.Canvas, Button1.Left, Button1.Top);
    PremultiplyBitmapRect(FWorkBMP, ShiftRect(Button1.ClientRect, Point(Button1.Left, Button1.Top)));
if Image1.Visible then
  Begin
    // у Image не было PaintTo =)
    FWorkBMP.Canvas.Draw(Image1.Left,Image1.Top,Image1.Picture.Bitmap);
    PremultiplyBitmapRect(FWorkBMP, ShiftRect(Image1.ClientRect, Point(Image1.Left, Image1.Top)));
  end;
if Image2.Visible then
  Begin
    FWorkBMP.Canvas.Draw(Image2.Left,Image2.Top,Image2.Picture.Bitmap);
    PremultiplyBitmapRect(FWorkBMP, ShiftRect(Image2.ClientRect, Point(Image2.Left, Image2.Top)));
  end;
// правда картинки сдвинуты вверх, на какую-то дельту
// поэтому надо ещё позырить
    UpdateLayeredWindow(Self.Handle, DC, @TopLeft, @BmpSize,
      FWorkBMP.Canvas.Handle, @BmpTopLeft, clNone, @Blend, ULW_ALPHA);
    ReleaseDC(0, DC);
  end;
end;

procedure TForm1.PremultiplyBitmapRect(BMP: TBitmap; const Rect: TRect);
var
  i, j: integer;
  Row: pRGBQuadArray;
begin
  for i := Rect.Top to Rect.Bottom - 1 do
  begin
    Row := BMP.Scanline[i];
    for j := Rect.Left to Rect.Right - 1 do
    begin
      Row[j].rgbReserved := MaxByte;
      Row[j].rgbBlue := Round(Row[j].rgbBlue * Row[j].rgbReserved / MaxByte);
      Row[j].rgbGreen := Round(Row[j].rgbGreen * Row[j].rgbReserved / MaxByte);
      Row[j].rgbRed := Round(Row[j].rgbRed * Row[j].rgbReserved / MaxByte);
    end;
  end;
end;


end.





28-01-2007 11:06 | Сообщение от автора вопроса
Я над этим думал, но ничего подходящего в голову не пришло.
Есть, конечно, вариант - реализовать у нужных компонентов метод PaintTo,
но это не решит второй проблемы, когда компонент сам обновляет свое содержимое.

Решил сделать перерыв - глядишь потом и придет умная мысль :)

28-01-2007 08:29
вопрос ещё один назрел а как быть с теми компонентами у которых нет PaintTo и ещё курсор не видно в Edite ((

20-01-2007 10:22 | Сообщение от автора вопроса
function ShiftRect(const R: TRect; const P: TPoint): TRect;
begin
  result.Left := R.Left + P.X;
  result.Top := R.Top + P.Y;
  result.Right := R.Right + P.X;
  result.Bottom := R.Bottom + P.Y;
end;

20-01-2007 10:19 | Сообщение от автора вопроса
Ах да! Забыл про PremultiplyBitmapRect. Вот она:

procedure TForm1.PremultiplyBitmapRect(BMP: TBitmap; const Rect: TRect);
var
  i, j: integer;
  Row: pRGBQuadArray;
begin
  for i := Rect.Top to Rect.Bottom - 1 do
  begin
    Row := BMP.Scanline[i];
    for j := Rect.Left to Rect.Right - 1 do
    begin
      Row[j].rgbReserved := MaxByte;
      Row[j].rgbBlue := Round(Row[j].rgbBlue * Row[j].rgbReserved / MaxByte);
      Row[j].rgbGreen := Round(Row[j].rgbGreen * Row[j].rgbReserved / MaxByte);
      Row[j].rgbRed := Round(Row[j].rgbRed * Row[j].rgbReserved / MaxByte);
    end;
  end;
end;

20-01-2007 10:16 | Сообщение от автора вопроса
Решил проблему таким способом.

procedure TForm1.UpdateWindow;
var
  DC: HDC;
begin
  if Assigned(FWorkBMP) then
  begin
    DC := GetDC(0);
    TopLeft.X := Left;
    TopLeft.Y := Top;
    Button1.PaintTo(FWorkBMP.Canvas, Button1.Left, Button1.Top);
    PremultiplyBitmapRect(FWorkBMP, ShiftRect(Button1.ClientRect, Point(Button1.Left, Button1.Top)));

    UpdateLayeredWindow(Self.Handle, DC, @TopLeft, @BmpSize,
      FWorkBMP.Canvas.Handle, @BmpTopLeft, clNone, @Blend, ULW_ALPHA);
    ReleaseDC(0, DC);
  end;
end;

Т.е. просто рисуем все визуальные компоненты (в данном примере только одну кнопку)
на битмэп, который потом передаем в UpdateLayeredWindow.
UpdateWindow вызываем каждый раз, когда нужно обновить содержимое формы.
Конечно все это нужно еще довести до ума, определив все события при которых будет вызываться UpdateWindow. Для начала попробовал на WM_MOVE и событиях мыши - работает отлично :)

19-01-2007 04:00
Дело в том, что вызовы SetLayeredWindowAttributes и UpdateLayeredWindow заставляет систему вести себя принципиально по разному по отношению к окну.
С помощью SetLayeredWindowAttributes можно добавить окну полупрозрачность, но при этом оно будет по прежему получать сообщения WM_PAINT и корректно прорисовывать все свои контролы. При этом все вызовы UpdateLayeredWindow будут терпеть неудачу до тех пор, пока стиль WS_EX_LAYERED не будет сброшен и установлен вручную заново.
Вызов же UpdateLayeredWindow заставит систему обновить содержимое окна (в него войдет только то, что вы передадите в параметрах функции), и за всю дальнейшую перерисовку будет отвечать Windows.

Загляните в MSDN, там это все описано.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/updatelayeredwindow.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setlayeredwindowattributes.asp

18-01-2007 19:17 | Сообщение от автора вопроса
Спасибо!
Статьи почитал, примеры посмотрел... Весьма познавательно.
И все же не совсем понятно как использовать SetLayeredWindowAttributes для
того, чтобы рисовать контролы на layered window, о чем упоминается здесь:

The second way to use layered windows is to continue using the Win32 painting paradigm, but allowing the system to redirect all the drawing for the layered window and its children into an off-screen bitmap. This can be done by calling SetLayeredWindowAttributes with the desired constant alpha value and/or the color-key. Once the API has been called, the system will start redirecting all drawing by the window and automatically apply the specified effects.

Не подскажете где ее (SetLayeredWindowAttributes) нужно использовать приведенном выше коде?

18-01-2007 15:46
там есть пример http://chime.student.utwente.nl/qweerdy/pngskin5.zip на асме поэтому даже алгоритма не знаю

18-01-2007 15:44
я вот тем же занимаюсь
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=47917

18-01-2007 08:16
Только почему-то никакие контролы на ней не отображаются.

А они и не должны отображаться. Это такая особенность Layered-окон. Контролы придется отрисовывать самому. Почему так происходит, немного описано здесь. если вкратце, то Layered-окно перестает получать сообщение WM_PAINT и компонент никогда не получит команду на отрисовку самого себя.

http://www.gotdotnet.ru/Forums/Windows/118870.aspx
http://contest2005.gotdotnet.ru/Request/Tools/UtilitiesLib/174003.aspx

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования