wuvalue 2016-08-17 09:39 采纳率: 0%
浏览 826

windows程序设计书上程序不能时时显示与AnimatePalette()有关请教大神

/*----------------------------------------------
PALANIM.C -- Palette Animation Shell Program
(c) Charles Petzold, 1998
----------------------------------------------*/
//PALANIM.C部分
#include

extern HPALETTE CreateRoutine(HWND);
extern void PaintRoutine(HDC, int, int);
extern void TimerRoutine(HDC, HPALETTE);
extern void DestroyRoutine(HWND, HPALETTE);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

extern TCHAR szAppName[];
extern TCHAR szTitle[];

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

if (!RegisterClass(&wndclass))
{
    MessageBox(NULL, TEXT("This program requires Windows NT!"),
        szAppName, MB_ICONERROR);
    return 0;
}

hwnd = CreateWindow(szAppName, szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL);

if (!hwnd)
    return 0;

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return msg.wParam;

}

BOOL CheckDisplay(HWND hwnd)
{
HDC hdc;
int iPalSize;

hdc = GetDC(hwnd);
iPalSize = GetDeviceCaps(hdc, SIZEPALETTE);
ReleaseDC(hwnd, hdc);

if (iPalSize != 256)
{
    MessageBox(hwnd, TEXT("This program requires that the video ")
        TEXT("display mode have a 256-color palette."),
        szAppName, MB_ICONERROR);
    return FALSE;
}
return TRUE;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HPALETTE hPalette;
static int cxClient, cyClient;
HDC hdc;
PAINTSTRUCT ps;

switch (message)
{
case WM_CREATE:
    if (!CheckDisplay(hwnd))
        return -1;

    hPalette = CreateRoutine(hwnd);
    return 0;

case WM_DISPLAYCHANGE:
    if (!CheckDisplay(hwnd))
        DestroyWindow(hwnd);

    return 0;

case WM_SIZE:
    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);
    return 0;

case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);

    SelectPalette(hdc, hPalette, FALSE);
    RealizePalette(hdc);

    PaintRoutine(hdc, cxClient, cyClient);

    EndPaint(hwnd, &ps);
    return 0;

case WM_TIMER:
    hdc = GetDC(hwnd);

    SelectPalette(hdc, hPalette, FALSE);

    TimerRoutine(hdc, hPalette);

    ReleaseDC(hwnd, hdc);
    return 0;

case WM_QUERYNEWPALETTE:
    if (!hPalette)
        return FALSE;

    hdc = GetDC(hwnd);
    SelectPalette(hdc, hPalette, FALSE);
    RealizePalette(hdc);
    InvalidateRect(hwnd, NULL, TRUE);

    ReleaseDC(hwnd, hdc);
    return TRUE;

case WM_PALETTECHANGED:
    if (!hPalette || (HWND)wParam == hwnd)
        break;

    hdc = GetDC(hwnd);
    SelectPalette(hdc, hPalette, FALSE);
    RealizePalette(hdc);
    UpdateColors(hdc);

    ReleaseDC(hwnd, hdc);
    break;

case WM_DESTROY:
    DestroyRoutine(hwnd, hPalette);
    PostQuitMessage(0);
    return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);

}
/*-----------------------------------------
ALLCOLOR.C **-- Palette Animation Demo
(c) Charles Petzold, 1998
-----------------------------------------*/
**ALLCOLOR.C部分

#include

#define ID_TIMER 1

TCHAR szAppName[] = TEXT("AllColor");
TCHAR szTitle[] = TEXT("AllColor: Palette Animation Demo");

static int iIncr;
static PALETTEENTRY pe;

HPALETTE CreateRoutine(HWND hwnd)
{
HDC hdc;
HPALETTE hPalette;
LOGPALETTE lp;

// Determine the color resolution and set iIncr

hdc = GetDC(hwnd);
iIncr = 1 << (8 - GetDeviceCaps(hdc, COLORRES) / 3);
ReleaseDC(hwnd, hdc);

// Create the logical palette

lp.palVersion = 0x0300;
lp.palNumEntries = 1;
lp.palPalEntry[0].peRed = 0;
lp.palPalEntry[0].peGreen = 0;
lp.palPalEntry[0].peBlue = 0;
lp.palPalEntry[0].peFlags = PC_RESERVED;

hPalette = CreatePalette(&lp);

// Save global for less typing

pe = lp.palPalEntry[0];

SetTimer(hwnd, ID_TIMER, 10, NULL);
return hPalette;

}

void DisplayRGB(HDC hdc, PALETTEENTRY * ppe)
{
TCHAR szBuffer[16];

wsprintf(szBuffer, TEXT(" %02X-%02X-%02X "),
    ppe->peRed, ppe->peGreen, ppe->peBlue);

TextOut(hdc, 0, 0, szBuffer, lstrlen(szBuffer));

}

void PaintRoutine(HDC hdc, int cxClient, int cyClient)
{
HBRUSH hBrush;
RECT rect;

// Draw Palette Index 0 on entire window

hBrush = CreateSolidBrush(PALETTEINDEX(0));
SetRect(&rect, 0, 0, cxClient, cyClient);
FillRect(hdc, &rect, hBrush);
DeleteObject(SelectObject(hdc, GetStockObject(WHITE_BRUSH)));

// Display the RGB value

DisplayRGB(hdc, &pe);
return;

}

void TimerRoutine(HDC hdc, HPALETTE hPalette)
{
static BOOL bRedUp = TRUE, bGreenUp = TRUE, bBlueUp = TRUE;

// Define new color value

pe.peBlue += (bBlueUp ? iIncr : -iIncr);

if (pe.peBlue == (BYTE)(bBlueUp ? 0 : 256 - iIncr))
{
    pe.peBlue = (bBlueUp ? 256 - iIncr : 0);
    bBlueUp ^= TRUE;
    pe.peGreen += (bGreenUp ? iIncr : -iIncr);

    if (pe.peGreen == (BYTE)(bGreenUp ? 0 : 256 - iIncr))
    {
        pe.peGreen = (bGreenUp ? 256 - iIncr : 0);
        bGreenUp ^= TRUE;
        pe.peRed += (bRedUp ? iIncr : -iIncr);

        if (pe.peRed == (BYTE)(bRedUp ? 0 : 256 - iIncr))
        {
            pe.peRed = (bRedUp ? 256 - iIncr : 0);
            bRedUp ^= TRUE;
        }
    }
}

// Animate the palette

AnimatePalette(hPalette, 0, 1, &pe);
DisplayRGB(hdc, &pe);
return;

}

void DestroyRoutine(HWND hwnd, HPALETTE hPalette)
{
KillTimer(hwnd, ID_TIMER);
DeleteObject(hPalette);
return;
}

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。