Archive for the ‘C++’ Category.
2012年11月27日, 下午3:31
stl中的list,map与vector调用erase删除元素有些区别,都可以使用itor = listInt.erase(itor);的试,但vecotr不能使用listInt.erase(itor++);
[php]
//list方式
std::list<int> listInt;
for (int i = 0; i < 10; i++)
{
listInt.push_back(i);
}
std::list<int>::iterator itor = listInt.begin();
while (itor != listInt.end())
{
int a = (*itor);
if (a%2 == 0)
{
itor = listInt.erase(itor); //此处是将erase返回的指针传给itor
continue;
}
itor++;
}
[/php]
Continue reading ‘stl中的list,map,vector等的erase循环遍历删除元素’ »
Category:
C++ |
stl中的list,map,vector等的erase循环遍历删除元素已关闭评论
2012年11月24日, 下午3:25
有时候需要实现中文切换,自动根据当前语言环境显示不同界面,windows的API中有获取语言环境的函数GetSystemDefaultLangID
[php]
#include
#pragma comment(lib,"Kernel32.lib")
LANGID lid = GetSystemDefaultLangID();
switch (lid)
{
case 0X0804:
/MessageBox(_T("Chiese"));
break;
case 0x0409:
//MessageBox(_T("English"));
break;
}
[/php]
下面是各语言的对照表
Continue reading ‘获取当前windows操作系统语言环境’ »
Category:
C++ |
获取当前windows操作系统语言环境已关闭评论
2012年11月14日, 下午6:51
在使用CFileDialog类打开文件中,若要同时选择多个文件,需要设置OFN_ALLOWMULTISELECT属性,如下代码所示:
[php]
CFileDialog fileDlg(true, NULL, NULL, OFN_ALLOWMULTISELECT);
fileDlg.m_ofn.lpstrFilter = _T("ZV File(*.zv)\0 *.zv\0MPG File(*.mpg)\0 *.mpg\0MPEG4 File(*.mpeg4)\0 *.mpeg4\0H264 File(*.264)\0 *.264\0All File(*.*)\0 *.*\0");
if (IDOK == fileDlg.DoModal())
{
POSITION pos = fileDlg.GetStartPosition();
while(pos)
{
CString strPathName = fileDlg.GetNextPathName(pos);
AfxMessageBox(strPathName);
}
}
[/php]
Continue reading ‘CFileDialog选择多文件出错返回FNERR_BUFFERTOOSMALL’ »
Category:
C++ |
CFileDialog选择多文件出错返回FNERR_BUFFERTOOSMALL已关闭评论
2012年11月12日, 下午2:01
在MFC中,若要打开文件目录选择对话框,需要使用BROWSEINFO结构体,具体代码如下:
[php]
void CBatchConvert::OnBrowseOutDir()
{
// TODO: 在此添加控件通知处理程序代码
char szPath[MAX_PATH]; //存放选择的目录路径
memset(szPath, 0, sizeof(szPath));
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = (LPWSTR)szPath;
bi.lpszTitle = _T("请选择转换后的文件输出目录:");
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
//弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if(lp && SHGetPathFromIDList(lp, (LPWSTR)szPath))
{
CString strOutDir;
strOutDir.Format(_T("%s"), szPath);
AfxMessageBox(strOutDir);
}
}
[/php]
Continue reading ‘MFC打开选择文件目录对话框且显示新建文件夹按钮’ »
Category:
C++ |
MFC打开选择文件目录对话框且显示新建文件夹按钮已关闭评论
2012年11月10日, 上午11:21
MFC的ClistCtrl控件添加了多行数据后,若要删除选中的多行数据,可以使用ClistCtrl的成员函数,在网上找了很多例子,发现都有问题,因为在删除ClistCtrl行的时候,删除行下面的行会上移,那么下一个要删除的行的索引会改变,导致删除的是删除行下两行位置的数据,删除不完全。
使用下面代码可完全删除选中行:
[php]
void CBatchConvert::OnDeleteFile()
{
// TODO: 在此添加命令处理程序代码
POSITION pos = m_ctrlBatchFile.GetFirstSelectedItemPosition();
while(pos)
{
int nIndex = m_ctrlBatchFile.GetNextSelectedItem(pos);
m_ctrlBatchFile.DeleteItem(nIndex);
pos = m_ctrlBatchFile.GetFirstSelectedItemPosition(); //这步很重要,不然删除不完全
}
}
[/php]
Category:
C++ |
MFC的ClistCtrl删除选中多行项目已关闭评论
2012年11月8日, 下午5:42
在MFC中,如果想要给Tab Control的某一个属性页添加右键菜单,那么首先要在资源里添加菜单内容,并给菜单内容设置事件处理。
然后在属性页的类中添加右键事件
Continue reading ‘MFC的Tab Control属性页中添加右键菜单事件’ »
Category:
C++ |
MFC的Tab Control属性页中添加右键菜单事件已关闭评论
2012年10月29日, 上午10:03
有如下两种方法实现:
第一种:
给Dlg类添加WM_SIZE事件,会自动生成OnSize()方法
[php]
void CTrayDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//最小化 SIZE_MINIMIZED
//最大化 SIZE_MAXIMIZED
//还原 SIZE_RESTORED
if (nType== SIZE_MINIMIZED) //响应最小化
{
//在这里添加最小化需要处理的事件
ShowWindow(SW_HIDE);
}
}
[/php]
第二种:
Continue reading ‘实现窗口最大化最小化消息事件’ »
Category:
C++ |
实现窗口最大化最小化消息事件已关闭评论
2012年10月27日, 下午1:25
为什么在线程中调用AfxGetMainWnd()->PostMessage(WM_DISPLAY,0,0);会出现内存访问错误?
解决办法如下:
在创建线程的时候,用AfxGetMainWnd()->GetSafeHwnd()得到主窗口的HWND值,并作为创建线程的参数,传给线程。在线程中,使用这个HWND,比如:
主程序中:
[php]
HWND hMainWnd = AfxGetMainWnd()->GetSafeHwnd();
AfxBeginThread(YourThreadFunc, (LPVOID)hMainWnd);
[/php]
线程函数:
[php]
UINT YourThreadFunc(LPVOID pParam)
{
……
HWND hMainWnd = (HWND)pParam;
::PostMessage(hMainWnd, WM_DISPLAY,0,0);
……
}
[/php]
Category:
C++ |
线程中调用PostMessage()出现内存访问错误已关闭评论
2012年10月23日, 上午10:06
我在MFC中设置鼠标图标的时候,用到:
[php]
HCURSOR hCursor;
hCursor = AfxGetApp()->LoadCursor(IDC_HAND);
[/php]
然后编译,编译器报错,提示IDC_HAND未声明的标识符,但是可以在代码中查看到已经定义了。
感觉到莫名其妙,解决办法是:
打开stdafx.h找到#include ,在这之前,记住一定要在这段代码之前(否则没有效果)加上:
[php]
#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
[/php]
这样就可以了。这是由于宏没有定义导致标识符无法识别的问题。
Category:
C++ |
VC提示IDC_HAND未声明的标识符已关闭评论
2012年10月21日, 下午4:24
在win32和MFC程序中,有时需要输出一些调试信息,本文介绍在win32和MFC程序中使用控制台输出信息的方法。
我们可以在应用程序里使用AllocConsole()函数自己开一个控制台(就像DOS窗口一样),然后重定向输入输出,就可以用printf函数向控制台输出信息了,具体方法如下:
在CWinApp的重载函数InitInstance()中输入如下语句,开辟一个控制台并重定向输出
[php]
<div>AllocConsole(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 开辟控制台</div>
<div>SetConsoleTitle(_T("Debug Output")); ? ? ?// 设置控制台窗口标题</div>
<div>freopen("CONOUT$","w",stdout); ? ? ? ? ? ? // 重定向输出</div>
[/php]
然后一定要在CWinApp的重载函数ExitInstance()中调用如下语句释放控制台。
[php]
FreeConsole();
[/php]
Category:
C++ |
MFC中使用控制台输出printf内容已关闭评论