Archive for the ‘C++’ Category.

stl中的list,map,vector等的erase循环遍历删除元素

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循环遍历删除元素’ »

获取当前windows操作系统语言环境

有时候需要实现中文切换,自动根据当前语言环境显示不同界面,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操作系统语言环境’ »

CFileDialog选择多文件出错返回FNERR_BUFFERTOOSMALL

在使用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’ »

MFC打开选择文件目录对话框且显示新建文件夹按钮

在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打开选择文件目录对话框且显示新建文件夹按钮’ »

MFC的ClistCtrl删除选中多行项目

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]

MFC的Tab Control属性页中添加右键菜单事件

在MFC中,如果想要给Tab Control的某一个属性页添加右键菜单,那么首先要在资源里添加菜单内容,并给菜单内容设置事件处理。

然后在属性页的类中添加右键事件
Continue reading ‘MFC的Tab Control属性页中添加右键菜单事件’ »

实现窗口最大化最小化消息事件

有如下两种方法实现:
第一种:
给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 ‘实现窗口最大化最小化消息事件’ »

线程中调用PostMessage()出现内存访问错误

为什么在线程中调用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]

VC提示IDC_HAND未声明的标识符

我在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]

这样就可以了。这是由于宏没有定义导致标识符无法识别的问题。

MFC中使用控制台输出printf内容

在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]