Графический интерфейс GDI в Microsoft Windows


Приложение SYSPAL - часть 3


hdc = BeginPaint(hwnd, &ps); hOldPalette = SelectPalette(hdc, hPal, FALSE); RealizePalette(hdc);

nWidth = 2; rc.left = rc.top = 0; rc.right = nWidth; rc.bottom = cyClient;

for (i=0; i < 256; i++) { hBrush = CreateSolidBrush (PALETTEINDEX (i)); FillRect (hdc, &rc, hBrush); rc.left = rc.right; rc.right += nWidth; DeleteBrush(hBrush); }

SelectPalette(hdc, hOldPalette, TRUE); EndPaint(hwnd, &ps); return 0; }

case WM_PALETTECHANGED: { if (hwnd == (HWND) wParam) break; }

case WM_QUERYNEWPALETTE: { HDC hdc; HPALETTE hOldPal; int nChanged;

hdc = GetDC(hwnd);

hOldPal = SelectPalette(hdc, hPal, (msg == WM_QUERYNEWPALETTE) ? FALSE : TRUE);

nChanged = RealizePalette(hdc); SelectPalette(hdc, hOldPal, TRUE);

ReleaseDC(hwnd, hdc);

if(nChanged) InvalidateRect(hwnd, NULL, TRUE);

return nChanged; }

case WM_DESTROY: { DeletePalette(hPal); LocalFree(pLogPal);

PostQuitMessage(0); return 0; }

default: break; } return DefWindowProc(hwnd, msg, wParam, lParam); }

// -------------------------------------------------------- // Функция PaletteInfo // Проверка возможности работы с палитрами // --------------------------------------------------------

BOOL PaletteInfo(void) { HDC hdc; int iRasterCaps;

hdc = GetDC(NULL); iRasterCaps = GetDeviceCaps(hdc, RASTERCAPS); ReleaseDC(NULL, hdc);

// Проверяем, используется ли механизм палитр if(iRasterCaps & RC_PALETTE) return TRUE; else return FALSE; }

Так же, как и приложение PALETTE, приложение SYSPAL создает логическую палитру для 256 цветов. Однако палитра заполняется по другому:

for (i = 0; i < PALETTESIZE; i++) { pLogPal->palPalEntry[i].peBlue = 0; *((PWORD)(&pLogPal->palPalEntry[i].peRed)) = i; pLogPal->palPalEntry[i].peFlags = PC_EXPLICIT; } hPal = CreatePalette((LPLOGPALETTE) pLogPal);

Все элементы палитры отмечаются флагом PC_EXPLICIT. Это означает, что палитра содержит не цвета, а индексы цветов системной палитры. Точнее, младшее слово каждого элемента палитры содержит индекс цвета системной палитры.


Начало  Назад  Вперед