Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > нестандартные окна


Автор: max07 11.8.2006, 22:05
Привет,

хочется узнать как сделать форму в виде,  допустим какой нибудь картинки. Чтоб фон картинки стал прозрачным, а окно приняло форму картинки??? P.S. вроде с регионами надо игратся?!  smile 
 smile 

Пасибо. 

Автор: jonie 11.8.2006, 23:24
агу.. с регионами... ну дык а далее msdn ?)...ну или посмотри в гугле - делфячных примеров море.... а там уж и до С рукой подать

Автор: witeman 12.8.2006, 00:46
Вот пример из книжки (создание скругленного окна)
Код

 RECT R =GetClientRect();
 HRGN MyReion=CreateRoundRectRgn(0,0,428,272,15,15);
 SetWindowRgn(Handle,MyReion,true);

Может чем-то поможет smile 

Автор: Damarus 12.8.2006, 00:50
Вот пример:
Код

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPSTR lpCmdLine, int nCmdShow)
{
    // Загружаем картинку из ресурсов
    HBITMAP hBackBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BACK));
    // Ширина и высота для простоты определены константно
    const int BitmapWidth = 300;
    const int BitmapHeight = 300;

    HDC hBackBitmapDC = CreateCompatibleDC(NULL);
    SelectObject(hBackBitmapDC, hBackBitmap);

    // Получаем цвет, который будет прозрачным (пиксель 0,0)
    COLORREF TransparentColor = GetPixel(hBackBitmapDC, 0, 0);
    // Создаём главный регион
    HRGN hMainWndRgn = CreateRectRgn(0, 0, BitmapWidth, BitmapHeight);
    for (int y = 0 ; y < BitmapHeight ; y++)
    {
        for (int x = 0 ; x < BitmapWidth ; x++)
        {
            // Проверяем цвет текущего пикселя
            if (GetPixel(hBackBitmapDC, x, y) == TransparentColor)
            {
                // Создаём временный регион
                HRGN hTempRgn = CreateRectRgn(x, y, x + 1, y + 1);
                // Вычитаем из главного региона временный
                CombineRgn(hMainWndRgn, hMainWndRgn, hTempRgn, RGN_XOR);
                DeleteObject(hTempRgn);
            }
        }
    }

    DeleteDC(hBackBitmapDC);

    WNDCLASSEX wc = { 0 };
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance     = hInstance;
    wc.lpfnWndProc   = WndProc;
    wc.lpszClassName = "max07_class";
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = CreatePatternBrush(hBackBitmap);
    RegisterClassEx(&wc);

    HWND hWnd = CreateWindowEx(0, "max07_class", "max07", WS_POPUP, 100, 100,
        BitmapWidth, BitmapHeight, NULL, NULL, hInstance, NULL);
    // Устанавливаем новый регион окна
    SetWindowRgn(hWnd, hMainWndRgn, FALSE);
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0) != FALSE)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    DeleteObject(hMainWndRgn);
    DeleteObject(hBackBitmap);

    return static_cast<int>(msg.wParam);
}


Но создавать регион динамически слишком медленно, лучше сделать это отдельно и записать данные региона в файл, а в программе загружать и создавать регион на основе этих данных (ExtCreateRegion).

Автор: Friackazoid 12.8.2006, 00:58
max07
там все очень просто
загружаешь bitmap, делаешь из него массив, самый первый эл-т принимаешь за нулевой (самый первый пиксель картинки должен быть цветом фона), потом проходишься по этому массиву ишешь не нулевые эл-ты и объединяешь из в регионы
А вообше http://www.goldfaq.ru/modules/mydownloads/visit.php?cid=5&lid=9&PHPSESSID=e6d8793d6f84772f746be5c019e7c1ea

Автор: CatOleg 12.8.2006, 15:31
Ложиш на форму TImage, загружаеш в него рисунок, а дальше дописуеш в коде :

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Image1->AutoSize = true;
 Form1->ClientHeight = Image1->Height;
 Form1->ClientWidth = Image1->Width;
 Form1->BorderStyle = bsNone;
 Form1->TransparentColor = true;
