|
Сформировать форму по картинке... или хотя бы круглую сделать!
#32731059
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Как сделать круглую или овальную форму? Ну и наверно нет смысла, но всё-таки, если... может можно сделать форму по картинке?
В C++Builder`e функция выглядит так:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
HRGN CreateRgnFromBitmap(Graphics::TBitmap *bmp, TPoint pPoint, bool bEqaul = true)
{
int f, x, y;
bool b = false;
HRGN Rgn, ResRgn = CreateRectRgn( 0 , 0 , 0 , 0 );
for (y = 0 ; y < bmp->Height; y++)
for (x = 0 ; x < bmp->Width; x++)
{
if (!bEqaul^(bmp->Canvas->Pixels[x][y] != bmp->Canvas->Pixels[pPoint.x][pPoint.y]))
{
if (!b)
{ f = x; b = true; }
else
if (x == (bmp->Width - 1 ))
{
Rgn = CreateRectRgn(f, y, x, y + 1 );
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
else
if (b)
{
Rgn = CreateRectRgn(f, y, x, y + 1 );
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
b = false;
}
}
return ResRgn;
}
а в Delphy так:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122.
HRGN CreateRgnFromBitmap(LPTSTR szFileName = NULL, UINT Num = NULL, LPPOINT pPoint = NULL, BOOL bEqaul = 1 )
{
HBITMAP hBmp;
if (strlen(szFileName))
{
hBmp = (HBITMAP)LoadImage( NULL, szFileName, IMAGE_BITMAP, 0 , 0 , LR_LOADFROMFILE );
if (!hBmp)
{
MessageBox(hWND, "There is not bitmap", "Error", MB_OK | MB_ICONEXCLAMATION);
hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(Num));
strcpy(szFileName, "");
}
}
else if (Num)
{
hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(Num));
}
else
return 0 ;
if (!hBmp)
{
MessageBox(hWND, "Can't load bitmap", "Error", MB_OK | MB_ICONSTOP);
CloseWindow(hWND);
}
BITMAP bi;
GetObject(hBmp, sizeof(BITMAP), &bi); // получаем размеры битмапы...
int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
RECT R;
GetWindowRect(hWND, &R);
MoveWindow(hWND,
R.left,
R.top,
bi.bmWidth,
bi.bmHeight,
1 ); // меняем размеры окна
BYTE bpp;
DWORD e;
DWORD f, t;
INT x, y;
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 <<= 32 - bi.bmBitsPixel;
if (bEqaul)
{
for ( y = 0 ; y < bi.bmHeight; y++ )
for ( x = 0 ; x < bi.bmWidth; x++ )
{
t = *(DWORD*)(pBits + (y * bi.bmWidth + x) * bpp) << ( 32 - bi.bmBitsPixel);
if ( t == e )
{
if ( !b )
{
f = x;
b = true;
}
else if ( x == (bi.bmWidth - 1 ) )
{
Rgn = CreateRectRgn( f, y, x, y + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR );
b = false;
}
}
else if ( b )
{
Rgn = CreateRectRgn( f, y, x, y + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR );
b = false;
}
}
}
else
{
for ( y = 0 ; y < bi.bmHeight; y++ )
for ( x = 0 ; x < bi.bmWidth; x++ )
{
t = *(DWORD*)(pBits + (y * bi.bmWidth + x) * bpp) << ( 32 - bi.bmBitsPixel);
if ( t != e )
{
if ( !b )
{
f = x;
b = true;
}
else if ( x == (bi.bmWidth - 1 ) )
{
Rgn = CreateRectRgn( f, y, x, y + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR );
b = false;
}
}
else if ( b )
{
Rgn = CreateRectRgn( f, y, x, y + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR );
b = false;
}
}
}
delete pBits;
return ResRgn;
}
Если есть такой маньяк, чтобы на басик переделать, ... я буду очень благодарен!!!
|
|
|