博文
关于多进程/线程的FAQ汇总(2012-09-06 21:32:00)
摘要:
如何避免死锁?
如果线程在critical sections中结束会怎么样?
如果线程在Critical sections中停很久会怎么样?
什么是一个被激发的对象?
如果线程还在运行而我的程序结束了会怎么样?
为什么可以在不结束线程的情况下关闭起handle
为什么我应该调用CloseHandle()?
线程和进程有何不同?
我可以在Win32s中使用多个线程吗?
合作型多任务与抢先式多任务有和区别
消息分流器、子控件宏、API宏
win32环境下内存漏洞检查方法
......
防止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......
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......
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("......
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......
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;
}
&......
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);
......
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);......
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);
// 计......
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();......