|
|
|
форма необычного вида
|
|||
|---|---|---|---|
|
#18+
Помогите, пожалуйста, начинающему программисту на С++. Хочу сделать форму, имеющую необычный вид. Какие библиотеки я вообще могу для этого использовать? какие были бы наиболее оптимальными и приемлимыми? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2006, 17:28 |
|
||
|
форма необычного вида
|
|||
|---|---|---|---|
|
#18+
А на чем пишешь? Меня тут старожилы научили, что надо сразу указывать среду разработки, чтобы меньше было вопросов и помогли быстрее (хотя и сам про это забываю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2006, 23:14 |
|
||
|
форма необычного вида
|
|||
|---|---|---|---|
|
#18+
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; } } Не знаю есть ли тут что-то для тебя новое, но я пытался помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 01:19 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33747447&tid=2031191]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 356ms |

| 0 / 0 |
