Split out the parent drawing in windows/container.c into its own function. This is necessary to allow for clipping.
This commit is contained in:
parent
6b9990a58c
commit
74fc1aea45
|
@ -29,40 +29,55 @@ static HWND realParent(HWND hwnd)
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct parentDraw {
|
||||||
|
HDC cdc;
|
||||||
|
HBITMAP bitmap;
|
||||||
|
HBITMAP prevbitmap;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void parentDraw(HDC dc, HWND parent, struct parentDraw *pd)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
if (GetClientRect(parent, &r) == 0)
|
||||||
|
logLastError("error getting parent's client rect in parentDraw()");
|
||||||
|
pd->cdc = CreateCompatibleDC(dc);
|
||||||
|
if (pd->cdc == NULL)
|
||||||
|
logLastError("error creating compatible DC in parentDraw()");
|
||||||
|
pd->bitmap = CreateCompatibleBitmap(dc, r.right - r.left, r.bottom - r.top);
|
||||||
|
if (pd->bitmap == NULL)
|
||||||
|
logLastError("error creating compatible bitmap in parentDraw()");
|
||||||
|
pd->prevbitmap = SelectObject(pd->cdc, pd->bitmap);
|
||||||
|
if (pd->prevbitmap == NULL)
|
||||||
|
logLastError("error selecting bitmap into compatible DC in parentDraw()");
|
||||||
|
SendMessageW(parent, WM_PRINTCLIENT, (WPARAM) (pd->cdc), PRF_CLIENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void endParentDraw(struct parentDraw *pd)
|
||||||
|
{
|
||||||
|
if (SelectObject(pd->cdc, pd->prevbitmap) != pd->bitmap)
|
||||||
|
logLastError("error selecting previous bitmap back into compatible DC in endParentDraw()");
|
||||||
|
if (DeleteObject(pd->bitmap) == 0)
|
||||||
|
logLastError("error deleting compatible bitmap in endParentDraw()");
|
||||||
|
if (DeleteDC(pd->cdc) == 0)
|
||||||
|
logLastError("error deleting compatible DC in endParentDraw()");
|
||||||
|
}
|
||||||
|
|
||||||
// see http://www.codeproject.com/Articles/5978/Correctly-drawn-themed-dialogs-in-WinXP
|
// see http://www.codeproject.com/Articles/5978/Correctly-drawn-themed-dialogs-in-WinXP
|
||||||
static HBRUSH getControlBackgroundBrush(HWND hwnd, HDC dc)
|
static HBRUSH getControlBackgroundBrush(HWND hwnd, HDC dc)
|
||||||
{
|
{
|
||||||
HWND parent;
|
HWND parent;
|
||||||
RECT parentRect, hwndScreenRect;
|
RECT parentRect, hwndScreenRect;
|
||||||
HDC cdc;
|
struct parentDraw pd;
|
||||||
HBITMAP bitmap, prevbitmap;
|
|
||||||
HBRUSH brush;
|
HBRUSH brush;
|
||||||
|
|
||||||
parent = realParent(hwnd);
|
parent = realParent(hwnd);
|
||||||
|
|
||||||
if (GetClientRect(parent, &parentRect) == 0)
|
parentDraw(dc, parent, &pd);
|
||||||
logLastError("error getting parent's client rect in getControlBackgroundBrush()");
|
brush = CreatePatternBrush(pd.bitmap);
|
||||||
|
|
||||||
cdc = CreateCompatibleDC(dc);
|
|
||||||
if (cdc == NULL)
|
|
||||||
logLastError("error creating compatible DC in getControlBackgroundBrush()");
|
|
||||||
bitmap = CreateCompatibleBitmap(dc, parentRect.right - parentRect.left, parentRect.bottom - parentRect.top);
|
|
||||||
if (bitmap == NULL)
|
|
||||||
logLastError("error creating compatible bitmap in getControlBackgroundBrush()");
|
|
||||||
prevbitmap = SelectObject(cdc, bitmap);
|
|
||||||
if (prevbitmap == NULL)
|
|
||||||
logLastError("error selecting bitmap into compatible DC in getControlBackgroundBrush()");
|
|
||||||
SendMessageW(parent, WM_PRINTCLIENT, (WPARAM) cdc, PRF_CLIENT);
|
|
||||||
// create it now, just to be safe
|
|
||||||
brush = CreatePatternBrush(bitmap);
|
|
||||||
if (brush == NULL)
|
if (brush == NULL)
|
||||||
logLastError("error creating pattern brush in getControlBackgroundBrush()");
|
logLastError("error creating pattern brush in getControlBackgroundBrush()");
|
||||||
if (SelectObject(cdc, prevbitmap) != bitmap)
|
endParentDraw(&pd);
|
||||||
logLastError("error selecting previous bitmap back into compatible DC in getControlBackgroundBrush()");
|
|
||||||
if (DeleteObject(bitmap) == 0)
|
|
||||||
logLastError("error deleting compatible bitmap in getControlBackgroundBrush()");
|
|
||||||
if (DeleteDC(cdc) == 0)
|
|
||||||
logLastError("error deleting compatible DC in getControlBackgroundBrush()");
|
|
||||||
|
|
||||||
// now figure out where the control is relative to the parent so we can align the brush properly
|
// now figure out where the control is relative to the parent so we can align the brush properly
|
||||||
if (GetWindowRect(hwnd, &hwndScreenRect) == 0)
|
if (GetWindowRect(hwnd, &hwndScreenRect) == 0)
|
||||||
|
|
Loading…
Reference in New Issue