// Устанавливаем прозрачный цвет в данном случае точка(0,0)
 Form1->TransparentColorValue = Image1->Canvas->Pixels[0][0];
}

Автор: max07 17.8.2006, 22:53
Form1->TransparentColor = true;
Form1->TransparentColorValue = Image1->Canvas->Pixels[0][0];


Такого ваще нет... 

CatOleg,
В этом случае только картинки фон становится прозрачным, а надо ещё окну форму картинки придать, как это сделать в  BCB?

Автор: deniska 18.8.2006, 09:43
В общем слушай сюда я как раз тоже с этим заморочился и вот что надыбал:
функция, создающая регион формой картинки (ее взял где-то в нашем факе):
Код

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


Код

//создание формы
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   bmp = new Graphics::TBitmap;
   bmp->LoadFromFile( ExtractFileDir( Application->ExeName )+"\\testimage.bmp" );//картинка бмп любой формы
   TPoint p;
   p.x = 1;
   p.y = 1;
   HRGN hReg = CreateRgnFromBitmap( bmp, p, true );
   SetWindowRgn( Form1->Handle, hReg, true );
   DeleteObject( hReg );
}

после этого форма должна принять форму картинки
если еще нужно чтоб на форме еще и отображался данный рисунок то:
Код

void __fastcall TForm1::FormPaint(TObject *Sender)
{
   Graphics::TBitmap* Bmp;
   Bmp = new Graphics::TBitmap;
   Bmp->LoadFromFile( ExtractFileDir( Application->ExeName )+"\\testimage.bmp" );
   HBITMAP hSkinBmp = Bmp->Handle;
   HDC dcSkin = CreateCompatibleDC(0);
   HBITMAP hOldBmp = (HBITMAP)SelectObject(dcSkin, hSkinBmp);
   BitBlt(GetDC(Form1->Handle), 0,0,Bmp->Width,Bmp->Height, dcSkin, 0,0, SRCCOPY);
   ReleaseDC( Form1->Handle, dcSkin );
   DeleteObject( hOldBmp );
   DeleteObject( hSkinBmp );
   delete Bmp;
}


а если еще и таскать форму за любое место хочешь smile  то в хэдере пишешь
Код

private:
        void __fastcall OnMove(TWMNCHitTest &Message);
public:        // User declarations
        BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER (WM_NCHITTEST,TWMNCHitTest,OnMove)
        END_MESSAGE_MAP (TComponent)

а в срр
Код

void __fastcall TForm1::OnMove(TWMNCHitTest &Message)
{
   Message.Result = HTCAPTION;
}

ну вот, все что нашел.
у меня все работает.
Люди, если кто-нибудь делал красивые кнопки нестандартной формы, с градиентной заливкой в билдере отзовитесь smile !!!!

Автор: Damarus 18.8.2006, 15:52
Цитата(deniska @  18.8.2006,  10:43 Найти цитируемый пост)
В общем слушай сюда я как раз тоже с этим заморочился и вот что надыбал:функция, создающая регион формой картинки (ее взял где-то в нашем факе):

Неиспользуемые обьекты надо удалять  smile 

Автор: max07 18.8.2006, 22:12
Пасибо всем smile 

Автор: WOODDY 7.12.2007, 02:17
А вот как редактироват такую форму не подскажите? Например кнопки подабавлять и тд.
так как на самой форме у меня оно не отображается и только наугад вставлять приходится, что не есть очень удобно.

Автор: artsb 7.12.2007, 18:57
Кинь Image, засунь в него свою картинку. А потом когда всё сделаешь Image удалишь. smile 

Автор: WOODDY 2.1.2008, 17:48
Цитата(artsb @ 7.12.2007,  18:57)
Кинь Image, засунь в него свою картинку. А потом когда всё сделаешь Image удалишь. smile

спасибо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)