Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

фон окна - изображение

60K
22 сентября 2010 года
rokotokobot
15 / / 22.09.2010
Собственно, как сделать фоном окна, изображение? И чтобы при перетаскивании окна оно не мерцало? :(
399
22 сентября 2010 года
KIV
432 / / 20.01.2009
Во-первых, при регистрации класса окна поставить Brush в 0, чтобы система не пыталась сама рисовать фон окна. Мерцание происходит из-за этого. Во-вторых, в обработчике WM_PAINT рисовать картинку с помощью BitBlt. Или StretchBlt, если её надо растягивать под размер окна.
9.0K
23 сентября 2010 года
grag63
71 / / 23.01.2006
Отрисовывай картинку по событию WM_ERASEBKGND.
60K
24 сентября 2010 года
rokotokobot
15 / / 22.09.2010
Код:
case WM_ERASEBKGND:
        {
            hDC = GetDC(hWnd);
            BITMAP bm;
            HDC hdcMem;
            HBITMAP back = (HBITMAP)LoadImageW(NULL, L".\image\1-1.png" , IMAGE_BITMAP, 330, 403, LR_LOADFROMFILE);

            hdcMem=CreateCompatibleDC(hDC);
            SelectObject(hdcMem, back);
            GetObject(back, sizeof(BITMAP), (LPVOID)&bm);
            RECT r;
            GetClientRect(hWnd, &r);
            if (!bm.bmWidth || !bm.bmHeight)
               return 0;

            int w=r.right-r.left,
               h=r.bottom-r.top,
               bw=bm.bmWidth,
               bh=bm.bmHeight;

            for(int i = 0; i < w; i += bw)
               for(int j = 0; j < h; j += bh)
                   BitBlt(hDC, i, j, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

           DeleteDC(hdcMem);
        }
      break;


делаю так, получаю прозрачное окно, картинка не грузится =(
60K
26 сентября 2010 года
rokotokobot
15 / / 22.09.2010
собственно не понятно грузится ли картинка в HBITMAP, ибо перепробывал все, фон все равно прозрачный, как проверить грузится что туда или нет, при пошаговой отладки на эту переменную вылезает такое "unused = CXX0030: ошибка: невозможно вычислить выражение" как это лечить?
399
26 сентября 2010 года
KIV
432 / / 20.01.2009
Если LoadImage вернул не 0, то картинка загружена успешно. Кстати, её лучше подгрузить заранее, а не в ERASEBKGND.
60K
26 сентября 2010 года
rokotokobot
15 / / 22.09.2010
подгружаю её в самом начале как глобальную перемнную =)
60K
26 сентября 2010 года
rokotokobot
15 / / 22.09.2010
и использую не LoadImage, а нашёл функцию на гди+ для работы с пнг которая пнг подгружает в HBITMAP , но что-то все равно не могу понять что не так

все это выглядит так

Код:
HBITMAP back = AtlLoadGdiplusImage(IDB_MAIN1);

....

    case WM_ERASEBKGND:
        {
                HDC hdc, hdcMem;
        hdc = GetDC(hWnd);
        SelectObject(hdcMem, back);
 
        BitBlt(hDC, 0, 0, 330, 400, hdcMem, 0, 0, SRCCOPY);

        EndPaint(hWnd, &ps);
           
        }
      break;
399
26 сентября 2010 года
KIV
432 / / 20.01.2009
Цитата:
case WM_ERASEBKGND:
{
HDC hdc, hdcMem;
hdc = GetDC(hWnd);
SelectObject(hdcMem, back);

BitBlt(hDC, 0, 0, 330, 400, hdcMem, 0, 0, SRCCOPY);

EndPaint(hWnd, &ps);

}
break;


А hdcMem, кто будет создавать? Надо hdcMem = CreateCompatibleDC(hdc);

60K
26 сентября 2010 года
rokotokobot
15 / / 22.09.2010
Ага это я пропустил, спасибо, картинка грузится, но теперь когда по ней проведешь например другим окном, фон не перерисовывается о_О
7
26 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Разумеется.Вот это и надо обрабатывать в WM_Paint
60K
27 сентября 2010 года
rokotokobot
15 / / 22.09.2010
Верите - нет? Но даже в обработке WM_PAINT он не перерисовывает окно =)
 
Код:
UINT classStyle =   CS_DROPSHADOW | CS_HREDRAW | CS_VREDRAW,
DWORD windowStyle = DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_DLGFRAME


свойства окошка если что =)
9.0K
27 сентября 2010 года
grag63
71 / / 23.01.2006
Если используем GetDC(hWnd), то не стоит забывать RealeseDC(hWnd, hdc).
Но зачем это все, когда wParam в WM_ERASEBKGND и есть конекст окна.
Я применяю следующую схему:
case WM_CREATE:
hBmp = LoadImage...
hMemDC = CreateCompatibleDC(NULL);
hBmpPrev = (HBITMAP)SelectObject(hMemDC, hBmp);
....
case WM_ERASEBKGND:
BitBlt((HDC)wParam, 0, 0, 330, 400, hMemDC, 0, 0, SRCCOPY);
return 0;
...
case WM_PAINT:
HDC hdc = BeginPaint(hwnd, &ps);

