Win32编程中一些实用的函数

来源:互联网 发布:淘宝格子铺网址 编辑:程序博客网 时间:2024/05/19 02:21
1.像一个对话框的文本控件中追加文本内容
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_tif(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);        //----------------关闭注册表    }}














0 0