Win32编程中一些实用的函数

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_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);
        //----------------关闭注册表
    }
}














 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值