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.
162 lines
2.9 KiB
162 lines
2.9 KiB
#include "help.h"
|
|
|
|
#pragma hdrstop
|
|
#include "inc\frstuff.h"
|
|
//#include <dll.h>
|
|
|
|
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);
|
|
}
|