根据位图的ID将其显示在桌面~(MFC)

最近圣诞快来了,看到很多小程序比如什么圣诞快乐,然后在桌面显示雪花~~很不错的程序,逆向了两下源码。。不过后面想想算了,里面的实现细节也不复杂,自己动手下~

关键的两个东西:

第一个对话框窗体的隐藏--直接根据我上一篇转载的方法,在初始化过程中加入

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是在多个模块中找资源句柄的,很犀利~~测试的结果如下~

后面的就靠大家的发挥了,做个小东西玩玩~~

你可能感兴趣的:(根据位图的ID将其显示在桌面~(MFC))