- void animatepalette(
- uint nstartindex, // 起始的表项号
- uint nnumentries, // 变化的表项数
- lppaletteentry lppalettecolors ); // 逻辑调色板表项指针
- lppalettecolors为指向paletteentry结构的指针,其中存储着逻辑调色板将要更新的颜色信息。paletteentry结构定义如下:
- typedef struct tagpaletteentry { // pe
- byte pered;
- byte pegreen;
- byte peblue;
- byte peflags;
- } paletteentry;
- // 设置时间码,pwnd为处理定时操作的窗口对象指针
- 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)
- {
- //…………………..
- //定时操作代码
- //…………………..
- // 如定时操作完成,则设置循环标志,结束操作
- if (定时操作完成)
- bdone = true;
- }
- ::translatemessage(&msg);
- ::dispatchmessage(&msg);
- }
- }
- // 释放鼠标
- ::releasecapture();
- // 删除时间码
- pwnd->killtimer(0x100);
- // 图象渐显效果
- // 参数:
- // pwnd – 显示图象的窗口
- // ppal – 调色板指针
- // ndeta – 各颜色分量的减小量
- // utimeout – 时间的变化量
- void fadein(cwnd *pwnd, cpalette *ppal, int ndeta, uint utimeout)
- {
- // 保留原来的调色板颜色表项
- int ntotalcolors = ppal->getentrycount();
- paletteentry palettecolors0[256];
- ppal->getpaletteentries(0, ntotalcolors, palettecolors0);
- // 先将调色板表项中各颜色分量置为0
- paletteentry palettecolors1[256];
- for (int i=0; i<ntotalcolors; ++i)
- {
- palettecolors1.pered = 0;
- palettecolors1.pegreen = 0;
- palettecolors1.peblue = 0;
- palettecolors1.peflags = pc_reserved;
- }
- ppal->setpaletteentries(0, ntotalcolors, palettecolors1);
- ppal->animatepalette(0, ntotalcolors, palettecolors1);
- // 设置时间码
- 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.pered + ndeta <
- palettecolors0.pered)
- {
- palettecolors.pered += ndeta;
- bredzero = false;
- }
- else if (palettecolors.pered + 1 <
- palettecolors0.pered)
- {
- palettecolors.pered++;
- bredzero = false;
- }
- else
- bredzero = true;
- if (palettecolors.pegreen + ndeta <
- palettecolors0.pegreen)
- {
- palettecolors.pegreen += ndeta;
- bgreenzero = false;
- }
- else if (palettecolors.pegreen + 1 <
- palettecolors0.pegreen)
- {
- palettecolors.pegreen++;
- bgreenzero = false;
- }
- else
- bgreenzero = true;
- if (palettecolors.peblue + ndeta <
- palettecolors0.peblue)
- {
- palettecolors.peblue += ndeta;
- bbluezero = false;
- }
- else if (palettecolors.peblue +1 <
- palettecolors0.peblue)
- {
- palettecolors.peblue++;
- bbluezero = false;
- }
- else
- bbluezero = true;
- }
- // 直到恢复原始值结束
- 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);
- }
- // 图象渐隐效果
- // 参数:
- // 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.pered > ndeta)
- {
- palettecolors.pered -= ndeta;
- bredzero = false;
- }
- else if (palettecolors.pered > 1)
- {
- palettecolors.pered--;
- bredzero = false;
- }
- else
- bredzero = true;
- if (palettecolors.pegreen > ndeta)
- {
- palettecolors.pegreen -= ndeta;
- bgreenzero = false;
- }
- else if (palettecolors.pegreen > 1)
- {
- palettecolors.pegreen--;
- bgreenzero = false;
- }
- else
- bgreenzero = true;
- if (palettecolors.peblue > ndeta)
- {
- palettecolors.peblue -= ndeta;
- bbluezero = false;
- }
- else if (palettecolors.peblue > 1)
- {
- palettecolors.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);
- HBITMAP CopyScreenToBitmap(LPRECT lpRect)
- //lpRect 代表选定区域
- {
- HDC hScrDC, hMemDC;
- // 屏幕和内存设备描述表
- HBITMAP hBitmap, hOldBitmap;
- // 位图句柄
- int nX, nY, nX2, nY2;
- // 选定区域坐标
- int nWidth, nHeight;
- // 位图宽度和高度
- int xScrn, yScrn;
- // 屏幕分辨率
- // 确保选定区域不为空矩形
- if (IsRectEmpty(lpRect))
- return NULL;
- //为屏幕创建设备描述表
- hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
- //为屏幕设备描述表创建兼容的内存设备描述表
- hMemDC = CreateCompatibleDC(hScrDC);
- // 获得选定区域坐标
- nX = lpRect- >left;
- nY = lpRect- >top;
- nX2 = lpRect- >right;
- nY2 = lpRect- >bottom;
- // 获得屏幕分辨率
- xScrn = GetDeviceCaps(hScrDC, HORZRES);
- yScrn = GetDeviceCaps(hScrDC, VERTRES);
- //确保选定区域是可见的
- if (nX 〈0)
- nX = 0;
- if (nY 〈 0)
- nY = 0;
- if (nX2 > xScrn)
- nX2 = xScrn;
- if (nY2 > yScrn)
- nY2 = yScrn;
- nWidth = nX2 - nX;
- nHeight = nY2 - nY;
- // 创建一个与屏幕设备描述表兼容的位图
- hBitmap = CreateCompatibleBitmap
- (hScrDC, nWidth, nHeight);
- // 把新位图选到内存设备描述表中
- hOldBitmap = SelectObject(hMemDC, hBitmap);
- // 把屏幕设备描述表拷贝到内存设备描述表中
- BitBlt(hMemDC, 0, 0, nWidth, nHeight,
- hScrDC, nX, nY, SRCCOPY);
- //得到屏幕位图的句柄
- hBitmap = SelectObject(hMemDC, hOldBitmap);
- //清除
- DeleteDC(hScrDC);
- DeleteDC(hMemDC);
- // 返回位图句柄
- return hBitmap;
- }
- 得到屏幕位图句柄以后,我们
- 可以把屏幕内容粘贴到剪贴板上.
- if (OpenClipboard(hWnd))
- //hWnd为程序窗口句柄
- {
- //清空剪贴板
- EmptyClipboard();
- //把屏幕内容粘贴到剪贴板上,
- hBitmap 为刚才的屏幕位图句柄
- SetClipboardData(CF_BITMAP, hBitmap);
- //关闭剪贴板
- CloseClipboard();
- }
- 我们也可以把屏幕内容以位图格式存到磁盘文件上.
- int SaveBitmapToFile(HBITMAP hBitmap ,
- LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄
- { //lpFileName 为位图文件名
- HDC hDC;
- //设备描述表
- int iBits;
- //当前显示分辨率下每个像素所占字节数
- WORD wBitCount;
- //位图中每个像素所占字节数
- //定义调色板大小, 位图中像素字节大小 ,
- 位图文件大小 , 写入文件字节数
- DWORD dwPaletteSize=0,
- dwBmBitsSize,
- dwDIBSize, dwWritten;
- BITMAP Bitmap;
- //位图属性结构
- BITMAPFILEHEADER bmfHdr;
- //位图文件头结构
- BITMAPINFOHEADER bi;
- //位图信息头结构
- LPBITMAPINFOHEADER lpbi;
- //指向位图信息头结构
- HANDLE fh, hDib, hPal,hOldPal=NULL;
- //定义文件,分配内存句柄,调色板句柄
- //计算位图文件每个像素所占字节数
- hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
- iBits = GetDeviceCaps(hDC, BITSPIXEL) *
- GetDeviceCaps(hDC, PLANES);
- DeleteDC(hDC);
- if (iBits 〈 = 1)
- wBitCount = 1;
- else if (iBits 〈 = 4)
- wBitCount = 4;
- else if (iBits 〈 = 8)
- wBitCount = 8;
- else if (iBits 〈 = 24)
- wBitCount = 24;
- //计算调色板大小
- if (wBitCount 〈 = 8)
- dwPaletteSize = (1 〈 〈 wBitCount) *
- sizeof(RGBQUAD);
- //设置位图信息头结构
- GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
- bi.biSize = sizeof(BITMAPINFOHEADER);
- bi.biWidth = Bitmap.bmWidth;
- bi.biHeight = Bitmap.bmHeight;
- bi.biPlanes = 1;
- bi.biBitCount = wBitCount;
- bi.biCompression = BI_RGB;
- bi.biSizeImage = 0;
- bi.biXPelsPerMeter = 0;
- bi.biYPelsPerMeter = 0;
- bi.biClrUsed = 0;
- bi.biClrImportant = 0;
- dwBmBitsSize = ((Bitmap.bmWidth *
- wBitCount+31)/32)* 4
- *Bitmap.bmHeight ;
- //为位图内容分配内存
- hDib = GlobalAlloc(GHND,dwBmBitsSize+
- dwPaletteSize+sizeof(BITMAPINFOHEADER));
- lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
- *lpbi = bi;
- // 处理调色板
- hPal = GetStockObject(DEFAULT_PALETTE);
- if (hPal)
- {
- hDC = GetDC(NULL);
- hOldPal = SelectPalette(hDC, hPal, FALSE);
- RealizePalette(hDC);
- }
- // 获取该调色板下新的像素值
- GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
- (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
- +dwPaletteSize,
- (BITMAPINFOHEADER *)
- lpbi, DIB_RGB_COLORS);
- //恢复调色板
- if (hOldPal)
- {
- SelectPalette(hDC, hOldPal, TRUE);
- RealizePalette(hDC);
- ReleaseDC(NULL, hDC);
- }
- //创建位图文件
- fh = CreateFile(lpFileName, GENERIC_WRITE,
- 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_
- FLAG_SEQUENTIAL_SCAN, NULL);
- if (fh == INVALID_HANDLE_VALUE)
- return FALSE;
- // 设置位图文件头
- bmfHdr.bfType = 0x4D42; // "BM"
- dwDIBSize = sizeof(BITMAPFILEHEADER)
- + sizeof(BITMAPINFOHEADER)
- + dwPaletteSize + dwBmBitsSize;
- bmfHdr.bfSize = dwDIBSize;
- bmfHdr.bfReserved1 = 0;
- bmfHdr.bfReserved2 = 0;
- bmfHdr.bfOffBits = (DWORD)sizeof
- (BITMAPFILEHEADER)
- + (DWORD)sizeof(BITMAPINFOHEADER)
- + dwPaletteSize;
- // 写入位图文件头
- WriteFile(fh, (LPSTR)&bmfHdr, sizeof
- (BITMAPFILEHEADER), &dwWritten, NULL);
- // 写入位图文件其余内容
- WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
- &dwWritten, NULL);
- //清除
- GlobalUnlock(hDib);
- GlobalFree(hDib);
- CloseHandle(fh);