рисуем остальные граф. объекты на hdc.
EndPaint(hwnd, &ps);


Проблем пока не возникало. И еще, зачем EndPaint без BeginPaint?
60K
01 октября 2010 года
rokotokobot
15 / / 22.09.2010
Цитата: grag63


Проблем пока не возникало. И еще, зачем EndPaint без BeginPaint?



не заметил :rolleyes:

60K
01 октября 2010 года
rokotokobot
15 / / 22.09.2010
сделал так же дин в один, но на
 
Код:
BitBlt((HDC)wParam, 0, 0, 330, 400, hMemDC, 0, 0, SRCCOPY);

вылезает ошибка
Run-Time Check Failure #3 - The variable 'hMemDC' is being used without being initialized.

пишу в студии 08
7
01 октября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Вы читать не умеете или вам лень воплотить в жизнь то,что так страстно вам желает компилятор?
[COLOR="Silver"]поцказка:надо её объявить;)[/COLOR]
60K
01 октября 2010 года
rokotokobot
15 / / 22.09.2010
Цитата: @pixo $oft
Вы читать не умеете или вам лень воплотить в жизнь то,что так страстно вам желает компилятор?
[COLOR="Silver"]поцказка:надо её объявить;)[/COLOR]



воот не поверите, но она была объявлена

 
Код:
HDC hDC, hMemDC;
    PAINTSTRUCT ps;
    RECT rect;
    POINT point;   
...
   
    switch (uMsg)
    {
    case WM_CREATE:


:rolleyes:
399
03 октября 2010 года
KIV
432 / / 20.01.2009
Цитата:
Run-Time Check Failure #3 - The variable 'hMemDC' is being used without being initialized.


Цитата:
поцказка:надо её объявить


Вообще то там написано, что её надо инициализировать. Что я и сказал чуть раньше:

Цитата:
А hdcMem, кто будет создавать? Надо hdcMem = CreateCompatibleDC(hdc);

60K
03 октября 2010 года
rokotokobot
15 / / 22.09.2010
такс проблема решена на 70 процентов =)

красиво все, почти, там пнг грузится фоном, все перерисовывается, вот только косяк в прорисовке прозрачных мест, они чего-то не фонтан как прорисовываются

Всем спасибо =)
7
03 октября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Не фонтан–это как?А вообще,лучше GDI+ использовать,наверное
60K
03 октября 2010 года
rokotokobot
15 / / 22.09.2010
Ага через Gdi+ реализовал. Не фонтан это-то что где прозрачная область, она как-то не сразу перерисовывается. Собственно при статическом положении должно быть, но так оно и есть как на рисунке сверху, а когда начнешь перемещать окно получается как снизу на рисунке.

Синие листики они полу прозрачны ну и видно как через них просвечивает код, над которым распологается запущеная програмка =)

И еще одна не решенная проблема это шлейф от перемещения окна, как с ним боротся не знаю.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог