powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / форма необычного вида
4 сообщений из 4, страница 1 из 1
форма необычного вида
    #33746443
very_need
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста, начинающему программисту на С++. Хочу сделать форму, имеющую необычный вид. Какие библиотеки я вообще могу для этого использовать? какие были бы наиболее оптимальными и приемлимыми?
...
Рейтинг: 0 / 0
форма необычного вида
    #33746964
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на чем пишешь? Меня тут старожилы научили, что надо сразу указывать среду разработки, чтобы меньше было вопросов и помогли быстрее (хотя и сам про это забываю
...
Рейтинг: 0 / 0
форма необычного вида
    #33747048
Лёлик2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
very_needПомогите, пожалуйста, начинающему программисту на С++. Хочу сделать форму, имеющую необычный вид. Какие библиотеки я вообще могу для этого использовать? какие были бы наиболее оптимальными и приемлимыми?


Сам не пробывал, откуда взял не помню, но поскольку смотрю предложений не густо...может и я чем помогу.
1. Автор утверждает что функция вырезает окно по картинке:
HRGN CreateRgnFromBitmap(LPTSTR szFileName = NULL, UINT Num = NULL, LPPOINT pPoint = NULL, BOOL bEqaul = 1)
// szFileName - путь к файлу *.bmp, из которого грузим битмапу
// Num - номер битмапы в ресурсах
// pPoint - указатель на координаты точки, цвет который нас интересует в качестве маски
// bEqual - Если 1, то оставляются все точки, цвет которой задан в маске. Если 0, то наоборот, все точки с заданным цветом "удалятся"
{
HBITMAP hBmp;

if (strlen(szFileName)) // Если предали путь к файлу *.bmp, то
{
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); // выход... можно еще "return 0;"
}

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 );

if (bEqaul) // если 1, то оставлять точки только данного цвета
{
for ( y = 0; y < bi.bmHeight; y++ )
for ( x = 0; x < bi.bmWidth; x++ )
{
// далее получаем цвета каждой точки + некоторые навороты...
t = *(DWORD*)(pBits + (y * bi.bmWidth + x) * bpp)
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)
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; // и возвращаем указатель на регион
}

А теперь где-нибудь в программе делаем так:

POINT pt;
pt.x = 0; pt.y = 0; // координаты точки, цвет которой будет считаться за маску

HRGN hRgn = CreateRgnFromBitmap(szFileNameBuf, IDB_BITMAP, &pt, 0);
// szFileNameBuf - путь к файлу с битмапой (в качестве маски)
// IDB_BITMAP - идентификатор битмапы в ресурсах

SetWindowRgn(hWnd, hRgn, TRUE);




2. Перемещение формы мышью не за заголовок

// Напишите следующий обработчик события OnMouseDown формы
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
long SC_DRAGMOVE = 0xF012;
if(Button == mbLeft)
{
ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
}
}





3.Как сделать кусок окна прозрачным

// Для того чтобы сделать кусок формы прозрачным,
// напишите следующий код:

//Прямоугольный кусок
HRGN R1=CreateRectRgn(0, 0, Width, Height);
HRGN R2=CreateRectRgn(4, 24, Width-4, Height-4);
CombineRgn(R1, R1,R2, RGN_DIFF);
SetWindowRgn(Handle, R1, TRUE);

//Кусок в виде элипса
HRGN hRgn1 = CreateRectRgn(0, 0, Width, Height);
HRGN hRgn2 = CreateEllipticRgn(0, 0, Width, Height);
HRGN hRgn3 = CreateRectRgn(0, 0, Width, Height);
CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);
SetWindowRgn(Handle, hRgn3, TRUE);
//можно заменить hRgn3 на hRgn2

//Кусок в виде пятиугольника
HRGN Reg1, Reg2;
HRGN Region;
POINT p[5];
p[0] = Point(100, 0);
p[1] = Point(Width-100, 0);
p[2] = Point(Width, Height/2);
p[3] = Point(Width/2, Height);
p[4] = Point(0, Height/2);
Region = CreatePolygonRgn(p, 5, ALTERNATE);
SetWindowRgn(Handle, Region, true);



4. Как сделать прозрачную форму в W2K/XP

// Для того чтобы сделать прозрачную форму напишите:
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0 , (255 * Transparency) / 100,
LWA_ALPHA);



5. Прозрачное окно с реакцией на нажатия кнопок, панелей

// Для того чтобы создать форму напишите:
void __fastcall TForm1::Photo()
{
int X0,Y0;
bool Flag;
TRect ScreenRect;
TCanvas* ScreenCanvas=new TCanvas;
try
{
Top=0;
Left=Screen->Width;
Width=Screen->Width;
Height=Screen->Height;
ScreenRect=Rect(0,0,Width,Height);
ScreenCanvas->Handle=GetDC(0);
Image1->Canvas->CopyRect(ScreenRect, ScreenCanvas,ScreenRect);
ReleaseDC(Handle,ScreenCanvas->Handle);
Left=Top;
} __finally
{
delete ScreenCanvas;
}
}




Не знаю есть ли тут что-то для тебя новое, но я пытался помочь.
...
Рейтинг: 0 / 0
форма необычного вида
    #33747447
very_need
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лёлик2
Не знаю есть ли тут что-то для тебя новое, но я пытался помочь.

Большущее спасибо. Сейчас буду разбираться.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / форма необычного вида
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]