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;
фон окна - изображение
Собственно, как сделать фоном окна, изображение? И чтобы при перетаскивании окна оно не мерцало? :(
Во-первых, при регистрации класса окна поставить Brush в 0, чтобы система не пыталась сама рисовать фон окна. Мерцание происходит из-за этого. Во-вторых, в обработчике WM_PAINT рисовать картинку с помощью BitBlt. Или StretchBlt, если её надо растягивать под размер окна.
Отрисовывай картинку по событию WM_ERASEBKGND.
собственно не понятно грузится ли картинка в HBITMAP, ибо перепробывал все, фон все равно прозрачный, как проверить грузится что туда или нет, при пошаговой отладки на эту переменную вылезает такое "unused = CXX0030: ошибка: невозможно вычислить выражение" как это лечить?
Если LoadImage вернул не 0, то картинка загружена успешно. Кстати, её лучше подгрузить заранее, а не в ERASEBKGND.
подгружаю её в самом начале как глобальную перемнную =)
все это выглядит так
Код:
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;
....
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;
Цитата:
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;
{
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);
Ага это я пропустил, спасибо, картинка грузится, но теперь когда по ней проведешь например другим окном, фон не перерисовывается о_О
Разумеется.Вот это и надо обрабатывать в WM_Paint
Код:
UINT classStyle = CS_DROPSHADOW | CS_HREDRAW | CS_VREDRAW,
DWORD windowStyle = DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_DLGFRAME
DWORD windowStyle = DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_DLGFRAME
свойства окошка если что =)
Но зачем это все, когда 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?
Цитата: grag63
Проблем пока не возникало. И еще, зачем EndPaint без BeginPaint?
не заметил :rolleyes:
Код:
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
[COLOR="Silver"]поцказка:надо её объявить;)[/COLOR]
Цитата: @pixo $oft
Вы читать не умеете или вам лень воплотить в жизнь то,что так страстно вам желает компилятор?
[COLOR="Silver"]поцказка:надо её объявить;)[/COLOR]
[COLOR="Silver"]поцказка:надо её объявить;)[/COLOR]
воот не поверите, но она была объявлена
Код:
HDC hDC, hMemDC;
PAINTSTRUCT ps;
RECT rect;
POINT point;
...
switch (uMsg)
{
case WM_CREATE:
PAINTSTRUCT ps;
RECT rect;
POINT point;
...
switch (uMsg)
{
case WM_CREATE:
:rolleyes:
Цитата:
Run-Time Check Failure #3 - The variable 'hMemDC' is being used without being initialized.
Цитата:
поцказка:надо её объявить
Вообще то там написано, что её надо инициализировать. Что я и сказал чуть раньше:
Цитата:
А hdcMem, кто будет создавать? Надо hdcMem = CreateCompatibleDC(hdc);
красиво все, почти, там пнг грузится фоном, все перерисовывается, вот только косяк в прорисовке прозрачных мест, они чего-то не фонтан как прорисовываются
Всем спасибо =)
Не фонтан–это как?А вообще,лучше GDI+ использовать,наверное
Синие листики они полу прозрачны ну и видно как через них просвечивает код, над которым распологается запущеная програмка =)
И еще одна не решенная проблема это шлейф от перемещения окна, как с ним боротся не знаю.