Member
Регистрация: 18.04.2002
Адрес: Ф туманах Новосибирска...
Сообщения: 378
|
Смотри, переносим код в обработку WM_ERASEBKGND (это к вопросу о том, что обновление не происходит):
Код:
case WM_ERASEBKGND:
{
GetWindowRect(hWnd, &windowRect);
UpdateMainFrame(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);
frameRegion = BitmapToRegion(MainFrame, RGB(255, 0, 255));
SetWindowRgn(hWnd, frameRegion, FALSE);
HBRUSH brush;
brush = CreatePatternBrush(MainFrame);
FillRgn(hdc, frameRegion, brush);
DeleteObject(brush);
return 0;
}
BITMAP тоже чистится каждый раз перед созданием:
Код:
void UpdateMainFrame(int width, int height)
{
HDC MainFrameDC;
if(MainFrame != NULL)
DeleteObject(MainFrame);
MainFrame = CreateBitmap(width, height, 1, 32, NULL);
MainFrameDC = CreateCompatibleDC(NULL);
SelectObject(MainFrameDC, MainFrame);
//собираем BITMAP из кусочков
BitBlt(MainFrameDC, 0, 0, bitmap11info.bmWidth, bitmap11info.bmHeight, bitmap11hdc, 0, 0, SRCCOPY);
StretchBlt(MainFrameDC, bitmap11info.bmWidth, 0, width-bitmap13info.bmWidth-bitmap11info.bmWidth, bitmap12info.bmHeight,
bitmap12hdc, 0, 0, bitmap12info.bmWidth, bitmap12info.bmHeight, SRCCOPY);
BitBlt(MainFrameDC, width-bitmap13info.bmWidth, 0, bitmap13info.bmWidth, bitmap13info.bmHeight, bitmap13hdc, 0, 0, SRCCOPY);
StretchBlt(MainFrameDC, 0, bitmap11info.bmHeight, bitmap21info.bmWidth, height-bitmap11info.bmHeight-bitmap31info.bmHeight,
bitmap21hdc, 0, 0, bitmap21info.bmWidth, bitmap21info.bmHeight, SRCCOPY);
StretchBlt(MainFrameDC, bitmap21info.bmWidth, bitmap11info.bmHeight, width-bitmap23info.bmWidth-bitmap21info.bmWidth, height-bitmap12info.bmHeight-bitmap32info.bmHeight,
bitmap22hdc, 0, 0, bitmap22info.bmWidth, bitmap22info.bmHeight, SRCCOPY);
StretchBlt(MainFrameDC, width-bitmap23info.bmWidth, bitmap11info.bmHeight, bitmap23info.bmWidth, height-bitmap11info.bmHeight-bitmap31info.bmHeight,
bitmap23hdc, 0, 0, bitmap23info.bmWidth, bitmap23info.bmHeight, SRCCOPY);
BitBlt(MainFrameDC, 0, height-bitmap31info.bmHeight, bitmap31info.bmWidth, bitmap31info.bmHeight, bitmap31hdc, 0, 0, SRCCOPY);
StretchBlt(MainFrameDC, bitmap31info.bmWidth, height-bitmap32info.bmHeight, width-bitmap33info.bmWidth-bitmap31info.bmWidth, bitmap32info.bmHeight,
bitmap32hdc, 0, 0, bitmap32info.bmWidth, bitmap32info.bmHeight, SRCCOPY);
BitBlt(MainFrameDC, width-bitmap33info.bmWidth, height-bitmap33info.bmHeight, bitmap33info.bmWidth, bitmap33info.bmHeight, bitmap33hdc, 0, 0, SRCCOPY);
DeleteDC(MainFrameDC);
GetObject(MainFrame, sizeof(MainFrameInfo), &MainFrameInfo);
}
Получаем - при каждой перерисовке устанавливаем окну новый регион, и заполняем его кистью, созданной на основе BITAMP'а. И ежу понятно  , что запихивать этот код в обработку WM_ERASEBKGND - это гнусно и ОЧЕНЬ не практично (но для иллюстрации потянет).
Далее смотрим MSDN  :
The SetWindowRgn function sets the window region of a window. The window region determines the area within the window where the system permits drawing. The system does not display any portion of a window that lies outside of the window region.
Иными словами говоря - не должно изображение за регион выходить.
А что получается смотри во вложении.
|