Фоновый рисунок окна
От: ivanovnikolay  
Дата: 19.04.06 10:04
Оценка:
VC++ 7.0 (WTL/ATL)
Задача: реализовать скин. Нужно по картинке из файла сделать форму.
Пока я сделал так: делаю 2 файла. Первый двухцветный — типа маска. По этой картинке делаю регион (выбираю определенный цвет) — окно становится, например, со скругленными краями. А второй файл уже нормальная картинка и его рисую в качестве background.
Вопрос: может можно нарисовать одну картинку с прозрачными пикселами и какой-нибудь функцией наложить ее на форму и форма станет прозрачной где надо и background сразу будет?
И еще: как изменить размер окна, унаследованного от CDialogImpl? Что-то width и height нету?
Спасибо.
Re: Фоновый рисунок окна
От: Константин Л. Франция  
Дата: 19.04.06 10:11
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>VC++ 7.0 (WTL/ATL)

I>Задача: реализовать скин. Нужно по картинке из файла сделать форму.
I>Пока я сделал так: делаю 2 файла. Первый двухцветный — типа маска. По этой картинке делаю регион (выбираю определенный цвет) — окно становится, например, со скругленными краями. А второй файл уже нормальная картинка и его рисую в качестве background.
I>Вопрос: может можно нарисовать одну картинку с прозрачными пикселами и какой-нибудь функцией наложить ее на форму и форма станет прозрачной где надо и background сразу будет?

I>И еще: как изменить размер окна, унаследованного от CDialogImpl? Что-то width и height нету?

I>Спасибо.

SetWindowPos
Re: Фоновый рисунок окна
От: BuHHunyx Беларусь  
Дата: 19.04.06 11:23
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>VC++ 7.0 (WTL/ATL)

I>Задача: реализовать скин. Нужно по картинке из файла сделать форму.
I>Пока я сделал так: делаю 2 файла. Первый двухцветный — типа маска. По этой картинке делаю регион (выбираю определенный цвет) — окно становится, например, со скругленными краями. А второй файл уже нормальная картинка и его рисую в качестве background.
I>Вопрос: может можно нарисовать одну картинку с прозрачными пикселами и какой-нибудь функцией наложить ее на форму и форма станет прозрачной где надо и background сразу будет?
[]

Можно залить прозрачные регионы например 0xFF00FF, а при отрисовке делать TransparentBlt с указанным цветом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Фоновый рисунок окна
От: ivanovnikolay  
Дата: 20.04.06 08:42
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Можно залить прозрачные регионы например 0xFF00FF, а при отрисовке делать TransparentBlt с указанным цветом.


Вот код, но он почему-то нен работает :-(
void DrawWindowBackground(HWND m_DrawhWnd, HDC TVDC)
{
int TVWidth , TVHeight;
RECT rc;
::GetClientRect(m_DrawhWnd, &rc);
TVWidth = rc.right — (rc.left );
TVHeight = rc.bottom — (rc.top);
HBITMAP bg;
HDC bdc;
bg=::LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
bdc = ::CreateCompatibleDC(TVDC);
HBITMAP oldBMP = (HBITMAP)::SelectObject(bdc, bg);
::TransparentBlt (TVDC, 0, 0, TVWidth , TVHeight , bdc, 0, 0, TVWidth , TVHeight , RGB(255,0,255) );
::SelectObject(bdc, oldBMP);
::ReleaseDC (m_DrawhWnd, TVDC);
::DeleteDC(bdc);
::DeleteObject(bg);
::DeleteObject(oldBMP);
}
Что не так — не пойму!
Re[3]: Фоновый рисунок окна
От: BuHHunyx Беларусь  
Дата: 20.04.06 09:00
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>Здравствуйте, BuHHunyx, Вы писали:


BHH>>Можно залить прозрачные регионы например 0xFF00FF, а при отрисовке делать TransparentBlt с указанным цветом.


I>Вот код, но он почему-то нен работает



I>
void DrawWindowBackground(HWND m_DrawhWnd, HDC TVDC)
I>{
I>   int TVWidth , TVHeight;
I>   RECT rc;
I>   ::GetClientRect(m_DrawhWnd, &rc);
I>   TVWidth = rc.right - (rc.left );
I>   TVHeight = rc.bottom - (rc.top);
I>   HBITMAP bg;
I>   HDC bdc;
I>   bg=::LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
I>   bdc = ::CreateCompatibleDC(TVDC);
I>   HBITMAP oldBMP = (HBITMAP)::SelectObject(bdc, bg);
I>   ::TransparentBlt (TVDC, 0, 0, TVWidth , TVHeight , bdc, 0, 0, TVWidth , TVHeight , RGB(255,0,255) );
I>   ::SelectObject(bdc, oldBMP);
I>   ::ReleaseDC (m_DrawhWnd, TVDC);
I>   ::DeleteDC(bdc);
I>   ::DeleteObject(bg);
I>   ::DeleteObject(oldBMP);
I>}


I>Что не так — не пойму!


А вызовы этой функции глянуть можно?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Фоновый рисунок окна
От: ivanovnikolay  
Дата: 20.04.06 09:48
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>А вызовы этой функции глянуть можно?


...
MESSAGE_HANDLER(WM_PAINT, OnPaint)
...
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if(wParam != NULL) DoPaint((HDC)wParam);
else
{
CPaintDC dc(m_hWnd);
DoPaint(dc.m_hDC);
}
return 0;
}
...
void DoPaint(CDCHandle dc)
{
RECT rc;
GetClientRect(&rc);
if (!painting)
{
painting = true;
DrawWindowBackground(m_MainhWnd, dc.m_hDC);//INN
painting=false;
}
}

Вот.
Спасибо.
Re[5]: Фоновый рисунок окна
От: BuHHunyx Беларусь  
Дата: 20.04.06 10:09
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>Здравствуйте, BuHHunyx, Вы писали:


BHH>>А вызовы этой функции глянуть можно?


I>...

I>MESSAGE_HANDLER(WM_PAINT, OnPaint)
I>...
I>LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
I>{
I> if(wParam != NULL) DoPaint((HDC)wParam);
I> else
I> {
I> CPaintDC dc(m_hWnd);
I> DoPaint(dc.m_hDC);
I> }
I> return 0;
I>}
I>...
I>void DoPaint(CDCHandle dc)
I>{
I> RECT rc;
I> GetClientRect(&rc);
I> if (!painting)
I> {
I> painting = true;
I> DrawWindowBackground(m_MainhWnd, dc.m_hDC);//INN
I> painting=false;
I> }
I>}

I>Вот.

I>Спасибо.

Попробуем переписать на WTL :

void DrawWindowBackground(HWND m_DrawhWnd, HDC TVDC)
{
int TVWidth , TVHeight;
CRect rc;
::GetClientRect(m_DrawhWnd, &rc);
TVWidth = rc.Width();
TVHeight = rc.Height();

CBitmap bg;
bg.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));
СDC bdc;
bdc.CreateCompatibleDC(TVDC);
HBITMAP oldBMP = bdc.SelectBitmap(bg);
::TransparentBlt (TVDC, 0, 0, TVWidth , TVHeight , bdc, 0, 0, TVWidth , TVHeight , RGB(255,0,255) );
bdc.SelectBitmap(oldBMP);
}


Если сразу не заработает — звиняй, писалось в Янусе
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Фоновый рисунок окна
От: ivanovnikolay  
Дата: 20.04.06 11:36
Оценка:
Наконец-то, заработало. Спасибо большое.
А теперь тогда еще такой вопрос: хотелось бы чтобы контролы Static Text были прозрачны, т.е. их серый фон не был виден, а виден был рисунок на форме под ними, но чтобы надписи они отображали. Вижу свойство Transparent у Static Text, но он что-то никак не влияет.
Re[7]: Фоновый рисунок окна
От: Константин Л. Франция  
Дата: 20.04.06 11:56
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>Наконец-то, заработало. Спасибо большое.

I>А теперь тогда еще такой вопрос: хотелось бы чтобы контролы Static Text были прозрачны, т.е. их серый фон не был виден, а виден был рисунок на форме под ними, но чтобы надписи они отображали. Вижу свойство Transparent у Static Text, но он что-то никак не влияет.

У парента твоего статика нужно обработать WM_CTLCOLORSTATIC, и в обработчике вернуть 0
Re[7]: Фоновый рисунок окна
От: BuHHunyx Беларусь  
Дата: 20.04.06 12:05
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>Наконец-то, заработало. Спасибо большое.

I>А теперь тогда еще такой вопрос: хотелось бы чтобы контролы Static Text были прозрачны, т.е. их серый фон не был виден, а виден был рисунок на форме под ними, но чтобы надписи они отображали. Вижу свойство Transparent у Static Text, но он что-то никак не влияет.

LRESULT OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    CDCHandle dc((HDC)wParam);
    dc.SetBkMode(TRANSPARENT);
    return (LRESULT)(HBRUSH)GetStockObject(NULL_BRUSH);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Фоновый рисунок окна
От: ivanovnikolay  
Дата: 20.04.06 12:49
Оценка:
А теперь новый текст накладывается на старый до тех пор, пока окно не перерисуется.
Может функцию написать, которая будет устанавливать новый текст, а потом Invalidate()?
Re[9]: Фоновый рисунок окна
От: BuHHunyx Беларусь  
Дата: 20.04.06 12:57
Оценка:
Здравствуйте, ivanovnikolay, Вы писали:

I>А теперь новый текст накладывается на старый до тех пор, пока окно не перерисуется.

I>Может функцию написать, которая будет устанавливать новый текст, а потом Invalidate()?

Попробуй.
Я в конце концов перехватил WM_PAINT
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Фоновый рисунок окна
От: ivanovnikolay  
Дата: 20.04.06 15:27
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Я в конце концов перехватил WM_PAINT :(


Т.е. рисуй Static Text сам?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.