mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
297 lines
6.7 KiB
297 lines
6.7 KiB
#include <msnssph.h>
|
|
|
|
|
|
BOOL FReloadBitmap(HWND hWnd, PBMPCCINFO pBitInfo);
|
|
|
|
// ============================ FInitBmpCC ================================
|
|
|
|
BOOL FInitBmpCC(HINSTANCE hDLL)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
wc.style = CS_HREDRAW | CS_SAVEBITS | CS_VREDRAW | CS_OWNDC | CS_GLOBALCLASS;
|
|
wc.lpfnWndProc = (WNDPROC) BmpCCWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = BMPCC_EXTRA;
|
|
wc.hInstance = hDLL;
|
|
wc.hIcon = NULL;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = NULL;
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = BMPCCCLASS;
|
|
|
|
if (!RegisterClass(&wc))
|
|
{
|
|
return (FALSE);
|
|
}
|
|
|
|
return (TRUE);
|
|
} // FInitBmpCC()
|
|
|
|
// ============================ FUnInitBmpCC ================================
|
|
|
|
BOOL FUnInitBmpCC(HINSTANCE hDLL)
|
|
{
|
|
if (!UnregisterClass(BMPCCCLASS, hDLL))
|
|
{
|
|
return (FALSE);
|
|
}
|
|
|
|
return (TRUE);
|
|
} // FUnInitBmpCC()
|
|
|
|
// ================================ BmpCCWndProc ===========================
|
|
|
|
LRESULT CALLBACK BmpCCWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT lRet = FALSE;
|
|
|
|
switch (uMsg)
|
|
{
|
|
|
|
case WM_CREATE:
|
|
{
|
|
LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam;
|
|
PBMPCCINFO pBitInfo = (PBMPCCINFO) LocalAlloc(LPTR, sizeof(BMPCCINFO));
|
|
LPSTR pch;
|
|
LPSTR pchMod;
|
|
CHAR szModuleName[32];
|
|
|
|
if (!pBitInfo)
|
|
{
|
|
SSPASSERT(0);
|
|
return (-1);
|
|
}
|
|
|
|
pch = (CHAR *)lpcs->lpszName;
|
|
if (*pch == '<')
|
|
{
|
|
pch++;
|
|
pchMod = szModuleName;
|
|
while (*pch != '>')
|
|
*pchMod++ = *pch++;
|
|
pch++;
|
|
*pchMod = '\0';
|
|
pBitInfo->hInstance = GetModuleHandle(szModuleName);
|
|
}
|
|
else
|
|
pBitInfo->hInstance = lpcs->hInstance;
|
|
|
|
lstrcpy(pBitInfo->szName, pch);
|
|
pBitInfo->style = lpcs->style;
|
|
FReloadBitmap(hWnd, pBitInfo);
|
|
|
|
SetWindowLong(hWnd, GWL_BMPCCDATA, (LONG) pBitInfo);
|
|
break;
|
|
}
|
|
|
|
/// case WM_WINDOWPOSCHANGED:
|
|
/// {
|
|
/// PBMPCCINFO pBitInfo = (PBMPCCINFO) GetWindowLong(hWnd, GWL_BMPCCDATA);
|
|
|
|
/// FReloadBitmap(hWnd, pBitInfo);
|
|
/// }
|
|
case WM_QUERYNEWPALETTE:
|
|
{
|
|
PBMPCCINFO pBitInfo = (PBMPCCINFO) GetWindowLong(hWnd, GWL_BMPCCDATA);
|
|
|
|
if (pBitInfo->hpal)
|
|
{
|
|
HDC hdc;
|
|
HPALETTE hpal;
|
|
DWORD cColorsChanged;
|
|
|
|
hdc = GetDC(hWnd);
|
|
hpal = SelectPalette(hdc, pBitInfo->hpal, FALSE);
|
|
|
|
cColorsChanged = RealizePalette(hdc);
|
|
SelectPalette(hdc, hpal, TRUE);
|
|
ReleaseDC(hWnd, hdc);
|
|
|
|
// did any colors change?
|
|
if (cColorsChanged > 0)
|
|
{
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
UpdateWindow(hWnd);
|
|
}
|
|
|
|
lRet = TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT ps;
|
|
PBMPCCINFO pBitInfo = (PBMPCCINFO) GetWindowLong(hWnd, GWL_BMPCCDATA);
|
|
PDRAWITEMSTRUCT pdi = (PDRAWITEMSTRUCT) lParam;
|
|
HDC hDCMem;
|
|
BITMAP bm;
|
|
|
|
BeginPaint(hWnd, &ps);
|
|
|
|
hDCMem = CreateCompatibleDC(ps.hdc);
|
|
|
|
if (pBitInfo->hpal)
|
|
{
|
|
SelectPalette(ps.hdc, pBitInfo->hpal, TRUE);
|
|
RealizePalette(ps.hdc);
|
|
|
|
SelectPalette(hDCMem, pBitInfo->hpal, TRUE);
|
|
RealizePalette(hDCMem);
|
|
}
|
|
|
|
SelectObject(hDCMem, pBitInfo->hBmp);
|
|
GetObject(pBitInfo->hBmp, sizeof(BITMAP), &bm);
|
|
|
|
// repaint entire rectangle
|
|
BitBlt(ps.hdc, pBitInfo->left, pBitInfo->top, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCCOPY);
|
|
|
|
DeleteDC(hDCMem);
|
|
|
|
EndPaint(hWnd, &ps);
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
PBMPCCINFO pBitInfo = (PBMPCCINFO) GetWindowLong(hWnd, GWL_BMPCCDATA);
|
|
//
|
|
// Clean up all the resources used for this control
|
|
//
|
|
if (pBitInfo)
|
|
{
|
|
/// DeleteObject(pBitInfo->hpal);
|
|
DeleteObject(pBitInfo->hBmp);
|
|
LocalFree(pBitInfo);
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
|
|
}
|
|
|
|
return (lRet);
|
|
} // BmpCCWndProc()
|
|
|
|
|
|
// =========================== FGetBmpCCInfo ===========================
|
|
|
|
BOOL FGetBmpCCInfo(PCCINFOA pacci)
|
|
{
|
|
pacci->flOptions = 0;
|
|
pacci->cxDefault = 40; // default width (dialog units)
|
|
pacci->cyDefault = 40; // default height (dialog units)
|
|
pacci->flStyleDefault = WS_CHILD | WS_VISIBLE;
|
|
pacci->flExtStyleDefault = 0;
|
|
pacci->flCtrlTypeMask = 0;
|
|
pacci->cStyleFlags = 0;
|
|
pacci->aStyleFlags = NULL;
|
|
pacci->lpfnStyle = NULL;
|
|
pacci->lpfnSizeToText = BmpSizeToText;
|
|
pacci->dwReserved1 = 0;
|
|
pacci->dwReserved2 = 0;
|
|
|
|
SSPASSERT(strlen(BMPCCCLASS) < CCHCCCLASS);
|
|
lstrcpy(pacci->szClass, BMPCCCLASS);
|
|
SSPASSERT(strlen(BMPCCDESC) < CCHCCDESC);
|
|
lstrcpy(pacci->szDesc, BMPCCDESC);
|
|
SSPASSERT(strlen(BMPCCTEXT) < CCHCCTEXT);
|
|
lstrcpy(pacci->szTextDefault, BMPCCTEXT);
|
|
|
|
return (TRUE);
|
|
} // FGetBmpCCInfo()
|
|
|
|
// =========================== BmpSizeToText ===========================
|
|
INT CALLBACK BmpSizeToText(DWORD flStyle, DWORD flExtStyle, HFONT hFont, PSTR pszText)
|
|
{
|
|
return -1;
|
|
} // BmpSizeToText()
|
|
|
|
// ============================== FReloadBitmap ====================================
|
|
|
|
BOOL FReloadBitmap(HWND hWnd, PBMPCCINFO pBitInfo)
|
|
{
|
|
RECT rt;
|
|
DWORD dwLoadS;
|
|
|
|
if (pBitInfo->hBmp)
|
|
{
|
|
DeleteObject(pBitInfo->hBmp);
|
|
pBitInfo->hBmp = NULL;
|
|
}
|
|
|
|
if (pBitInfo->hpal)
|
|
{
|
|
DeleteObject(pBitInfo->hpal);
|
|
pBitInfo->hpal = NULL;
|
|
}
|
|
|
|
pBitInfo->fLoaded = FALSE;
|
|
|
|
#ifdef CHICAGO
|
|
dwLoadS = LR_CREATEDIBSECTION;
|
|
if (!(pBitInfo->style & BMPS_OPAQUE))
|
|
{
|
|
dwLoadS |= LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT;
|
|
}
|
|
pBitInfo->hBmp = LoadImage(pBitInfo->hInstance, pBitInfo->szName, IMAGE_BITMAP, 0, 0, dwLoadS);
|
|
#else // !CHICAGO
|
|
pBitInfo->hBmp = LoadBitmap(pBitInfo->hInstance, pBitInfo->szName);
|
|
#endif // !CHICAGO
|
|
//AssertGLE(pBitInfo->hBmp);
|
|
SSPASSERT(pBitInfo->hBmp);
|
|
|
|
if (pBitInfo->hBmp)
|
|
{
|
|
BITMAP bm;
|
|
WORD cRGB;
|
|
RGBQUAD rgRGBQ[257];
|
|
HDC hdc;
|
|
HBITMAP hbmp;
|
|
|
|
|
|
GetObject(pBitInfo->hBmp, sizeof(BITMAP), &bm);
|
|
GetWindowRect(hWnd, &rt);
|
|
pBitInfo->left = ((rt.right - rt.left) - bm.bmWidth) / 2;
|
|
pBitInfo->top = ((rt.bottom - rt.top) - bm.bmHeight) / 2;
|
|
if (pBitInfo->left < 0)
|
|
pBitInfo->left = 0;
|
|
if (pBitInfo->top < 0)
|
|
pBitInfo->top = 0;
|
|
|
|
hdc = CreateCompatibleDC(NULL);
|
|
hbmp = (HBITMAP) SelectObject(hdc, pBitInfo->hBmp);
|
|
cRGB = GetDIBColorTable(hdc, 0, 256, &rgRGBQ[1]);
|
|
if (cRGB)
|
|
{
|
|
DWORD ilp;
|
|
PLOGPALETTE plp = (PLOGPALETTE) rgRGBQ;
|
|
RGBQUAD rgbq;
|
|
|
|
plp->palVersion = 0x300;
|
|
plp->palNumEntries = cRGB;
|
|
|
|
SSPASSERT(cRGB <= 256);
|
|
for (ilp = 0; ilp < cRGB; ilp ++)
|
|
{
|
|
rgbq = rgRGBQ[ilp + 1];
|
|
plp->palPalEntry[ilp].peRed = rgbq.rgbRed;
|
|
plp->palPalEntry[ilp].peGreen = rgbq.rgbGreen;
|
|
plp->palPalEntry[ilp].peBlue = rgbq.rgbBlue;
|
|
plp->palPalEntry[ilp].peFlags = 0;
|
|
}
|
|
|
|
pBitInfo->hpal = CreatePalette((PLOGPALETTE) rgRGBQ);
|
|
}
|
|
|
|
SelectObject(hdc, hbmp);
|
|
DeleteDC(hdc);
|
|
|
|
pBitInfo->fLoaded = TRUE;
|
|
}
|
|
|
|
return (pBitInfo->fLoaded);
|
|
} // FReloadBitmap()
|
|
|