VC编程中常使用的子函数

1. 改变光标形状

例如,改变光标为等待状态

加载别的形状的光标:HCURSOR hCursor = SetCursor(LoadCursor(NULL,IDC_WAIT));

注意,要保存SetCursor函数的返回值,用于恢复光标,使用SetCursor(hCursor)恢复原来的光标

 

2.1.判断某个文件是否存在

 

Determines whether a path to a file system object such as a file or directory is valid.

BOOL PathFileExists( LPCTSTR pszPath
 );

Parameters

pszPath
[in] Pointer to a null-terminated string of maximum length MAX_PATH that contains the full path of the object to verify.

Return Values

Returns TRUE if the file exists, or FALSE otherwise. Call GetLastError for extended error information.

Example

#include <windows.h>
#include <iostream.h>
#include "Shlwapi.h"

void main( void )
{
// Valid file path name (file is there).
char buffer_1[ ] = "C://TEST//file.txt"; 
char *lpStr1;
lpStr1 = buffer_1;

// Invalid file path name (file is not there).
char buffer_2[ ] = "C://TEST//file.doc"; 
char *lpStr2;
lpStr2 = buffer_2;


// Return value from "PathFileExists".
int retval;

// Search for the presence of a file with a true result.
retval = PathFileExists(lpStr1);
if(retval == 1)
{
cout << "Search for the file path of : " << lpStr1 << endl;
cout << "The file requested /"" << lpStr1 << "/" is a valid file" << endl;
cout << "The return from function is : " << retval << endl;
}

else{
cout << "/nThe file requested " << lpStr1 << " is not a valid file" << endl;
cout << "The return from function is : " << retval << endl;
}

// Search for the presence of a file with a false result.
retval = PathFileExists(lpStr2);
if(retval == 1)
{
cout << "/nThe file requested " << lpStr2 << "is a valid file" << endl;
cout << "Search for the file path of : " << lpStr2 << endl;
cout << "The return from function is : " << retval << endl;
}

else{
cout << "/nThe file requested /"" << lpStr2 << "/" is not a valid file" << endl;
cout << "The return from function is : " << retval << endl;
}
}
OUTPUT
==============
Search for the file path of : C:/TEST/file.txt
The file requested "C:/TEST/file.txt" is a valid file
The return from function is : 1

The file requested "C:/TEST/file.doc" is not a valid file
The return from function is : 0
3. Rich Edit控件的使用
1) 在Dialog中放一个rich edit控件,然后用classwizard做一个变量对应这个控件,例如为m_RichEdit;
2) 在initdialog函数中,初始化这个控件
	m_RichEdit.GetDefaultCharFormat(m_cf);
	m_cf.cbSize=sizeof(CHARFORMAT);
	m_cf.dwMask=CFM_COLOR|CFM_CHARSET|CFM_FACE;
	m_cf.crTextColor=COLOR_NORMAL;
	m_cf.bCharSet=GB2312_CHARSET;
	memcpy(m_cf.szFaceName,"宋体",4);
	m_RichEdit.SetDefaultCharFormat(m_cf);
	m_RichEdit.SetBackgroundColor(0,RGB(200,200,200));
	m_Font.CreatePointFont(120,"宋体");
	m_RichEdit.SetFont(&m_Font);
3) 制作几个功能函数:
void XXXX::ClearMsg()
{
	m_RichEdit.SetWindowText("");
}
void XXXX::ShowMsg(CString str,COLORREF dw,BOOL bBold)
{
	CHARFORMAT cf;
	m_RichEdit.GetDefaultCharFormat(cf);
	cf.dwMask=CFM_COLOR|CFM_PROTECTED;
	cf.dwEffects=CFE_PROTECTED;
	if(bBold) 
	{
		cf.dwMask|=CFM_BOLD;
		cf.dwEffects|=CFE_BOLD;
	}
	cf.crTextColor=dw;
	//------------
	m_RichEdit.HideSelection(1,0);
	m_RichEdit.SetSel(0,-1);
	m_RichEdit.SetSel(-1,-1);
	m_RichEdit.SetSelectionCharFormat(cf);
	m_RichEdit.ReplaceSel(str);
}
void XXXX::OnRicheditCopy() 
{
	m_RichEdit.Copy();
}
void XXXX::OnRicheditSaveas() 
{
	LPCTSTR lpszFilter="文本文件(*.txt)|*.txt|所有文件|*.*|";
	CFileDialog fd(0,"txt",NULL,0,lpszFilter);
	fd.m_ofn.lpstrTitle="保存文件...";
	if(fd.DoModal()==IDOK)
	{
		CString str;
		m_RichEdit.GetWindowText(str);
		CFile file;
		if(!file.Open(fd.GetPathName(),CFile::modeCreate|CFile::modeWrite)) return;
		file.WriteHuge(str,str.GetLength());
		file.Close();
	}
}
void XXXX::OnRicheditSelectall() 
{
	m_RichEdit.SetSel(0,-1);
}
 
 
 
 
3. 创建浏览目录窗口
#include <Shlobj.h>
	UpdateData(TRUE);
	char szDir[MAX_PATH];
	BROWSEINFO bi;
	ITEMIDLIST *pidl;
	bi.hwndOwner = this->m_hWnd;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = szDir;
	bi.lpszTitle = "请选择目录";
	bi.ulFlags = BIF_STATUSTEXT | BIF_RETURNONLYFSDIRS;
	bi.lpfn = NULL;
	bi.lParam = 0;
	bi.iImage = 0;
	pidl = SHBrowseForFolder(&bi);
	if(pidl == NULL)  return;
	if(!SHGetPathFromIDList(pidl, szDir))   {
		return;
	}
	else { 
		strPath = szDir;
	}
 
 
