最近圣诞快来了,看到很多小程序比如什么圣诞快乐,然后在桌面显示雪花~~很不错的程序,逆向了两下源码。。不过后面想想算了,里面的实现细节也不复杂,自己动手下~
关键的两个东西:
第一个对话框窗体的隐藏--直接根据我上一篇转载的方法,在初始化过程中加入
SetWindowPos(&wndTop,0,0,0,0,NULL);
第二个是在桌面显示图片~
代码如下:
void CTryDlg::Show(UINT IDImage,int x,int y, COLORREF rgbMask)
{
HBITMAP hBmp,maskBitmap;
BITMAP imgInfo;
hBmp=::LoadBitmap(AfxFindResourceHandle(MAKEINTRESOURCE(IDImage), RT_BITMAP), MAKEINTRESOURCE(IDImage));
::GetObject(hBmp,sizeof(BITMAP),&imgInfo);
HDC hDC=::GetDC(0);
HDC hMemDC=::CreateCompatibleDC(hDC);
::SelectObject(hMemDC,hBmp);
HDC hMaskDC=::CreateCompatibleDC(hDC);
HBITMAP hOldBitmap=(HBITMAP)::SelectObject(hMemDC,hBmp);
maskBitmap=::CreateBitmap(imgInfo.bmWidth, imgInfo.bmHeight,1,1,NULL);
::SelectObject(hMaskDC,maskBitmap);
::SetBkColor(hMemDC,rgbMask);
::BitBlt(hMaskDC,0,0,imgInfo.bmWidth,imgInfo.bmHeight,hMemDC,0,0,SRCCOPY);
::SetBkColor(hMemDC,RGB(0,0,0));
::SetTextColor(hMemDC,RGB(255,255,255));
::BitBlt(hMemDC,0,0,imgInfo.bmWidth, imgInfo.bmHeight,hMaskDC,0,0,SRCAND);
::BitBlt(hDC,x,y,imgInfo.bmWidth, imgInfo.bmHeight, hMaskDC, 0, 0, SRCAND);
::BitBlt(hDC,x,y,imgInfo.bmWidth, imgInfo.bmHeight, hMemDC, 0, 0,SRCPAINT);
::SelectObject(hMemDC,hOldBitmap);
::DeleteDC(hMemDC);
::DeleteDC(hMaskDC);
}
这个函数要求图片背景和掩码一样,这样可以去背景显示。这个函数是和MFC类库相关的,因为里面用到了AfxFindResourceHandle,跟踪它的源码有点多,时间比较紧就没跟了,继续跟踪然后抠出里面的WIN32函数是可以让这个函数脱离MFC环境的,有兴趣的朋友可以试试~~另外说一句,AfxFindResourceHandle是在多个模块中找资源句柄的,很犀利~~测试的结果如下~
后面的就靠大家的发挥了,做个小东西玩玩~~