博文

关于多进程/线程的FAQ汇总(2012-09-06 21:32:00)

摘要: 如何避免死锁?
如果线程在critical sections中结束会怎么样?

如果线程在Critical sections中停很久会怎么样?

什么是一个被激发的对象?

如果线程还在运行而我的程序结束了会怎么样?

为什么可以在不结束线程的情况下关闭起handle

为什么我应该调用CloseHandle()?

线程和进程有何不同?

我可以在Win32s中使用多个线程吗?

合作型多任务与抢先式多任务有和区别

消息分流器、子控件宏、API宏

win32环境下内存漏洞检查方法
......

阅读全文(848) | 评论:0 | 复制链接

防止CListCtrl闪烁的几种方法(2011-01-05 10:39:00)

摘要:原文:http://www.eggsheller.com/blog/?p=34
1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlList.SetRedraw(FALSE); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.SetRedraw(TRUE); 2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘 m_ctlList.LockWindowUpdate(); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.UnlockWindowUpdate(); 3.使用ListCtrl的内部双缓冲 m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER); VC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下: #define LVS_EX_DOUBLEBUFFER 0×00010000 4.Virtual List 首先要设置ListCtrl风格为LVS_REPORT | LVS_OWNERDATA或在ListCtrl属里中的More Styles页面中选中Owner data复选框。 其次要向应LVN_GETDISPINFO消息; void OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; LV_ITEM *pItem = &(pDispInfo)->item;
char szText[128] = {0};
if (pItem->mask & LVIF_TEXT)
{ //使缓冲区数据与表格子项对应 //m_ArrayBuff为二维数组 //定义如下 int m_ArrayBuff[2048][4];
_stprintf(szText,_T(“%d”),m_ArrayBuff[p......

阅读全文(2180) | 评论:0 | 复制链接

VC F1建弹出打开帮组文档!代码(2010-11-02 19:22:00)

摘要://代码就不加注释了 一看就懂的了 ^_^  BOOL CXXXXXXXXDlg::PreTranslateMessage(LPMSG lpmsg) {
          BOOL bHandleNow = FALSE;  switch (lpmsg->message)
 {
 case WM_KEYDOWN:
         switch (lpmsg->wParam)
        {
         case VK_F1:
           {
                // for F1 popup help documents follow language option 
                TCHAR szFilePath[MAX_PATH];
                memset(szFilePath,0x00,MAX_PATH);
    &nb......

阅读全文(2227) | 评论:0 | 复制链接

VC获取应用程序版本关键代码(2010-09-30 15:55:00)

摘要:Requirements   Windows NT/2000/XP: Included in Windows NT 3.1 and later.
  Windows 95/98/Me: Included in Windows 95 and later.
  Header: Declared in Winver.h; include Windows.h.
  Library: Use Version.lib.       TCHAR szApp[MAX_PATH] = {0};
 GetModuleFileName(NULL,szApp,MAX_PATH);
 DWORD dwVerInfoSize = GetFileVersionInfoSize(szApp,0);    ASSERT(dwVerInfoSize>0);
 BYTE *pVerInfor = new BYTE[dwVerInfoSize];
 if(!pVerInfor)
 {
        ASSERT(pVerInfor);
        return;
 }    VERIFY(GetFileVersionInfo(szApp,0,dwVerInfoSize,pVerInfor));    VS_FIXEDFILEINFO *pVsInfo = NULL;
 UINT uVerSize = 0;    CString strWinText,strVer;
 if(VerQueryValue(pVerInfor,_T("......

阅读全文(2520) | 评论:0 | 复制链接

VC 链接器工具错误和警告(2010-09-14 18:17:00)

摘要:LINK、LIB、DUMPBIN 和 EDITBIN 产生这些错误和警告。若要获得特定错误信息的相关帮助,请在“输出”窗口中的错误号上单击鼠标并按 F1,在“索引”的“查找”框中键入错误号,或单击下面的链接。 链接器工具错误 LNK1000 链接器工具错误 LNK1101 链接器工具错误 LNK1102 链接器工具错误 LNK1103 链接器工具错误 LNK1104 链接器工具错误 LNK1105 链接器工具错误 LNK1106 链接器工具错误 LNK1107 链接器工具错误 LNK1108 链接器工具错误 LNK1109 链接器工具错误 LNK1110 链接器工具错误 LNK1111 链接器工具错误 LNK1112 链接器工具错误 LNK1113 链接器工具错误 LNK1115 链接器工具错误 LNK1117 链接器工具错误 LNK1118 链接器工具错误 LNK1119 链接器工具错误 LNK1120 链接器工具错误 LNK1121 链接器工具错误 LNK1123 链接器工具错误 LNK1127 链接器工具错误 LNK1129 链接器工具错误 LNK1130 链接器工具错误 LNK1131 链接器工具错误 LNK1132 链接器工具错误 LNK1136 链接器工具错误 LNK1137 链接器工具错误 LNK1140 链接器工具错误 LNK1141 链接器工具错误 LNK1143 链接器工具错误 LNK1145 链接器工具错误 LNK1146 链接器工具错误 LNK1147 链接器工具错误 LNK1148 链接器工具错误 LNK1149 链接器工具错误 LNK1152 链接器工具错误 LNK1154 链接器工具错误 LNK1155 链接器工具错误 LNK1156 链接器工具错误 LNK1158 链接器工具错误 LNK1159 链接器工具错误 LNK1160 链接器工具错误 LNK1161 链接器工具错误 LNK1162 链接器工具错误 LNK1163 链接器工具错误 LNK1164 链接器工具错误 LNK1165 链接器工具错误 LNK1166 链接器工具错误 LNK1167 链接器工具错误 LNK1168 链接器工具错误 LNK1169 链接器工具错误 LN......

阅读全文(4328) | 评论:0 | 复制链接

GDI+在内存中绘制,并保存为BMP、PNG、JPEG格式的图片关键代码(2010-09-11 12:02:00)

摘要:// 获取指定图片格式CLSID int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
 UINT num= 0;
 UINT size= 0;  ImageCodecInfo* pImageCodecInfo= NULL;  GetImageEncodersSize(&num, &size);
 if(size== 0)
 {
  return -1;
 }
 pImageCodecInfo= (ImageCodecInfo*)(malloc(size));
 if(pImageCodecInfo== NULL)
 {
  return -1;
 }  GetImageEncoders(num, size, pImageCodecInfo);  for(UINT j=0; j< num; ++j)
 {
  if(wcscmp(pImageCodecInfo[j].MimeType, format)== 0)
  {
   *pClsid= pImageCodecInfo[j].Clsid;
   free(pImageCodecInfo);
   pImageCodecInfo= NULL;
   return j;
  }
 }  free(pImageCodecInfo);
 pImageCodecInfo= NULL;  return -1;
} &......

阅读全文(5922) | 评论:0 | 复制链接

GDI+双缓冲绘制步骤(2010-09-11 11:56:00)

摘要:双缓冲的具体步骤:1、在内存中建立一块“虚拟画布”: Bitmap bmp = new Bitmap(600, 600); 2、获取这块内存画布的Graphics引用: Graphics g = Graphics.FromImage(bmp); 3、在这块内存画布上绘图: g.FillEllipse(brush, i * 10, j * 10, 10, 10); 4、将内存画布画到窗口中 this.CreateGraphics().DrawImage(bmp, 0, 0);      ......

阅读全文(1725) | 评论:0 | 复制链接

GDI+ 文本输出(2010-09-06 22:17:00)

摘要:需要GDI+环境支持   Graphics graphics(pDC->m_hDC); FontFamily  fontFamily(L"Times New Roman"); //字体设置
Font        font(&fontFamily, 24, FontStyleRegular, UnitPixel); // 文本大小、显示方式设置 更详细的请参考MSDN
PointF      pointF(30.0f, 10.0f); // 输出起始点
SolidBrush  solidBrush(Color(255, 0, 0, 255)); // 刷子

graphics.DrawString(L"Hello", -1, &font, pointF, &solidBrush);......

阅读全文(1472) | 评论:0 | 复制链接

GDI+计算文本行距等(2010-09-06 16:06:00)

摘要: FontFamily fontFamily(szFaceName/*(WCHAR*)strFaceName.GetBuffer()*/);
 Font font(&fontFamily, (REAL)m_txLogFont.lfHeight, FontStyleRegular, UnitPixel);  // 文本
 UINT ascent;
 REAL ascentPixel;
 UINT descent;
 REAL descentPixel;
 UINT lineSpacing;
 REAL lineSpacingPixel;  // 获取 字体上部距离
 ascent = fontFamily.GetCellAscent(FontStyleRegular);
 // 转换为像素单位
 ascentPixel = font.GetSize()*ascent/fontFamily.GetEmHeight(FontStyleRegular);  // 获取字体下部距离
 descent = fontFamily.GetCellDescent(FontStyleRegular);
 // 转换为像素单位
 descentPixel = font.GetSize()*descent/fontFamily.GetEmHeight(FontStyleRegular);  // 获取字体行距
 lineSpacing = fontFamily.GetLineSpacing(FontStyleRegular);
 // 转换为像素单位
 lineSpacingPixel = font.GetSize()*lineSpacing/fontFamily.GetEmHeight(FontStyleRegular);  // 计......

阅读全文(2886) | 评论:0 | 复制链接

VC GDI双缓冲机制防图形绘制闪烁(2010-08-30 16:10:00)

摘要:     在OnDraw(CDC* pDC) 中添加如下代码      CDC MemDC; //首先定义一个显示设备对象
  CBitmap MemBitmap;//定义一个位图对象
  //随后建立与屏幕显示兼容的内存显示设备
  MemDC.CreateCompatibleDC(NULL);
  //这时还不能绘图,因为没有地方画 ^_^
  //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
  MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
  //将位图选入到内存显示设备中
  //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
  CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
  //先用背景色将位图清除干净,这里我用的是白色作为背景
  //你也可以用自己应该用的颜色
  MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
  //绘图
  MemDC.MoveTo(……);
  MemDC.LineTo(……);
  //将内存中的图拷贝到屏幕上进行显示
  pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
  //绘图完成后的清理
  MemBitmap.DeleteObject();   MemDC.DeleteDC();......

阅读全文(2987) | 评论:0 | 复制链接