|
|
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
надо нарисовать непонятной формы картинку. WS_EX_LAYERED - не пойдёт сразу. 2000 не у всех :( Если через регионы, то скажите, как сделать регион, скажем, по иконке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 09:21 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
А какое окно ? Просто прозрачное прямоугольное окно или просто выглядещее как какой то полигон ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 10:03 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
В том и беда, что полигоном это наверно не назовёшь даже. К примеру, надо нарисовать помошника, как в 2000-ом офисе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 10:07 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
Где то в нижереречисленных ссылках в факах быладаже приведена функция создающая регион по картинке. где конкретно не помню, а искать некогда, да и тырнет шас хреновый. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 10:23 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
Одуреть скоко ссылок... А если ограничится Win32API? Я, конечно, понимаю, что всё рано или поздно к нему сойдётся, но неохота копаться в исходниках той же дельфи... Блин! Классная штука LabVIEW - делаешь цвет окну прозрачным - и всё! Кстати, вот ещё вопросец в догонку... Есть две кнопки. Одна перед другой, (в z-order) Нажимаем на переднюю, жмётся какая? Правильно - задняя... Что это за фигня? :( Это я как про LabVIEW вспомнил... Там кнопки реализованы в этом смысле нормально. (Жмёшь переднюю - жмётся передняя, я на этом обалденные интерфейсы делал!!! До сих пор любуюсь...) Более чем нормально. Они тоже могут быть прозрачными, причём на каждую кнопку задаётся 2 цвета: цвет фона и цвет боковушки(на самом деле 4, 2 ещё под цвет текста и цвет фона текста). Благодаря этому можно кнопку помещать, к примеру на границу цветов и всё красиво отрисовывалось... А тут... :((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:05 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
на API см SetWindowRgn ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:10 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:45 |
|
||
|
Как сделать прозрачное окно?
|
|||
|---|---|---|---|
|
#18+
Спасиба! Блин... Я придумал простой до дури способ. В строчек 10... Но этот тоже попробую. В моём немного мелькание видно. Но правда, мне окно нужно небольшое, может на маленьком не так видно будет.... Спасибо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 14:43 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=464&tid=2035677]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 308ms |

| 0 / 0 |
