1.像一个对话框的文本控件中追加文本内容
4.使用一个文件路径选择对话框
6.遍历一个文件夹下的所有文件和子文件夹
void AddText(PCTSTR pszFormat, ...) {
//接收对话框的文本,并且在其尾部添加文本
va_list argList;
va_start(argList, pszFormat);
TCHAR sz[20 * 1024];
GetWindowText(GetDlgItem(g_hDlg,IDC_SHOW), sz, _countof(sz));
_vstprintf_s(
_tcschr(sz, TEXT('\0')), _countof(sz) - _tcslen(sz),
pszFormat, argList);
SetWindowText(GetDlgItem(g_hDlg,IDC_SHOW), sz);
va_end(argList);
}
这个函数,使用格式化函数,类似printf函数,要包含头文件tchar.h
g_hDlg是对话框的句柄,IDC_SHOW是控件的ID,有必要的话可以把这两个量设为全局的,或者设为参数
用到的函数:
GetWindowText//(获取/设定控件的文本(其实是窗口的Caption))
SetWindowText//(获取/设定控件的文本(其实是窗口的Caption))
GetDlgItem(获得控件的句柄)
<pre name="code" class="cpp">_vstprintf_s(_tcschr(sz, TEXT('\0')), _countof(sz) - _tcslen(sz), pszFormat, argList);
//这个函数在Tchar.h中是个宏定义,实际上是函数vswprintf_s(_s表示安全版本的),因为要在末尾添加,所以我们查找sz中‘\0’的位置,从这里添加,后面一个参数表示串//还能容纳多少字符
2.监测内存泄露
转载自: http://hi.baidu.com/ccc10509/item/6262d83ce9c38cc9392ffa8a
检测内存泄漏的主要工具是调试器和 C 运行时库 (CRT) 调试堆函数。若要启用调试堆函数,需要下面两个宏定义和头文件
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
//定义这两个宏能让我们知道准确的泄露位置
//_CrtDumpMemoryLeaks函数生成内存泄露报告在输出行
void detect_memory_leaks( bool on_off )
{
//on_ff 为true 打印内存泄漏, 为false则不打印
int flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
if(!on_off)
flags &= ~_CRTDBG_LEAK_CHECK_DF;
else {
flags |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
}
_CrtSetDbgFlag( flags );
}
int main()
{
detect_memory_leaks(true);
int* leak = new int[10];
//delete[] leak;
system("pause");
return 0;
}
3.数字格式化
PTSTR BigNumToString(DOUBLE lNum, PTSTR szBuf, DWORD chBufSize) {
TCHAR szNum[100];
StringCchPrintf(szNum, _countof(szNum), TEXT("%lf"), lNum);
NUMBERFMT nf;//数字格式化样式
nf.NumDigits = 5;//小数位数
nf.LeadingZero = FALSE;//是否能以0开头
nf.Grouping = 3;//三个一组
nf.lpDecimalSep = TEXT(".");//小数点
nf.lpThousandSep = TEXT(",");//分隔符
nf.NegativeOrder = 0;
GetNumberFormat(LOCALE_USER_DEFAULT, 0, szNum, &nf, szBuf, chBufSize);
return(szBuf);
}
4.使用一个文件路径选择对话框
TCHAR szPathName[MAX_PATH]={0};//必须初始化为0,否则会失败
OPENFILENAME ofn={OPENFILENAME_SIZE_VERSION_400};//创建一个地址选择对话画框
ofn.hwndOwner=hWnd;//对话框的父窗口
ofn.lpstrFile=szPathName;//文件路径的保存位置
ofn.nMaxFile=_countof(szPathName);
ofn.lpstrTitle=TEXT("选择一个文件");
ofn.Flags=OFN_EXPLORER|OFN_FILEMUSTEXIST;//对话框的类型
GetOpenFileName(&ofn);//这个OPENFILENAME类型,还有一个GetSaveFileName函数
SetDlgItemText(hWnd,IDC_PATH,ofn.lpstrFile);
return TRUE;
5.使用一个文件文件夹选择对话框
和上面的文件选择对话类似,可以获得文件夹的名称,或者文件夹的路径
<span style="white-space:pre"> </span>//设定文件夹路径
TCHAR szPath[MAX_PATH]={0};//保存文件夹的路径
TCHAR szName[MAX_PATH]={0};//保存文件夹的名字
BROWSEINFO bi;
bi.hwndOwner=hwnd;//对话框的父窗口
bi.pidlRoot=NULL;//表示从这个路径开始选择文件夹,NULL表示从根目录开始
bi.pszDisplayName=szName;//选择的文件夹缓存
bi.lpszTitle=TEXT("选择一个文件夹");
bi.ulFlags=BIF_RETURNONLYFSDIRS;//一些属性
//下面两个是关于文件夹筛选的回调函数的
bi.lpfn =NULL;
bi.lParam =0;//传给回调函数的参数
bi.iImage =0;//这个不知道拿来干什么???
LPITEMIDLIST lpitem=SHBrowseForFolder(&bi);//lpitem会保存文件的路径
SHGetPathFromIDList(lpitem,szPath);//复制文件夹路径到szPath
6.遍历一个文件夹下的所有文件和子文件夹
首先,我们要使用一个结构WIN32_FIND_DATA这个结构包含了文件的许多信息(大小,日期什么的),然后用FindFirstFile可以创建一个关于文件的枚举句柄,用FindNextFile可循环枚举所有的文件和子文件夹!
<span style="white-space:pre"> </span>//folderPath表示要搜索的路径,比如“C:\System\*.*”表示你要搜索C:\System\下的所有文件
//"*.*"表示搜索所有文件,“*.dll”表示所有dll文件,a???.*表示已a开头的文件,"lin.txt"表示搜索指定文件
WIN32_FIND_DATA FindFileData;
HANDLE hfile=FindFirstFile(folderPath,&FindFileData);
if(hfile==INVALID_HANDLE_VALUE)
return;
ZeroMemory(ListFileName,sizeof(ListFileName));
SetDlgItemText(theApp,IDC_NAME,ListFileName);
do
{
//对文件属性的操作
} while (FindNextFile(hfile,&FindFileData));
FindClose(hfile);
7.关于注册表开机启动项的设定
//这里用的是宽字符,既 wchar_t
if(isStartOpen)
{
//开机启动
HKEY hKey;
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//---------------找到系统的启动项
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
//-----------打开启动项Key
if(lRet == ERROR_SUCCESS)
{
wchar_t pFileName[MAX_PATH] = {0};
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//----------------得到程序自身的全路径
lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
//----------------添加或者修改注册表项
RegCloseKey(hKey);
//----------------关闭注册表
}
}
else
{
//取消卡机启动
HKEY hKey;
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//---------------找到系统的启动项
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet==ERROR_SUCCESS)
{
RegDeleteValue(hKey,L"DeskPro");
//----------------删除注册表项
RegCloseKey(hKey);
//----------------关闭注册表
}
}