Posted on 30-06-2009
Filed Under (技术) by waterlin

今天写一个程序,其中一个功能是用对话框来选择一个文件夹的路径。可是以前常用的CFileDialog必须指定到文件,选择一个文件夹只能继续打开而不能返回这个路径,CFileDialog貌视也没有参数可以弄成选择文件夹的式样。上网找了找,CSDN里有人提供下面这个函数的用法

CString ShowSelectDirectoryDlg(const CString & strDlgTitle)
{
char szDir[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST *pidl;

bi.hwndOwner = this->m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = strDlgTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;

pidl = SHBrowseForFolder(&bi);
if(pidl == NULL)
return _T(“”);

if(!SHGetPathFromIDList(pidl, szDir))
return _T(“”);

return CString(szDir);
}

这个函数的传入参数strDlgTitle,就是选择文件夹对话框的标题栏名称。只需要模拟这个函数的写法,添加代码到特定的消息响应函数里去就可以了。

(1) Comment    Read More   
Posted on 29-06-2009
Filed Under (技术) by waterlin

据说绿坝里的图像识别用的是OpenCV这个库,作为图像处理专业出身的我,免不了对这个东西产生了一些兴趣。下载OpenCV下来用一用,看看这个东西效果如何。

更多的信息,请访问OpenCV的Wiki站点,例如如何在VC里编译OpenCV的官方文档等等。

下面就是我在Windows XP下,用Visual Studio 2005来使用OpenCV库的设置步骤:

第一步,下载和安装OpenCV库,根据操作系统下载相应的版本。

第二步,把OpenCV库的可执行文件路径加到系统的环境变量PATH里,在我这里是C:\Program Files\OpenCV\bin。

第三步,在Visual Studio 2005里进行必要的全局设置:

1) 在Visual Studio里,选择”Tools -> Options”;

2) 在弹出的对话框里,再选择”Projects -> VC++ Directories”;

3) 在上面的对话框里,从”Show Directories for”下拉框里选择”Library files”;

4) 在Library files列表里, 添加这样一个路径”C:\Program Files\OpenCV\lib”;

4.png

5) 从2)的对话框里选择”Include Files”下拉框,然后再添加以下目录:

“C:\Program Files\OpenCV\cv\include”
“C:\Program Files\OpenCV\cxcore\include”
“C:\Program Files\OpenCV\otherlibs\highgui”
“C:\Program Files\OpenCV\cvaux\include”
“C:\Program Files\OpenCV\otherlibs\_graphics\include”

5.png

6) 选择下拉框里的”source files”,然后把下面的路径加进去:

“C:\Program Files\OpenCV\cv\src”
“C:\Program Files\OpenCV\cxcore\src”
“C:\Program Files\OpenCV\cvaux\src”
“C:\Program Files\OpenCV\otherlibs\highgui”
“C:\Program Files\OpenCV\otherlibs\_graphics\src”

6.png

当然,你应该把上述路径替换成你自己的路径。就这样,Visual Studio 2005里的全局变量就配置好了。

第四步,完成了上述配置,就创建一个OpenCV工程来试一把。

创建一个名叫OpenCVHello的”Win32 Application”或是”Win32 console application”工程,如果想节省编译时间,建议把Precompiled header这个选项给选上。

把以下几个文件include进去,并且要放在stdafx.h文件后面,否则很可能会编译出错。

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

编译一下,应该可以成功。然后我们在主函数_tmain()输入一些OpenCV代码来试试:

IplImage *img = cvLoadImage(“Image.bmp”);
cvNamedWindow(“Image:”,1);
cvShowImage(“Image:”, img);
cvWaitKey();
cvDestroyWindow(“Image:”);
cvReleaseImage(&img);

编译一下,应该会提示一些链接错误的信息。这个时候,从”Project” -> “Properties”打开项目工程的属性,在”Linker” -> “Input” -> “Additional Dependencies”里添加下面这些lib库:

cxcore.lib cv.lib highgui.lib cvaux.lib cvcam.lib

7.png

这样应该就可以编译了。整个代码看起来就像这样:

8.png

以后有空再深入研究一下OpenCV库的更多用法。

(1) Comment    Read More   
Posted on 19-06-2009
Filed Under (技术) by waterlin

最近我在Cygwin中碰到要操作中文字符的问题,显示Windows的中文目录或文件名的时候,看到所有中文文件都变成了”?????”。并且Cygwin并没有办法输入中文作为命令参数,比如新建一个中文名的文件。上网搜了一下,找到了一个解决办法。

配置步骤:

