code clip

收集的一些常用代码以及FAQ

一.VC

  •  在SDK中使用CSring
1.首先将<windows.h>替换为<afx.h>,测试源程序为:
#include <afx.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  CString str = "Hello, World!";
  MessageBox(NULL, str, "Hello", 0);
  return 0;
}
2.将上述程序编译,有链接错误:
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
这是没有使用多线程库的错误。
3.在Project->Settings的C/C++选项卡的Project Options中加入/MT开关支持多线程库即可。
另外一个方法是在Project->Settings的常规选项卡,选择使用MFC。
  • 判断文件是否存在

BOOL FileExists(LPCTSTR lpszFileName)
{
  BOOL bRet;
  HANDLE hFind;
  WIN32_FIND_DATA wfd;
  hFind = FindFirstFile(lpszFileName, &wfd);
  bRet = hFind != INVALID_HANDLE_VALUE;
  FindClose(hFind);
  return bRet;
}

代码说明:
lpszFileName:要判断是否存在的文件名。
返回值:如果存在则返回TRUE,否则返回FALSE。

  • 删除一个文件夹

BOOL DelTree(LPCTSTR lpszPath)
{
  SHFILEOPSTRUCT FileOp;
  FileOp.fFlags = FOF_NOCONFIRMATION;
  FileOp.hNameMappings = NULL;
  FileOp.hwnd = NULL;
  FileOp.lpszProgressTitle = NULL;
  FileOp.pFrom = lpszPath;
  FileOp.pTo = NULL;
  FileOp.wFunc = FO_DELETE;
  return SHFileOperation(&FileOp) == 0;
}

代码说明:
lpszPath:要删除的文件夹名称。
返回值:成功返回TRUE,否则返回FALSE。
备注:删除单个文件亦可。

  • 将位图句柄保存为BMP文件

BOOL SaveToFile(HBITMAP hBitmap, LPCTSTR lpszFileName)
{
  HDC hDC;
  //当前分辨率下每象素所占字节数
  int iBits;
  //位图中每象素所占字节数
  WORD wBitCount;
  //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
  DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
  //位图属性结构
  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
    wBitCount = 24;
  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.biClrImportant = 0;
  bi.biClrUsed = 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, (HPALETTE)hPal, FALSE);
    RealizePalette(hDC);
  }
 
  // 获取该调色板下新的像素值
  GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
    +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
  //恢复调色板
  if (hOldPal)
  {
    SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    RealizePalette(hDC);
    ReleaseDC(NULL, hDC);
  }
  //创建位图文件 
  fh = CreateFile(lpszFileName, 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);
  return TRUE;
}

代码说明:
hBitmap:要保存的位图句柄。
lpszFileName:要保存的BMP文件名。
返回值:成功返回TRUE,否则返回FALSE。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值