怎样用vc实现文字的渐隐效果?

解决方案 »

  1.   

    渐隐就是将显示颜色由图象各象素的颜色逐渐变化为黑色(RGB(0, 0, 0))的过程,即定时调用CPalette::AnimatePalette,每次将各逻辑表项的peRed、peGreen、peBlue值减小一个变化量,直到它们都为0。
    下面的函数FadeOut通过对调色板颜色表项中的各颜色分量值进行递减,直到所有颜色值都变成0(即黑色)来实现渐隐。
    // 图象渐隐效果// 参数:
    // pWnd – 显示图象的窗口
    // pPal – 调色板指针
    // nDeta – 各颜色分量的减小量
    // uTimeOut – 时间的变化量
    void FadeOut(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut) 
    {
    // 保留原来的调色板颜色表项
    int nTotalColors = pPal->GetEntryCount();
    PALETTEENTRY PaletteColors0[256];
    pPal->GetPaletteEntries(0, nTotalColors, PaletteColors0);
    // 设置时间码
    pWnd->SetTimer(0x100, uTimeOut, NULL);
    // 开始渐隐
    pWnd->SetCapture();
    BOOL bDone = FALSE;
    MSG msg;
    while (! bDone)
    {
    if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    if (msg.message == WM_TIMER && msg.wParam == 0x100)
    {
    CClientDC dc(pWnd);
    CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);
    dc.RealizePalette();
    PALETTEENTRY PaletteColors[256];
    pPal->GetPaletteEntries(0, nTotalColors, PaletteColors);
    BOOL bRedZero=FALSE;
    BOOL bGreenZero=FALSE;
    BOOL bBlueZero=FALSE;
    // 递减颜色分量
    for (int i=0; i<nTotalColors; ++i)
    {
    if (PaletteColors[i].peRed > nDeta)
    {
    PaletteColors[i].peRed -= nDeta;
    bRedZero = FALSE;
    }else if (PaletteColors[i].peRed > 1)
    {
    PaletteColors[i].peRed--;
    bRedZero = FALSE;
    }
    else
    bRedZero = TRUE;
    if (PaletteColors[i].peGreen > nDeta)
    {PaletteColors[i].peGreen -= nDeta;
    bGreenZero = FALSE;}
    else if (PaletteColors[i].peGreen > 1)
    {PaletteColors[i].peGreen--;
    bGreenZero = FALSE;}
    else
    bGreenZero = TRUE;if (PaletteColors[i].peBlue > nDeta)
    {PaletteColors[i].peBlue -= nDeta;
    bBlueZero = FALSE;}
    else if (PaletteColors[i].peBlue > 1)
    {PaletteColors[i].peBlue--;
    bBlueZero = FALSE;}
    else
    bBlueZero = TRUE;}// 如所有颜色分量都为0,则结束渐隐
    bDone = bRedZero && bGreenZero && bBlueZero;
    // 使系统改变调色板
    pPal->AnimatePalette(0, nTotalColors, PaletteColors);}
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
    }}
    ::ReleaseCapture();
    pWnd->KillTimer(0x100);
    // 恢复原始调色板
    pPal->SetPaletteEntries(0, nTotalColors, PaletteColors0);
    pPal->AnimatePalette(0, nTotalColors, PaletteColors0);}