如果说我学的东西杂,那么学得精的就是这个小程序了,第一次学会了看API,然后按照自己的意愿完成了全部的内容,我自己写了这个打字通,没什么新颖的地方,基本的打字通功能罢了,不打字的时候,显示的字体是灰色,当键入文字后,如果正确就显示蓝色,错误就显示红色,同时会开始计时,进度条会前进,那么打字的内容是从哪里来的呢?我选择了简单的从TXT文件读取,指定一个文件,保存一些预存的TXT文件,然后读取该文件夹下的全部TXT文件。我使用的是Visual Studio 2015,代码基本用的是C和少量的C++代码。头疼的地方有很多,例如我之前没接触过Unicode编码,然而VS2015默认就是U码的工程,我认为这是趋势,所以尽量用U码,就会出现宽字节的转换,经常出现访问越界或者用量分配不足,我还用到了多线程编程,计时器就是我写的另外一个线程,它的显示很麻烦,所以我的代码很拙劣,尽管拙劣,我觉得我还是学到很多,而且和之前不一样的时候成就感非凡。当我做完一部分的时候我还兴奋的推出了我这个RoofType 1.0版本,然后发现了好多问题,ListBox的修改和计时器线程有问题,我目前已经修改了计时器的线程,因为那个问题只是我忘记了修改变量,很好解决,而ListBox的问题还没有解决,我之前有写过刷新的函数
void RefreshList(HWND lview) { char * filePath = ".\\MyResource"; vector<string> files; getFiles(filePath, "txt", files); int size = files.size(),pos; string s; LVITEM vitem; vitem.mask = LVIF_TEXT; SendMessage(lview, LVM_DELETEALLITEMS, 0, 0); for (int i = 0; i < size; i++){ pos = files[i].find_last_of('\\'); s = (string)(files[i].substr(pos + 1)); wchar_t * pUnicode = ConvertLPSTRtoLPWSTR(s.c_str()); vitem.pszText = pUnicode; vitem.iItem = i; vitem.iSubItem = 0; SendMessage(lview, LVM_INSERTITEM, i, (long)&vitem); } }
这个刷新函数,思想就是先从指定路径下的文件夹里面读取TXT文件,然后将文件名加入到ListBox里面,而且在加入之前我还清空了该控件就是这句SendMessage(lview, LVM_DELETEALLITEMS, 0 , 0); 在我想解决问题之前,是没有这句的,我是这样想的才加入这句的,就是如果我每次调用这个函数的时候,都清空之前的内容,然后再次添加,这样就可以让这个函数实现更新列表的内容,因为在SendMessage的时候除了传列表控件句柄、消息名和消息内容,还要传送序号,我不想保存我已经这个序号,而选择重复使用这段代码来解决,然而失败了,因为当我给指定文件夹添加文件后,再次调用这个函数的时候,ListBox的列表直接被清空了。
我通过获取绝对路径解决了列表被清空的问题,所以我单独写了个函数,把所有的相对路径改为了绝对路径,目前的所有BUG都解决了。
<span >wchar_t* GetCurrentPath(wchar_t * target) { LPWSTR PointPath = NULL; wchar_t *cppoint = 0; cppoint = new wchar_t[MAX_PATH]; cppoint[0] = 0; GetModuleFileName(NULL, cppoint, MAX_PATH);//获得绝对路径 (_tcsrchr(cppoint, _T('\\')))[1] = 0;//截掉exe文件名 if (target) {//根据需要粘贴指定字符串 wcscat_s(cppoint, MAX_PATH, target);//给路径添加MyResource } PointPath = cppoint; return PointPath; }</span>