4. 判断文件夹是否存在以及创建文件夹
Header: Declared in Shlwapi.h. 
Import Library: Shlwapi.lib.
        CString strDirPath = m_strSavePath;
	strDirPath += "\\";
	strDirPath += m_strDeviceName;
	if(!PathIsDirectory(strDirPath)){
		if(!CreateDirectory(strDirPath,NULL)){
			MessageBox("创建目录失败!");
		}
	}
 
 
 
 
5. CFileDialog 构造函数参数说明
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:


bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如: 
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
 
 
6. 创建多级子目录函数
BOOL CGlobal::CreateMultipleDirectory(const CString& strPath)
{
	CString strDir(strPath);//存放要创建的目录字符串
    //确保以'\'结尾以创建最后一个目录
    if (strDir.GetAt(strDir.GetLength()-1)!=_T('\\')){
        strDir += (_T('\\'));
    }


	CStringArray   strArray;
	CString strTemp;//一个临时变量,存放目录字符串
	strTemp.Empty();
    BOOL bSuccess = TRUE;//成功标志
    //遍历要创建的字符串
    for (int i=0;i<strDir.GetLength();++i){
        if (strDir.GetAt(i) != _T('\\')) 
        {//如果当前字符不是'\\'
            strTemp += (strDir.GetAt(i));
        }
        else 
        {//如果当前字符是'\\'
			strArray.Add(strTemp);  //将当前层的字符串添加到数组中
            strTemp += _T('\\');
        }
    }
	
    //遍历存放目录的数组,创建每层目录
    for (i = 0 ; i < strArray.GetSize() ; i++){
		CString strDirPath = strArray.GetAt(i);    
		if(!PathIsDirectory(strDirPath)){     // 判断目录是否存在
			bSuccess = CreateDirectory(strDirPath, NULL) ? TRUE:FALSE;  // 不存在,创建目录
			if(!bSuccess){
				break;
			}
		}
           
    }
	
    return bSuccess;
	
}
 
 
7.十六进制字符串转换为十进制数
int H2D(CString str)
{
	char** g=NULL;
	return (int)strtol(str,g,16);
}
 
 
8. 如何判断某个对象是哪个类的实例
IsKindOf(RUNTIME_CLASS(CXXXX)) , ASSERT_KINDOF(类名, 类指针);
 
 
9.16进制的字符串转化为16进制数
使用sscanf;例如:
CString strText,
DWORD dwTT;
sscanf(strText,"%x",&dwTT);
 
 
10. 从文档指针中得到视图指针
POSITION pos = pDoc->GetFirstViewPosition();
CView* pView = pDoc->GetNextView(pos);
并且可以从视图指针得到Frame指针
CFrameWnd *pFrame = pView->GetParentFrame();
11. 动态添加动态库指令:
#pragma comment(lib, "XXX.lib") 
12.用CString作为Key使用CMap 
CMap在用CString做key类型时,ARG_KEY要选LPCTSTR  
 CMap<CString, LPCTSTR, int, int> typeMap;     typeMap.SetAt(_T("ONE"),1);     typeMap.SetAt(_T("TWO"),2);     int nValue = 0;     BOOL ret = typeMap.Lookup(_T("ONE"), nValue);     ret = typeMap.Lookup(_T("THREE"), nValue);     ret = typeMap.Lookup(_T("TWO"), nValue); 
关键是ARG_KEY要选LPCTSTR 
 
13.Windows精确定时
       LARGE_INTEGER litmp; 
       LONGLONG QPart1,QPart2;
       double dfMinus, dfFreq, dfTim; 
       QueryPerformanceFrequency(&litmp);
       dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
       QueryPerformanceCounter(&litmp);
       QPart1 = litmp.QuadPart;// 获得初始值
       Sleep(100);
       QueryPerformanceCounter(&litmp);
       QPart2 = litmp.QuadPart;//获得中止值
       dfMinus = (double)(QPart2-QPart1);
       dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒   
14. 关于float转DWORD和DWORD转float
DWORD dw  = 0;  
float f1 = 0.25;   
cout<<"f1 = "<<f1<<endl;    
dw = *((DWORD*)&f1);  
cout<<"dw = *((DWORD*)&f1):  "<<dw<<endl;    
f1 = 0.0;  
cout<<"f1 = 0.0:  "<<f1<<endl;  
f1 = *((float*)&dw);  
cout<<"f1 = *((float*)&dw):  "<<f1<<endl;  

运行结果如下
f1 = 0.25
dw = *((DWORD*)&f1):  1048576000
f1 = 0.0:  0
f1 = *((float*)&dw):  0.25
其实这就是利用了编译器转型的手段,这里float和DWORD都是4个字节长度,通过以上手段转型,不会丢失二进制的数据,所以也就不会丢失原始数据。

*((DWORD*)&f1),首先获取一个float指针,然后将其强制转换为DWORD类型的指针,最后解引用,获取的是一个DWORD类型的值,*((float*)&dw)则是同理
15 .字符串转化为10进制数/10进制数转化为字符串
字符串转化为10进制数: strtol( const char *nptr, char **endptr, int base );
10进制数转化为字符串:

char *_itoa( int value, char *string, int radix );

16.判断两个矩形是否相交:

BOOL Intersects(const CRect& rect1,const CRect& rect2) { rect1.NormalizeRect(); rect2.NormalizeRect(); return !(rect1 & rect2).IsRectEmpty(); }

17.批处理直接删除注册表命了:

reg delete HKEY_CURRENT_USER\Software\XXX\XXXX /f

直接用/fc参数就可以了,不需要其他的参数



 
 
 
 
 

你可能感兴趣的:(VC编程中常使用的子函数)