前一阵找了好久也没有找到有关动态创建icon的文章,后来偶然发现一片写的,确实C#的。不能添加到vc6的mfc工程里里去。
。哎。。还是自食其力,看文档写个了。。。
这里是创建一个带字符串的hicon,想一下某些日历软件在系统托盘上的日期显示。。。
看了这个,相信看客可以举一反三了。。。
HICON CreateStrIcon(HDC hDc, LPCTSTR str, COLORREF clrBG)
{
// TODO: Add your control notification handler code here
HBITMAP hBmpMask;
HBITMAP hBmpColor;
BITMAP bmpInfoMask;
BITMAP bmpInfoColor;
bmpInfoMask.bmType = 0;
bmpInfoMask.bmWidth = 32;
bmpInfoMask.bmHeight = 32;
bmpInfoMask.bmWidthBytes = 4;
bmpInfoMask.bmPlanes = 1;
bmpInfoMask.bmBitsPixel = 1;
bmpInfoMask.bmBits = 0;
bmpInfoColor.bmType = 0;
bmpInfoColor.bmWidth = 32;
bmpInfoColor.bmHeight = 32;
bmpInfoColor.bmWidthBytes = 128;
bmpInfoColor.bmPlanes = 1;
bmpInfoColor.bmBitsPixel = 32;
bmpInfoColor.bmBits = 0;
hBmpMask = ::CreateBitmapIndirect(&bmpInfoMask);
hBmpColor = ::CreateBitmapIndirect(&bmpInfoColor);
char buf[128*32] = {0,255,255};
int i = 0;
for (i=0; i<128*32; i+=4)
{
buf[i] = 0;
buf[i+1]=255;
buf[i+2]=0;
buf[i+3]=0;
memcpy(&(buf[i]), &clrBG, 4);
}
::SetBitmapBits(hBmpColor,128*32,buf);
HDC dcTmp = ::CreateDC(hDd , NULL, NULL,NULL);;
HBITMAP hOldBmp;
hOldBmp = (HBITMAP)::SelectObject(dcTmp, hBmpColor);
RECT rt;
memset(&rt, 0, sizeof(rt));
rt.bottom = 32;
rt.right = 32;
::DrawText(dcTmp, str, strlen(str), &rt, DT_CENTER);
::SelectObject(dcTmp, hOldBmp);
::DeleteDC(dcTmp);
ICONINFO iconInfo;
iconInfo.fIcon = 1;
iconInfo.xHotspot = 16;
iconInfo.yHotspot = 16;
iconInfo.hbmMask = hBmpMask;
iconInfo.hbmColor = hBmpColor;
HICON hIcon = ::CreateIconIndirect(&iconInfo);
DeleteObject(hBmpColor);
DeleteObject(hBmpMask);
return hIcon;
}