powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать прозрачное окно?
8 сообщений из 8, страница 1 из 1
Как сделать прозрачное окно?
    #32348623
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо нарисовать непонятной формы картинку.

WS_EX_LAYERED - не пойдёт сразу. 2000 не у всех :(

Если через регионы, то скажите, как сделать регион, скажем, по иконке?
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32348675
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какое окно ? Просто прозрачное прямоугольное окно или просто выглядещее как какой то полигон ?
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32348682
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том и беда, что полигоном это наверно не назовёшь даже.

К примеру, надо нарисовать помошника, как в 2000-ом офисе.
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32348715
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где то в нижереречисленных ссылках в факах быладаже приведена функция создающая регион по картинке. где конкретно не помню, а искать некогда, да и тырнет шас хреновый.

http://blackman.wp-club.net/myfaq/cont2.php
http://www.delphiworld.narod.ru/classes.html
http://www.sql.ru/forum/actualtopics.aspx?bid=21
http://forum.oszone.net/forums.cgi?forum=18
http://www.softforum.ru/news.exe?cmd=xover&group=cps.borland.cbuilder&utag=
http://www.interface.ru/cbbook/cover.htm
http://www.bcbdev.ru/newsarchive.htm
http://www.bcbdev.ru/phpbb/index.php?sid=e34c745c4667e24eacda2ec5bf64753f
http://faqs.org.ru/progr/c_cpp/cbuilder.htm
http://www.progz.ru/viewforum.php?=5&topicdays=0&start=0&sid=a5ea2e6d65235962ddf1fb8855c80e46
http://bcbdev.hypermart.net/articles.shtml
http://www.interface.ru/cbbook/cover.htm
http://www.infocity.kiev.ua/main.phtml?r=section.php?sec=1
http://www.rxlib.ru/Downl/Downl.htm
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32348943
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одуреть скоко ссылок...

А если ограничится Win32API?
Я, конечно, понимаю, что всё рано или поздно к нему сойдётся, но неохота копаться в исходниках той же дельфи...

Блин! Классная штука LabVIEW - делаешь цвет окну прозрачным - и всё!

Кстати, вот ещё вопросец в догонку...

Есть две кнопки. Одна перед другой, (в z-order) Нажимаем на переднюю, жмётся какая? Правильно - задняя... Что это за фигня? :(
Это я как про LabVIEW вспомнил... Там кнопки реализованы в этом смысле нормально. (Жмёшь переднюю - жмётся передняя, я на этом обалденные интерфейсы делал!!! До сих пор любуюсь...) Более чем нормально. Они тоже могут быть прозрачными, причём на каждую кнопку задаётся 2 цвета: цвет фона и цвет боковушки(на самом деле 4, 2 ещё под цвет текста и цвет фона текста). Благодаря этому можно кнопку помещать, к примеру на границу цветов и всё красиво отрисовывалось...
А тут... :(((
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32348955
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на API см SetWindowRgn
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32349035
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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);
...
Рейтинг: 0 / 0
Как сделать прозрачное окно?
    #32349275
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасиба!

Блин...
Я придумал простой до дури способ.
В строчек 10...

Но этот тоже попробую. В моём немного мелькание видно. Но правда, мне окно нужно небольшое, может на маленьком не так видно будет....

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


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