Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скин для формы [D5, WinME]


Molotov ©   (2002-01-18 21:04:00) 

Хочу создать прогу с нестандартным окном (типа Windows media player 7.0, Sonique и тд). Причем, меня интересует окно неоднородной формы(т.е не четкая геометрическая фмгура). Знаю функцию SetWindowRgn, но как создать фигуру типа HRGN, какие для этого есть функции? Помогите! Заранее благодарен!


Molotov   (2002-01-19 14:40:00) [1]

Спасибо всем! То, что нужно!


Ajax   (2002-01-19 14:17:00) [2]

То же самое, но на Delphi

function CreateRgnFromBitmap(rgnBitmap: TBitmap): HRGN;
var
transColor: TColor;
i, j: Integer;
width, height: Integer;
left, right: Integer;
rectRgn: HRGN;
begin
Result := 0;
width := rgnBitmap.Width;
height := rgnBitmap.Height;
transColor := rgnBitmap.Canvas.Pixels[width - 1, height - 1];
for i := 0 to height - 1 do
begin
left := -1;
for j := 0 to width - 1 do
begin
if left < 0 then
begin
if rgnBitmap.Canvas.Pixels[j, i] <> transColor then
left := j;
end
else
if rgnBitmap.Canvas.Pixels[j, i] = transColor then
begin
right := j;
rectRgn := CreateRectRgn(left, i, right, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
left := -1;
end;
end;
if left >= 0 then
begin
rectRgn := CreateRectRgn(left, i, width, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
end;
end;
end;


Sergey_n   (2002-01-19 02:21:00) [3]

Update: Ниже представлена улучшенная версия функции, которая требует маску битмапа для TrueColor. В Win9x ширина маски битмапа должна быть DWORD.

HRGN CreateRgnFromFile(HBITMAP hBmp, COLORREF color)
{
// получаем размер маски
BITMAP bm = { 0 };
GetObject( hBmp, sizeof(BITMAP), &bm );

m_dwWidth = bm.bmWidth; // ширина bitmap
m_dwHeight = bm.bmHeight; // высота bitmap

// Распределяем буфер для маски
LPBYTE pBits = new BYTE[ bm.bmWidthBytes * bm.bmHeight ];
// заполняем буфер свойствами
BITMAPINFO bi = { 0 };
bi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
bi.bmiHeader.biBitCount = bm.bmBitsPixel;
bi.bmiHeader.biHeight = bm.bmHeight;
bi.bmiHeader.biWidth = bm.bmWidth;
bi.bmiHeader.biPlanes = bm.bmPlanes;
// заполняем биты буфера
HDC hdc = ::GetDC( NULL );
GetDIBits( hdc, hBmp, 0, bm.bmHeight, pBits, &bi, DIB_RGB_COLORS );
::ReleaseDC( NULL, hdc );

if ( bi.bmiHeader.biBitCount < 16 ) return NULL;

// сдвигаем биты и байт на пиксель (для сравнения цветов)
BYTE sb = 32 - bi.bmiHeader.biBitCount;
BYTE bpp = bi.bmiHeader.biBitCount >> 3;

LPBYTE pClr = (LPBYTE)&color;
// переставляем красный и синий компоненты
BYTE tmp = pClr[0]; pClr[0] = pClr[2]; pClr[2] = tmp;
// convert color if curent DC is 16-bit (5:5:5)
if ( bpp == 2 ) color = ((DWORD)(pClr[0] & 0xf8) >> 3) |
((DWORD)(pClr[1] & 0xf8) nCount >= cBlocks * MAXBUF )
{
LPBYTE pRgnDataNew = new BYTE[ RDHDR +
++cBlocks * MAXBUF * sizeof(RECT) ];
memcpy( pRgnDataNew, pRgnData, RDHDR +
(cBlocks - 1) * MAXBUF * sizeof(RECT));

delete pRgnData;
pRgnData = (RGNDATAHEADER*)pRgnDataNew;
}
wasfirst = false;
}
else if ( !wasfirst && ismask ) // устанавливаем
// wasfirst когда
// маска найдена
{
first = j;
wasfirst = true;
}
}

delete pBits;

// создаём регион
HRGN hRgn = ExtCreateRegion( NULL, RDHDR +
pRgnData->nCount * sizeof(RECT), (LPRGNDATA)pRgnData );

delete pRgnData;

return hRgn;
}


Sergey_n   (2002-01-19 02:20:00) [4]

На Pascal пример не нашел, но нашел на C++, надеюсь разберешся:
Это очень простая функция, создающая регион из bitmap (.bmp) файла. Так же в примере представлен усовершенствованный вариант этой функции, позволяющий задавать маску изображения.

Компилятор: Visual C++ 4-6

Функция называется CreateRgn и имеет два параметра:
szFileName - имя файла, содержащего картинку.
pPoint - указатель на структуру POINT , которая содержит координаты цвета, который используется для конструирования региона, если параметр NULL, то будет использоваться цвет в координате (0, 0).

HRGN CreateRgn(LPTSTR szFileName, LPPOINT pPoint)
{
HBITMAP hBmp = (HBITMAP)LoadImage( NULL, szFileName,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
if ( !hBmp ) return NULL;

BITMAP bi;
BYTE bpp;
DWORD e;
DWORD f, t;
INT i, j;
bool b = false;
HRGN Rgn, ResRgn = CreateRectRgn( 0, 0, 0, 0 );

GetObject( hBmp, sizeof( BITMAP ), &bi );

bpp = bi.bmBitsPixel >> 3;

BYTE *pBits = new BYTE[ bi.bmWidth * bi.bmHeight * bpp ];

int p = GetBitmapBits( hBmp, bi.bmWidth * bi.bmHeight * bpp,
pBits );

if ( pPoint == NULL || pPoint->x >= bi.bmWidth ||
pPoint->y >= bi.bmHeight )
e = *(DWORD*)pBits;
else
e = *(DWORD*)(pBits + (pPoint->y * bi.bmWidth + pPoint->x) * bpp );

e


Hyper-X   (2002-01-18 21:31:00) [5]

Парень есть компонент Varian Skin Factory!!!!Если хоч его напеши мне на crak@ukr.net


Наверх

Титульная страница Поиск, карта сайта Написать письмо