1.在用户home目录里的.bash_profile文件末尾添加如下代码

export LC_ALL=en_US.UTF-16
export LC_CTYPE=en_US.UTF-16
export LANG=en_US.UTF-16
export XMODIFIERS=@im=Chinput3
stty cs8 -istrip
stty pass8
export LESSCHARSET=latin1

2.解决中文输入的问题

Cygwin里默认不会显示你输入的中文,而是显示一大堆的编码。同样是用户的home目录,去掉.inputrc文件中以下代码的注释(前面的#号):

set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

如果你没有.inputrc文件,就创建一个,把上面的代码扔进去。

3. 还是home目录,在.bashrc文件中添加代码:

alias ls=’ls –color –show-control-chars’

4.重启Cygwin。

配置完成了,支持中文并消除了所有的乱码。

(0) Comments    Read More   
Posted on 19-06-2009
Filed Under (技术) by waterlin

在C++里,用switch只能用来判断整数或是字符,如果我需要对字符串进行switch选择操作呢?CodeGuru上的Switch on Strings in C++文章有举例一种用法,源代码如下:

#include <map>
#include <string>
#include <iostream>

using namespace std;

// Value-Defintions of the different String values
static enum StringValue { evNotDefined,
evStringValue1,
evStringValue2,
evStringValue3,
evEnd };

// Map to associate the strings with the enum values
static std::map<std::string, StringValue> s_mapStringValues;

// User input
static char szInput[_MAX_PATH];

// Intialization
static void Initialize();

int main(int argc, char* argv[])
{
// Init the string map
Initialize();

// Loop until the user stops the program
while(1)
{
// Get the user’s input
cout << “Please enter a string (end to terminate): “;
cout.flush();
cin.getline(szInput, _MAX_PATH);
// Switch on the value
switch(s_mapStringValues[szInput])
{
case evStringValue1:
cout << “Detected the first valid string.” << endl;
break;
case evStringValue2:
cout << “Detected the second valid string.” << endl;
break;
case evStringValue3:
cout << “Detected the third valid string.” << endl;
break;
case evEnd:
cout << “Detected program end command. ”
<< “Programm will be stopped.” << endl;
return(0);
default:
cout << “‘” << szInput
<< “‘ is an invalid string. s_mapStringValues now contains ”
<< s_mapStringValues.size()
<< ” entries.” << endl;
break;
}
}

return 0;
}

void Initialize()
{
s_mapStringValues[“First Value”] = evStringValue1;
s_mapStringValues[“Second Value”] = evStringValue2;
s_mapStringValues[“Third Value”] = evStringValue3;
s_mapStringValues[“end”] = evEnd;

cout << “s_mapStringValues contains ”
<< s_mapStringValues.size()
<< ” entries.” << endl;
}

(0) Comments    Read More   
Posted on 19-06-2009
Filed Under (技术) by waterlin

Turbo Vision库是一个tui库,在Windows下有很多种安装方法。你可以用Cygwin, MinGW+MSYS来编译。详细可以看看doc/install里的安装文档。

注意下载相应平台下的版本,Windows下,下载相应的BC++和MinGW版本;而Linux下或是Cygwin下,也有相应的版本。

在Windows下,可以在Cygwin里很简单地进行安装:

$ ./configure
$ make
$ make install

安装完了后,进到目录example里,再把这些例子编译一把:

$ make

如果编译成功了,就可以直接跑一跑这些例子了:

$./demo/demo.exe

(0) Comments    Read More   
Posted on 17-06-2009
Filed Under (软件) by waterlin

我的mp4只能放avi这种格式,但是网上下的东西,大多是rmvb之类的,于是,转格式就成了困扰我的问题。经过最近的试用,觉得下面的这些软件挺好用的:

1) mkv –> avi

要把mkv转成avi,可以试试MediaCoder

MediaCoder是一个功能丰富的音频/视频批量转码工具。它的目标是成为一个通用的免费音频视频转换工具。

MediaCoder将众多来自开源社区优秀的音频视频软件整合于一个友好的图形界面。在视频方面,它使用MEncoder作为后端,充分发挥了MEncoder所提供的丰富特性;在音频方面,它使用MPlayer和Winamp的输入插件和作为解码器,结合各种不同的编码器,能够在不同的音频格式间进行转换,并自动添加标签(tagging),此外还能够将视频文件的音轨转换成独立的音频文件(如VOB->MP3),并可以使用各种音频过滤器(如resample、normalize等)。

2) rmvb –> avi

要把rmvb转成avi可以试试Allok RM RMVB to AVI MPEG DVD Converter这个得收费,不过挺好用的。

