Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ShIvADeSt Блин, да там VCL Я плохо разбираюсь в некоторых конструкциях кода - всякие TBitmap и подобные Image.Canvas.Pixels[0, y] смущают. Остальное впринципе не проблема под Апи переделать. Значит, сделал вот так, подобие скина Винампа с кнопками Медиа плейера Виндовс. Вроде для примера смотрится очень даже ничего. http://webdrive.avtograd.ru/Download/Explorer/temp/skincore.zip Только есть вопросик. Почему не работают пункты системного контекстного меню - WM_CONTEXTMENU? Эм, без понятия если честно. False возвращаю, а толку... и еще одна особенность. После запуска программки если вызвать это меню - оно как-бы не поиницализировано чтоли - пункты без изменения и все активны. А вот если подвигать диалог программы - пункты принимают впринципе нормальный вид - пункт закрытия выделяется жирным шрифтом и другие пункты неактивны становятся. Но если жать на пункты - не работают. В чем собственно дело? А функцию переделал так: Код: function BitmapToRgn(szPathFile: WideString): HRGN; var Bitmap: HBITMAP; BmpInfo : TBitmapInfo; TmpRgn: HRGN; x, y: integer; ConsecutivePixels: integer; TranparentColor: COLORREF; //Прозрачный цвет CurrentPixel: COLORREF; CurrentColor: COLORREF; MskBmpDC:HDC; begin Bitmap := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); GetObject(Bitmap, SizeOf(BmpInfo), @BmpInfo); Result := CreateRectRgn(0, 0, BmpInfo.bmiHeader.biWidth, BmpInfo.bmiHeader.biHeight); if (BmpInfo.bmiHeader.biWidth = 0) or (BmpInfo.bmiHeader.biHeight = 0) then exit; MskBmpDC := CreateCompatibleDC(0); SelectObject(MskBmpDC, Bitmap); TranparentColor := GetPixel(MskBmpDC, x, y); for y := 0 to BmpInfo.bmiHeader.biHeight - 1 do begin CurrentColor := GetPixel(MskBmpDC,0, y); ConsecutivePixels := 1; for x := 0 to BmpInfo.bmiHeader.biWidth - 1 do begin CurrentPixel := GetPixel(MskBmpDC,x, y); if CurrentColor = CurrentPixel then inc(ConsecutivePixels) else begin if CurrentColor = TranparentColor then begin TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); DeleteObject(TmpRgn); end; CurrentColor := CurrentPixel; ConsecutivePixels := 1; end; end; end; DeleteObject(Bitmap); DeleteDC(MskBmpDC); if (CurrentColor = TranparentColor) and (ConsecutivePixels > 0) then begin TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); DeleteObject(TmpRgn); end; end; | Но походу неправильно переделал. Немного непонятно как часть кода перевести. |