Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Мастера DELPHI. Новости мира компонент, FAQ, статьи...


Информационный Канал Subscribe.Ru

Ежедневная рассылка сайта Мастера DELPHI

DELPHIMASTER.ru

Выпуск от 23.07.04 09:18

Лучшее из нашего FAQ   |x|
Отображаем текст в System Tray.
Данный код сперва конвертирует Ваш текст в DIB, а затем DIB в иконку и далее в ресурс. После этого изображение иконки отображается в System Tray.
Совместимость: Все версии Delphi
Пример:

Вызов просходит следующим образом....

StringToIcon('This Is Made By Ruslan K. Abu Zant');

N.B>> Не забудьте удалить объект HIcon, после вызова функции...


unit MainForm;
interface

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

type
TForm1 = class(TForm)
  Button1: TButton;
  Image1: TImage;
  Timer1: TTimer;
  procedure Button1Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
private
  function StringToIcon (const st : string) : HIcon;
public
  { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

type
ICONIMAGE = record
  Width, Height, Colors : DWORD; // Ширина, Высота и кол-во цветов
  lpBits : PChar;                // указатель на DIB биты
  dwNumBytes : DWORD;            // Сколько байт?
  lpbi : PBitmapInfoHeader;      // указатель на заголовок
  lpXOR : PChar;                  // указатель на XOR биты изображения
  lpAND : PChar;                  // указатель на AND биты изображения
end;

function CopyColorTable (var lpTarget : BITMAPINFO; const lpSource :
BITMAPINFO) : boolean;
var
dc : HDC;
hPal : HPALETTE;
pe : array [0..255] of PALETTEENTRY;
i : Integer;
begin
resul! t := Fal se;
case (lpTarget.bmiHeader.biBitCount) of
  8 :
    if lpSource.bmiHeader.biBitCount = 8 then
    begin
      Move (lpSource.bmiColors, lpTarget.bmiColors, 256 * sizeof (RGBQUAD));
      result := True
    end
    else
    begin
      dc := GetDC (0);
      if dc <> 0 then
      try
        hPal := CreateHalftonePalette (dc);
        if hPal <> 0 then
        try
          if GetPaletteEntries (hPal, 0, 256, pe) <> 0 then
          begin
            for i := 0 to 255 do
            begin
              lpTarget.bmiColors [i].rgbRed := pe [i].peRed;
              lpTarget.bmiColors [i].rgbGreen := pe [i].peGreen;
              lpTarget.bmiColors [i].rgbBlue := pe [i].peBlue;
              lpTarget.bmiColors [i].rgbReserved := pe [i].peFlags
            end;
            result := True
          end
        finally
          DeleteObject (hPal)
        end
      finally
        ReleaseDC (0, dc)
      end
    end;

  4 :
    if lpSource.bmiHeader.biBitCount = 4 then
    begin
     ! Move (l pSource.bmiColors, lpTarget.bmiColors, 16 * sizeof (RGBQUAD));
      result := True
    end
    else
    begin
      hPal := GetStockObject (DEFAULT_PALETTE);
      if (hPal <> 0) and (GetPaletteEntries (hPal, 0, 16, pe) <> 0) then
      begin
        for i := 0 to 15 do
        begin
          lpTarget.bmiColors [i].rgbRed := pe [i].peRed;
          lpTarget.bmiColors [i].rgbGreen := pe [i].peGreen;
          lpTarget.bmiColors [i].rgbBlue := pe [i].peBlue;
          lpTarget.bmiColors [i].rgbReserved := pe [i].peFlags
        end;
        result := True
  & nbsp;   end
    end;
  1:
    begin
      i := 0;
      lpTarget.bmiColors[i].rgbRed := 0;
      lpTarget.bmiColors[i].rgbGreen := 0;
      lpTarget.bmiColors[i].rgbBlue := 0;
      lpTarget.bmiColors[i].rgbReserved := 0;
      i := 1;
      lpTarget.bmiColors[i].rgbRed := 255;
      lpTarget.bmiColors[i].rgbGreen := 255;
      lpTarget.bmiColors[i].rgbBlue := 255;
      lpTarget.bmiColors[i].rgbReserved := 0;
      result := True
     end;
  else
    result := True
end
end;

function WidthBytes (bits : DWORD) : DWORD;
begin
result := ((bits + 31) shr 5) shl 2
end;

function BytesPerLine (const bmih : BITMAPINFOHE! ADER) : DWORD;
begin
result := WidthBytes (bmih.biWidth * bmih.biPlanes * bmih.biBitCount)
end;

function DIBNumColors (const lpbi : BitmapInfoHeader) : word;
var
dwClrUsed : DWORD;
begin
dwClrUsed := lpbi.biClrUsed;
if dwClrUsed <> 0 then
  result := Word (dwClrUsed)
else
  case lpbi.biBitCount of
    1 : result := 2;
    4 : result := 16;
    8 : result := 256
    else
      result := 0
  end
end;

function PaletteSize (const lpbi : BitmapInfoHeader) : word;
begin
result := DIBNumColors (lpbi) * sizeof (RGBQUAD)
end;

function FindDIBBits (const lpbi : BitmapInfo) : PChar;
begin
result := @lpbi;
result := result + lpbi.bmiHeader.biSize + PaletteSize (lpbi.bmiH eader)
end;

function ConvertDIBFormat (var lpSrcDIB : BITMAPINFO; nWidth, nHeight, nbpp : DWORD; bStretch : boolean) :
PBitmapInfo;
var
lpbmi : PBITMAPINFO;
lpSourceBits, lpTargetBits : Pointer;
DC, hSourceDC, hTargetDC : HDC;
hSourceBitmap, hTargetBitmap, hOldTargetBitmap, hOldSourceBitmap :
HBITMAP;
dwSourceBitsSize, dwTargetBitsSize, dwTargetHeaderSize : DWORD;
begin
result := Nil;
  // Располагаем и заполняем структуру BITMAPINFO для нового DIB
  // Обеспечиваем достаточно места для 256-цветной таблицы
dwTargetHeaderSize := sizeof ( BITMAPINFO ) + ( 256 * sizeof( RGBQUAD ) );
GetMem (lpbmi, dwTargetHeaderSize);
try
  lpbmi^.bmiHeader.biSize := sizeof (BITMAPINFOHEADER);
  lpbmi^.bmiHeader.biWidth := nWidth;
  lpbmi^.bmiHeader.biHeight := nHeight;
  lpbmi^.bmiHeader.biPlanes := 1;
  lpbmi^.bm iHeader.biBitCount := nbpp;
  lpbmi^.bmiHeader.biC! ompressi on := BI_RGB;
  lpbmi^.bmiHeader.biSizeImage := 0;
  lpbmi^.bmiHeader.biXPelsPerMeter := 0;
  lpbmi^.bmiHeader.biYPelsPerMeter := 0;
  lpbmi^.bmiHeader.biClrUsed := 0;
  lpbmi^.bmiHeader.biClrImportant := 0;     // Заполняем в таблице цветов
  if CopyColorTable (lpbmi^, lpSrcDIB) then
  begin
    DC := GetDC (0);
    hTargetBitmap := CreateDIBSection (DC, lpbmi^, DIB_RGB_COLORS,
lpTargetBits, 0, 0 );
    hSourceBitmap := CreateDIBSection (DC, lpSrcDIB, DIB_RGB_COLORS,
lpSourceBits, 0, 0 );

    try
      if (dc <> 0) and (hTargetBitmap <> 0) and (hSourceBitmap <> 0) then
      begin
        hSourceDC := CreateCompatibleDC (DC);
        hTargetDC := CreateCompatibleDC (DC);
        try
          if (hSourceDC <> 0) and (hTargetDC <> 0) then
          begin
            // Flip the bits on the source DIBSection to match the source DIB
            dwSourceBitsSize := DWORD (lpSrcDIB.bmiHeader.biHeight) * BytesPerLine(lpSrcDIB.bmiHeader);
            dwTargetBitsSize := DWORD (lpbmi^.bmiHeader.biHeight) *
BytesPerLine(lpbmi^.bmiHeader);
            Move (FindDIBBits (lpSrcDIB)^, lpSourceBits^, dwSourceBitsSize );

            // Select DIBSections into DCs
            hOldSourceBitmap := SelectObject( hSourceDC, hSourceBitmap );
            hOldTargetBitmap := SelectObject( hTargetDC, hTargetBitmap );

            try
!               if (hOldSourceBitmap <> 0) and (hOldTargetBitmap <> 0) then
              begin
          // Устанавливаем таблицу цветов для DIBSections
                if lpSrcDIB.bmiHeader.biBitCount <= 8 then
                    SetDIBColorTable (hSourceDC, 0, 1 shl lpSrcDIB.bmiHeader.biBitCount, lpSrcDIB.bmiColors);

                if lpbmi^.bmiHeader.biBitCount <= 8  then
                    SetDIBColorTable (hTargetDC, 0, 1 shl
lpbmi^.bmiHeader.biBitCount, lpbmi^.bmiColors );

                 // If we are asking for a straight copy, do it
                if (lpSrcDIB.bmiHeader.biWidth = lpbmi^.bmiHeader.biWidth) and (lpSrcDIB.bmiHeader.biHeight = lpbmi^.bmiHeader.biHeight) then
                  BitBlt (hTargetDC, 0, 0, lpbmi^.bmiHeader.biWidth, lpbmi^.bmiHeader.biHeight, hSourceDC, 0, 0, SRCCOPY)
                else
                  if bStretch then
                  begin
                    SetStretchBltMode (hTargetDC, COLORONCOLOR);
                    StretchBlt (hTargetDC, 0, 0, lpbmi^.bmiHeader.biWidth,
lpbmi^.bmiHeader.biHeight,
hSourceDC, 0, 0, lpSrcDIB.bmiHeader.biWidth, lpSrcDIB.bmiHeader.biHei ght,
SRCCOPY )
          &! nbsp; &n bsp;     end
                  else
                    BitBlt (hTargetDC, 0, 0, lpbmi^.bmiHeader.biWidth, lpbmi^.bmiHeader.biHeight, hSourceDC, 0, 0, SRCCOPY );

                GDIFlush;
                GetMem (result, Integer (dwTargetHeaderSize + dwTargetBitsSize));

                Move (lpbmi^, result^, dwTargetHeaderSize);
                Move (lpTargetBits^, FindDIBBits (result^)^, dwTargetBitsSize)
              end
            finally
              if hOldSourceBitmap <> 0 then SelectObject (hSourceDC, hOldSourceBitmap);               if hOldTargetBitmap <> 0 then SelectObject (hTargetDC, hOldTargetBitmap);
            end
          end
        finally
          if hSourceDC <> 0 then DeleteDC (hSourceDC);
          if hTargetDC <> 0 then DeleteDC (hTargetDC)
        end
      end;
    finally
      if hTargetBitmap <> 0 then DeleteObject (hTargetBitmap);
      if hSourceBitmap <> 0 then DeleteObject (hSourceBitmap);
      if dc <> 0 then ReleaseDC (0, dc)
    end
  end
finally
  FreeMem (lpbmi)
end
end; < br>
function DIBToIconImage (var lpii : ICO! NIMAGE; var lpDIB : BitmapInfo;
bStretch : boolean) : boolean;
var
lpNewDIB : PBitmapInfo;
begin
result := False;
lpNewDIB := ConvertDIBFormat (lpDIB, lpii.Width, lpii.Height, lpii.Colors,
bStretch );
if Assigned (lpNewDIB) then
try

  lpii.dwNumBytes := sizeof (BITMAPINFOHEADER)                          // Заголовок
                    + PaletteSize (lpNewDIB^.bmiHeader)                      // Палитра
                    + lpii.Height * BytesPerLine (lpNewDIB^.bmiHeader)  // XOR маска
                    + lpii.Height * WIDTHBYTES (lpii.Width);               & nbsp;  // AND маска
     // Если здесь уже картинка, то освобождаем её
  if lpii.lpBits <> Nil then
    FreeMem (lpii.lpBits);

  GetMem (lpii.lpBits,  lpii.dwNumBytes);
  Move (lpNewDib^, lpii.lpBits^, sizeof (BITMAPINFOHEADER) + PaletteSize
(lpNewDIB^.bmiHeader));
    // Выравниваем внутренние указатели/переменные для новой картинки
  lpii.lpbi := PBITMAPINFOHEADER (lpii.lpBits);
  lpii.lpbi^.biHeight := lpii.lpbi^.biHeight * 2;

  lpii.lpXOR := FindDIBBits (PBitmapInfo (lpii.lpbi)^);
  Move (FindDIBBits (lpNewDIB^)^, lpii.lpXOR^, lpii.Height * BytesPerLine
(lpNewDIB^.bmiHeader));

  lpii.lpAND := lpii.lpXOR + lpii.Height * BytesPerLine
(lpNewDIB^.bmiHeader);
  Fillchar (lpii.lpAnd^, lpii.Height * WIDTHBYTES (lpii.Width), $00);

  result := True
finally   FreeMem (lpNewDIB)
end
end; !

function TForm1.StringToIcon (const st : string) : HIcon;
var
memDC : HDC;
bmp : HBITMAP;
oldObj : HGDIOBJ;
rect : TRect;
size : TSize;
infoHeaderSize : DWORD;
imageSize : DWORD;
infoHeader : PBitmapInfo;
icon : IconImage;
oldFont : HFONT;

begin
result := 0;
memDC := CreateCompatibleDC (0);
if memDC <> 0 then
try
  bmp := CreateCompatibleBitmap (Canvas.Handle, 16, 16);
  if bmp <> 0 then
  try
    oldObj := SelectObject (memDC, bmp);
    if oldObj <> 0 then
    try
      rect.Left := 0;
      rect.top := 0;
      rect.Right := 16;
      rect.Bottom := 16;
      SetTextColor (memDC, RGB (255, 0, 0));
      SetBkColor (memDC, RGB (128, 128, 128));
      oldFont := SelectObject (memDC, font.Handle);
      GetTextExtentPoint32 (memDC, PChar (st), Length (st), size);
      ExtTextOut (memDC, (rect.Right - size.cx) div 2, (rect.Bottom - size.cy) div 2, ETO_OPAQUE, @rect, PChar (st), Length (st), Nil);
      SelectObject (memDC, oldFont);
      GDIFlush;

      GetDibSizes (bmp, infoHeaderSize, imageSize);
      GetMem (infoHeader, infoHeaderSize + ImageSize);
      try
        GetDib (bmp, SystemPalette16, infoHeader^, PChar (DWORD (infoHeader) + infoHeaderSize)^);

        icon.Colors := 4;
        icon.Width := 32;
        icon.Height := 32;
        icon.lpBits := Nil;
        if DibToIconImage (icon, info Header^, True) then
        ! try
          result := CreateIconFromResource (PByte (icon.lpBits), icon.dwNumBytes, True, $00030000);
        Finally
          FreeMem (icon.lpBits)
        end
      finally
        FreeMem (infoHeader)
      end

    finally
      SelectObject (memDC, oldOBJ)
    end
  finally
    DeleteObject (bmp)
  end
finally
  DeleteDC (memDC)
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Application.Icon.Handle := StringToIcon ('0');
Timer1.Enabled := True;
Button1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const i : Integer = 0;
begin
I nc (i);
if i = 100 then i := 1;
Application.Icon.Handle := StringToIcon (IntToStr (i));

end;
end.


Автор: Ruslan Abu Zant (delphi@neo.net.ua)
Источник: http://www.sources.ru/delphi/

»»» Прислать свои комментарии

Обсуждается в конференциях   |x|
У нас большой выбор статей   |x|
Красота - это страшная сила.
В этой статье я рассматриваю несколько способов сделать форму красивой. Примеры, рассмотренные здесь, имеют скорее эстетическую, чем практическую ценность, но, я думаю, ими можно воспользоваться при оформлении окон вашей, уважаемые читатели,программы. Для оформления я рассмотрю несколько способов залития формы градиентной заливкой (пример такой заливки - инсталляторы, в которых пользователь любуется красивым окном, пока программа делает своё чёрное дело).
Новинки книжного рынка   |x|
Экстремальное программирование: постановка процесса. С первых шагов и до победного конца
Экстремальное программирование задает простой вопрос: «Каким образом небольшая группа самых обыкновенных, заурядных разработчиков может создать программный продукт, во всех отношениях удовлетворяющий требованиям заказчика?» Эта книга отвечает на данный вопрос. Авторы не любят вдаваться в методологические дискуссии. Конечно же, в свое время они прислушивались к самым разнообразным доводам. Они анализировали их, разделяли их на части, пытались применить их частично и в целом. Сейчас они знают, что работает, а что — нет. Они также знают, почему.
Автор: Ken Auer, Roy Miller
Опрос населения :)
Образование программиста?
»»» Высшее
»»» Незаконченное высшее
»»» Среднее специальное
»»» Среднее
Для души

Хокку дня
Из-под черной ладони
Рыбак улыбается вслед
Кошке, укравшей рыбу.

Афоризмы
Счастливого Рождества всем моим друзьям, кроме двоих! (Уильям Клод Филдс)

Фраза дня
Лучше плохо, чем никогда.

Дурацкие законы (информация предоставлена сайтом kurilka.com)
В Коннектикуте (США) велосипедистам запрещено ездить со скоростью больше ста километров в час.
В городе Девон в Коннектикуте (США) запрещается ходить задом после заката солнца.

И на закуску коротенький анекдот
Вчера арабский террорист подложил в израильский ресторан свинью!

Фотоприколы.
Начните день с хорошего настроения!
http://www.delphimaster.ru/cgi-bin/prikol.pl?id=43753051


На этом позвольте откланяться и пожелать вам удачного дня.
Искренне ваш, Алексей (merlin@delphimaster.ru)

Добро пожаловать на сайт -= Мастера DELPHI =- 

http://subscribe.ru/
E-mail: ask@subscribe.ru
Адрес подписки
Отписаться

В избранное