3) 格式工厂:Format Factory

大而全的格式转换软件,能在很多种格式之间相互转换,免费!尤其是可以很方便地把DVD转成视频文件,把CD转成音频文件。

4) winmenc

这个其实只是mencoder的一个免费前端。可以把AVI, VCD, DVD, rm/rmvb, MP4这类格式的东西转成avi。

主页是:http://winmenc.googlepages.com/
官方博客是:http://winmenc.blogspot.com/

当然,换一个啥都能播的mp4,才是王道!

(0) Comments    Read More   
Posted on 12-06-2009
Filed Under (技术) by waterlin

有的时候,写C++代码的时候,初始化了一个实例(Instance),即用类的定义创建了一个对象。

由于某些原因,在一些其它地方也需要使用这个实例,当然不能再重新定义一个对象了。这个时候,唯有想办法获得之前那个对象的指针。当指针也不能成为传递参数的时候,怎么办呢?可以利用静态数据成员,用如下的方法定义一个对象。

class TestInstance
{
public:
TestInstance(void);
~TestInstance(void);

public:
static TestInstance* Instance(){
if(_instance == NULL){
_instance = new TestInstance();
}
return _instance;
}
static void Release(){
if(_instance != NULL){
delete _instance;
_instance = NULL;
}
}
private:
static TestInstance* _instance;
}
TestInstance* TestInstance::_instance = NULL;

我们就是通过static TestInstance* _instance这个静态数据成员来固定地指向对象本身的。这样的设计,需要在初始化类的时候,用如下的方法进行初始化:

TestInstance _TestInstance = TestInstance::Instance();

通过这样的方法,我们就能把_TestInstance实例自己的指针,存到自己的数据成员里。

在我们需要一个TestInstance实例的地方,只要用下面的语句就可以获得它的指针了:

TestInstance * TestInstance = TestInstance::Instance();

当然,记得在不需要对象的时候,手动release掉:

TestInstance::Release();

这个技巧在很多情形下很有用!

(0) Comments    Read More   
Posted on 12-06-2009
Filed Under (技术) by waterlin

TUI是Text User Interface的缩写,是相对于GUI来说的一种东西。两者实现的任务其实差不多,只不过TUI是基于文本界面的,而GUI则更多是图形界面的。网上找了找,好像有两个库好些:

1. Turbo Vision

这个好像是Borland的库,不过版权限制很松。

2. NCurses

完全免费的一个库,比较有名。

(1) Comment    Read More   
Posted on 12-06-2009
Filed Under (软件) by waterlin

有很多可以替代Visio的软件:

1) Sodipodi
2) xfig
3) Sketch
4) Karbon14 and Kontour
5) OpenOffice Draw
6) Dia
7) Tgif
8) Gestalter
9) ImPress
10) Tkpaint
11) Tgif
12) Adobe Illustrator
13) Corel Draw
14) Freehand, AutoSketch

不过大体都不如Visio那么专业。

今天我要推荐的是EDraw Mind Map,纯免费软件,功能也齐全,界面也漂亮,挺好用的。

(0) Comments    Read More   
Posted on 03-06-2009
Filed Under (技术) by waterlin

今天要用C++来分割一段字符串,比如说对于路径C:\ug_en\xerces-c-3.0.0.zip来说,我想分离出文件名,要怎么办呢?

其实很简单,只要把字符串分割一下就好了:

string dir = “C:\\ug_en\\xerces-c-3.0.0.zip”;
string name;
string::size_type position = dir.find_last_of(“\\”);
name = dir.substr(position+1);

注意的是,最后用到了position+1,而不仅仅是position,因为我们还是需要把\这个路径符给扔掉。

相对于C++标准库里string的find_last_of方法,同样类似功能的方法有以下几种方法:

Member function Purpose
find() find the first position of the specified substring
find_first_of() equal to find(), but finds the first position of any character specified
find_last_of() equal to find first of(), but finds the last position of any character specified
find_first_not_of() equal to find first of(), but returns the position of the first character not of those specified
find_last_not_of() equal to find last of(), but returns the last position of any characters not specified
rfind() equal to find(), but searches backwards

在C++里操作字符串,大概就是这种思路,有点麻烦。这几天编了不少C++的代码,太怀念文本处理能力强大的Perl了!我觉得语言本身倒不是太重要,只是语言本身捆绑的库很重要,起码能让你工作的时候少造轮子!

更详细的有关C++的字符串操作,可以看看OOPWeb上的这篇文章

(1) Comment    Read More