#include "help.h" #pragma hdrstop #include "inc\frstuff.h" //#include typedef struct { INT16 ifcm; INT16 ifr; } ETF, *QETF; #define fETFFirst 0 #define fETFNext 1 #define FFirstPaletteObj(qde, qetf) FEnumPaletteObj(qde, qetf, fETFFirst) #define FNextPaletteObj(qde, qetf) FEnumPaletteObj(qde, qetf, fETFNext) static BOOL STDCALL FEnumPaletteObj(QDE qde, QETF qetf, INT16 fCmd); static HPALETTE STDCALL HpalGetPaletteQetf(QDE qde, QETF qetf); __inline static HPALETTE STDCALL HpalGetWindowPalette(HIW hiw); HPALETTE STDCALL HpalGetBestPalette(HDE hde) { ETF etf; HPALETTE hpalRet; QDE qde = QdeFromGh(hde); if (FFirstPaletteObj(qde, &etf)) hpalRet = HpalGetPaletteQetf(qde, &etf); else hpalRet = NULL; return hpalRet; } static BOOL STDCALL FEnumPaletteObj(QDE qde, QETF qetf, INT16 fCmd) { IFCM ifcm; INT16 ifr; BOOL fFound; ASSERT(qde->wLayoutMagic == wLayMagicValue); ASSERT(qetf != NULL); AccessMRD(((QMRD)&qde->mrdFCM)); switch (fCmd) { case fETFFirst: ifcm = IFooFirstMRD((QMRD)&qde->mrdFCM); ifr = 0; break; case fETFNext: ifcm = qetf->ifcm; ifr = qetf->ifr; break; default: NotReached(); break; } fFound = FALSE; while (ifcm != FOO_NIL) { QFCM qfcm; QFR qfr; qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), ifcm); ASSERT(qfcm != NULL); if (qfcm->cfr == 0) goto next_fcm; if (fCmd == fETFNext) { ++ifr; if (ifr >= qfcm->cfr) goto next_fcm; } ASSERT(ifr < qfcm->cfr); qfr = (QFR) PtrFromGh(qfcm->hfr); qfr += ifr; while (!fFound && ifr < qfcm->cfr) { switch (qfr->bType) { case bFrTypeWindow: qetf->ifcm = ifcm; qetf->ifr = ifr; fFound = TRUE; break; default: break; } ++qfr; ++ifr; } if (fFound) break; next_fcm: ifcm = IFooNextMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), ifcm); ifr = 0; } DeAccessMRD((QMRD)&qde->mrdFCM); return fFound; } static HPALETTE STDCALL HpalGetPaletteQetf(QDE qde, QETF qetf) { HPALETTE hpal; QFCM qfcm; QFR qfr; ASSERT(qde->wLayoutMagic == wLayMagicValue); ASSERT(qetf != NULL); AccessMRD((QMRD)&qde->mrdFCM); qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), qetf->ifcm); ASSERT(qfcm != NULL); ASSERT(qetf->ifr < qfcm->cfr); qfr = (QFR) PtrFromGh(qfcm->hfr); qfr += qetf->ifr; switch (qfr->bType) { case bFrTypeWindow: hpal = HpalGetWindowPalette(qfr->u.frw.hiw); break; default: hpal = NULL; break; } DeAccessMRD((QMRD)&qde->mrdFCM); return hpal; } /*************************************************************************** * - Name: - * Purpose: * * Arguments: * * Returns: * * Globals Used: * * +++ * * Notes: * ***************************************************************************/ __inline static HPALETTE STDCALL HpalGetWindowPalette(HIW hiw) { if (hiw.hwnd == NULL || hiw.hwnd == (HWND) -1) return NULL; return (HPALETTE) SendMessage(hiw.hwnd, EWM_ASKPALETTE, 0, 0); }