Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нестандартные окна 
:(
    Опции темы
max07
Дата 11.8.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 21.12.2004

Репутация: нет
Всего: нет



Привет,

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

Пасибо. 
PM MAIL   Вверх
jonie
Дата 11.8.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
witeman
Дата 12.8.2006, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.3.2005
Где: г.Тюмень

Репутация: нет
Всего: нет



Вот пример из книжки (создание скругленного окна)
Код

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

Может чем-то поможет smile 
PM MAIL WWW   Вверх
Damarus
Дата 12.8.2006, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



Вот пример:
Код

#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).
PM MAIL ICQ Jabber   Вверх
Friackazoid
Дата 12.8.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 23.2.2006

Репутация: нет
Всего: 3



max07
там все очень просто
загружаешь bitmap, делаешь из него массив, самый первый эл-т принимаешь за нулевой (самый первый пиксель картинки должен быть цветом фона), потом проходишься по этому массиву ишешь не нулевые эл-ты и объединяешь из в регионы
А вообше вот
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
CatOleg
Дата 12.8.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.7.2005
Где: Запорожье

Репутация: нет
Всего: нет



Ложиш на форму 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];
}
PM MAIL WWW   Вверх
max07
Дата 17.8.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 21.12.2004

Репутация: нет
Всего: нет



Form1->TransparentColor = true;
Form1->TransparentColorValue = Image1->Canvas->Pixels[0][0];


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

CatOleg,
В этом случае только картинки фон становится прозрачным, а надо ещё окну форму картинки придать, как это сделать в  BCB?
PM MAIL   Вверх
deniska
Дата 18.8.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



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

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 !!!!
PM MAIL ICQ   Вверх
Damarus
Дата 18.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



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

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

PM MAIL ICQ Jabber   Вверх
max07
Дата 18.8.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 21.12.2004

Репутация: нет
Всего: нет



Пасибо всем smile 
PM MAIL   Вверх
WOODDY
Дата 7.12.2007, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
artsb
Дата 7.12.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
WOODDY
Дата 2.1.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



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

спасибо  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.