看一看Icon有没有可以设颜色深度的method or property
解决方案 »
- C# 由csv文件向sql中导入数据算法问题
- form窗口调用页面消除掉页面背景,显示为透明的问题?
- 关于触发类事件的问题。
- 引用Excel9.0 lib做EXCEL操作,进行单元格赋值“1/6”的字符串的,导出Excel自动转成"1月6日"日期格式了,请问怎么设单元格为文本格式呢?附
- 動態改變Webservice的數據連接串問題
- 关于接口继承问题!谁能给我举一个多接口继承的实例呀?
- 关于在C#中如何算字符串的字节长度问题?急...在线等候高手...
- C#该如何入门
- windows 下时钟的那种输入是怎样实现的,进来看看,在线守候,立即加分
- 多核cpu有多少个运算器,控制器和缓存
- 初任项目经理的同仁来集合。
- 初学HOOK遇到了一个问题。。
这是我以前做Borland C++ Builder 时用的方法
将下面代码做成DLL,让后调用SaveIcon函数
(.NET中我想应该要用到 COM Interoperation)源码如下://--------------------------------------------------
#include <windows.h>#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst,
unsigned long reason, void* lpReserved)
{
return 1;
}struct TCursorOrIcon
{
WORD Reserved;
WORD wType;
WORD Count;
};struct TIconRec
{
BYTE Width;
BYTE Height;
WORD Colors;
WORD Reserved1;
WORD Reserved2;
long DIBSize;
long DIBOffset;
};static void InitBmpInfoHeader(HBITMAP Bitmap,
BITMAPINFOHEADER& BI, int nBit)
{
int Bytes;
DIBSECTION DS; DS.dsBmih.biSize = 0;
Bytes = GetObject(Bitmap, sizeof(
DS), &DS);
if (Bytes>=sizeof(DS.dsBm)+sizeof(
DS.dsBmih) && DS.dsBmih.biSize
>=sizeof(DS.dsBmih))
memcpy(&BI, &DS.dsBmih, sizeof(
BITMAPINFOHEADER));
else {
memset(&BI, 0, sizeof(BI));
BI.biSize = sizeof(BI);
BI.biWidth = DS.dsBm.bmWidth;
BI.biHeight = DS.dsBm.bmHeight;
BI.biBitCount = DS.dsBm.bmPlanes
* DS.dsBm.bmBitsPixel;
}
if (nBit!=0) BI.biBitCount = nBit;
if (BI.biBitCount <= 8)
BI.biClrUsed = 1<<BI.biBitCount;
BI.biPlanes = 1;
if (BI.biClrImportant > BI.biClrUsed)
BI.biClrImportant = BI.biClrUsed;
if (BI.biSizeImage == 0)
BI.biSizeImage = ((BI.biWidth*BI.
biBitCount+31) / 32) * 4 * BI
.biHeight;
}static void GetDIBSizes(HBITMAP Bitmap,
DWORD& InfoSize, DWORD& ImageSize,
int nBit)
{
BITMAPINFOHEADER BI; InitBmpInfoHeader(Bitmap, BI, nBit);
InfoSize = sizeof(BITMAPINFOHEADER);
if (BI.biBitCount > 8) {
if (BI.biCompression&BI_BITFIELDS)
InfoSize += 12;
}
else
InfoSize += sizeof(RGBQUAD) * (BI
.biClrUsed!=0 ? BI.biClrUsed :
(1 << BI.biBitCount));
ImageSize = BI.biSizeImage;
}static void GetDIB(HBITMAP Bitmap,
BITMAPINFO* BmpInfo, void* Bits, int nBit)
{
HDC DC; DC = CreateCompatibleDC(NULL);
InitBmpInfoHeader(Bitmap, BmpInfo
->bmiHeader, nBit);
GetDIBits(DC, Bitmap, 0, BmpInfo
->bmiHeader.biHeight, Bits,
BmpInfo, DIB_RGB_COLORS);
DeleteDC(DC);
}extern "C" __declspec(dllexport) BOOL _stdcall
SaveIcon(HICON Icon, LPCSTR FileName, int nBit)
{
BOOL ret;
UINT nColor;
long Length;
void *MonoBits;
void *ColorBits;
DWORD dwWrite;
HANDLE hFile;
TIconRec List;
ICONINFO IconInfo;
TCursorOrIcon CI;
DWORD MonoInfoSize;
DWORD ColorInfoSize;
DWORD MonoBitsSize;
DWORD ColorBitsSize;
BITMAPINFO *MonoInfo;
BITMAPINFO *ColorInfo; switch(nBit) {
case 0:
case 1:
case 4:
case 8:
case 16:
case 24:
case 32: break;
default: return FALSE;
}
if (Icon==NULL || !FileName)
return FALSE; hFile = CreateFile(FileName,
GENERIC_WRITE, FILE_SHARE_READ,
0, CREATE_ALWAYS, 0, 0);
if (hFile==INVALID_HANDLE_VALUE)
return false;
memset(&CI, 0, sizeof(CI));
memset(&List, 0, sizeof(List));
GetIconInfo(Icon, &IconInfo); GetDIBSizes(IconInfo.hbmMask,
MonoInfoSize, MonoBitsSize, 1);
GetDIBSizes(IconInfo.hbmColor,
ColorInfoSize, ColorBitsSize,
nBit);
MonoInfo = (BITMAPINFO*)malloc(
MonoInfoSize);
ColorInfo = (BITMAPINFO*)malloc(
ColorInfoSize);
MonoBits = malloc(MonoBitsSize);
ColorBits = malloc(ColorBitsSize);
GetDIB(IconInfo.hbmMask, MonoInfo,
MonoBits, 1);
GetDIB(IconInfo.hbmColor, ColorInfo,
ColorBits, nBit);
CI.wType = 0x10001; CI.Count = 1;
ret &= WriteFile(hFile, &CI, sizeof(CI),
&dwWrite, NULL);
List.Width = ColorInfo->bmiHeader.biWidth;
List.Height = ColorInfo->bmiHeader.biHeight;
List.Colors = ColorInfo->bmiHeader.biPlanes
* ColorInfo->bmiHeader.biBitCount;
List.DIBSize = ColorInfoSize + ColorBitsSize
+ MonoBitsSize;
List.DIBOffset = sizeof(CI) + sizeof(List);
ret &= WriteFile(hFile, &List, sizeof(List),
&dwWrite, NULL);
ColorInfo->bmiHeader.biHeight *= 2;
ret &= WriteFile(hFile, ColorInfo,
ColorInfoSize, &dwWrite, NULL);
ret &= WriteFile(hFile, ColorBits,
ColorBitsSize, &dwWrite, NULL);
ret &= WriteFile(hFile, MonoBits,
MonoBitsSize, &dwWrite, NULL);
free(ColorInfo); free(MonoInfo);
free(ColorBits); free(MonoBits);
DeleteObject(IconInfo.hbmColor);
DeleteObject(IconInfo.hbmMask); CloseHandle(hFile); return ret;
}