Posted on 03-07-2009
Filed Under (技术) by WaterLin

最近在VC里写一个程序,要求把日志显示到界面上来。要做这种事情的情况很少,一般来说,我们都是把日志写到文本文件里。

如果只是很简单的程序,可以选用Edit控件,在界面上实现简单的日志显示功能。以下是最基本的步骤:

1) 创建Edit控件,并设置适当的属性

先用资源编辑器添加一个Edit控件到界面上,关联资源ID为IDC_LOG。注意选上风格WantReturn和MultiLine(多行);因为输出的是日志,Edit的可视空间可能会不够用,因此风格里最好选上Vertical Scroll和Auto Scroll这两个选项!

2) 添加与日志有关的数据成员

在对话框类的头文件里,添加数据成员:

CString _log; //存储日志的内容
CString _newline; //存储换行符

3) 初始化工作

在对话框的构造函数里,添加如下的代码:

char re[3] = {VK_RETURN, 0x0a};
_newline = re;
_log = "系统启动,已设置好与日志有关的一切";

当然,也可以用\r\n赋值给_newline实现换行代码。

4) 在每次要输出日志的地方,用以下语句就可以在Edit控件里实现日志的刷新:

_log += _newline;
_log += "欲追加的日志";
SetDlgItemText(IDC_LOG, _log);

因为是小程序,没有考虑到日志变量CString _log的容量问题。

基本的原理就是这样,可以根据情况进行适当的改进。

(0) Comments    Read More   
Posted on 02-07-2009
Filed Under (技术) by WaterLin

相信每个人都会对管理自己的文献资料头痛不已!我自己的习惯是:把上网看到的好东西,要么直接保存为本地网页,要么贴成文本,放到硬盘的某个角落;至于电子书,就尽量分类放到不同的文件夹里。

这样方式保存的东西,时间一久,再去找自己需要的东西,就很麻烦了。只能借助于一些桌面搜索工具,不仅麻烦,而且还很难准确地搜出自己需要的内容。

Zotero是一个开源的资料管理系统,它是Firefox里的一个插件。利用这个软件,我就可以很好地管理自己的资料了。它可以通过给网页打快照来快速地保存网页到本地,还能新建条目来关联本地的电子书。Zotero除了有一个树形目录来进行分类外,还可以给条目打上标签,进行更加细分的交叉索引。在"便签"条中,您可以加入您的任何笔记、想法或其他记录。

收集了这么多资料,有了Zotero的分类功能,查找起来非常地方便。更贴心的是,Zotero还能在你写文章的时候,帮你自动生成参考文献。

现在,我日常生活中已经和ZoteroEvernote、Emacs这三个软件紧密不可分了。Zotero来管理我的资料,用博客来整理自己的经验(没办法,不写下来,一会就忘记了;不写成博客,压根就不会认真写,过几天自己都看不懂笔记了),用Evernote来记录一些稍纵即逝的灵感、想法,用Emacs来做长篇大论的写作(因为编辑效率高)。

提示:需要选定最常用的一台计算机来使用zotero管理文献资料,不确定能否合并数台计算机的数据库。

(1) Comment    Read More   
Posted on 02-07-2009
Filed Under (技术) by WaterLin

1) 用MFC里的CFileFind类

下面是用CFileFind类读特定目录下的所有bmp格式文件的例子代码:

CString path;//需要枚举文件的路径
CFileFind finder;
BOOL bWorking = finder.FindFile(path + "\\" + "*.bmp");
while (bWorking)
{
bWorking = finder.FindNextFile();
cout << (LPCTSTR) finder.GetFileName() << endl;
}

2) 用FindFirstFile(),FindNextFile()和FindClose()这几个API函数。

(0) Comments    Read More   
Posted on 02-07-2009
Filed Under (技术) by WaterLin

今天在用MFC写程序的时候,碰到一个奇怪的问题:在我用CFileDialog选择文件后,程序的其它地方,就提示我说找不到某个文件;这个文件的路径,我是用hard code的方法硬写在程序里方便测试的。

如果这个路径我用的是绝对路径,并不会出问题;如果是用相对路径,则会提示找不到文件。

查了一会MSDN,原来用CFileDialog打开文件后,程序默认的执行路径就得到了改变。这样的话,我在用CFileDialog打开文件后,上述的相对路径自然就要换一换了。于是程序就出了一些莫名其妙的错误~~

切记,使用CFileDialog会改变当前目录,比较稳妥的办法还是绝对路径来访问文件比较好。在程序刚一跑起来的时候,先用GetCurrentDirectory()或是GetModuleFileName()获得当前可执行文件所在的路径,并保存起来。以后即使是用CFileDialog改变了当前的路径,也能很容易地找回来。

(0) Comments    Read More   
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,就是选择文件夹对话框的标题栏名称。只需要模拟这个函数的写法,添加代码到特定的消息响应函数里去就可以了。

(0) Comments    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库的更多用法。

(0) Comments    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