VC编程技巧20法
VC编程技巧20法编程技巧20法(修订)作者:徐景周 1. 如何激活当前屏幕保护程序/ 激活当前屏幕保护程序, jingzhou xuPostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);2. 如何禁止/启用屏幕保护及电源管理static UINT dss_GetList = SPI_GETLOWPOWERTIMEOUT, SPI_GETPOWEROFFTIMEOUT, SPI_GETSCREENSAVETIMEOUT;static UINT dss_SetList = SPI_SETLOWPOWERTIMEOUT, SPI_SETPOWEROFFTIMEOUT, SPI_SETSCREENSAVETIMEOUT;static const int dss_ListCount = _countof(dss_GetList);l 禁止屏幕保护及电源管理m_pValue = new intdss_ListCount;for (int x=0;x<dss_ListCount;x+)/ 禁止屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetListx, 0, NULL, 0);delete m_pValue;l 启用屏幕保护及电源管理m_pValue = new intdss_ListCount;for (int x=0;x<dss_ListCount;x+)/启用屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetListx, m_pValuex, NULL, 0);delete m_pValue;3. 如何激活和关闭IE浏览器/激活并打开IEvoid lounchIE()HWND h=FindWindowEx(NULL,NULL,NULL,"Microsoft Internet Explorer") ;ShellExecute(h,"open","C:simple.html",NULL,NULL,SW_SHOWNORMAL);/关闭IE及其它应用void CloseIE()int app=BSM_APPLICATIONS;unsigned long bsm_app=(unsigned long )app;BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app,WM_CLOSE,NULL,NULL);4. 如何给树控件加入工具提示l 首先给树控件加入TVS_INFOTIP属性风格,如下所示:if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP, /加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100)CRect(0, 0, 0, 0), &m_wndTreeBar, 100)TRACE0("Failed to create instant bar childn");return -1;l 其次加入映射消息声明,如下所示:afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult); /树控件上加入提示消息,jingzhou xu ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip) /树控件条目上加入提示,jingzhou xul 最后加入呼应涵数处理:void CCreateTreeDlg:OnGetInfoTip(NMHDR* pNMHDR, LRESULT* pResult) *pResult = 0;NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR;LPARAM itemData = (DWORD) pTVTipInfo->lParam;/对应每个条目的数据HTREEITEM hItem = pTVTipInfo->hItem;CString tip;HTREEITEM hRootItem = m_chassisTree.GetRootItem();if (hRootItem != pTVTipInfo->hItem)tip = "树结点的提示"elsetip = "树根上的提示"strcpy(pTVTipInfo->pszText, (LPCTSTR) tip);5. 如何获取系统信息框的路径#include <atlbase.h>#define IDS_REG_KEY_MSINFO_PATH1 _T( "SoftwareMicrosoftShared ToolsMSInfo" )#define IDS_REG_KEY_MSINFO_PATH2 _T( "SoftwareMicrosoftShared Tools Location" )#define IDS_REG_VAL_MSINFO_PATH1 _T( "Path" )#define IDS_REG_VAL_MSINFO_PATH2 _T( "MSInfo" )#define IDS_MSINFO_EXE_NAME _T( "MSInfo32.exe" )/.BOOL GetSysInfoPath( CString& strPath ) strPath.Empty();LPTSTR pszPath = strPath.GetBuffer( MAX_PATH );CRegKey reg;DWORD dwSize = MAX_PATH;LONG nRet = reg.Open( HKEY_LOCAL_MACHINE, IDS_REG_KEY_MSINFO_PATH1, KEY_READ );/ 在注册表中寻找第一个"MSInfo32.exe" 位置if ( nRet = ERROR_SUCCESS )#if ( _MFC_VER >= 0x0700 )nRet = reg.QueryStringValue( IDS_REG_VAL_MSINFO_PATH1, pszPath, &dwSize );#elsenRet = reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH1, &dwSize );#endifreg.Close();/ 如果第一次寻找失败,则进行第二次寻找if ( nRet != ERROR_SUCCESS )nRet = reg.Open( HKEY_LOCAL_MACHINE, IDS_REG_KEY_MSINFO_PATH2, KEY_READ );if ( nRet = ERROR_SUCCESS )#if ( _MFC_VER >= 0x0700 )reg.QueryStringValue( IDS_REG_VAL_MSINFO_PATH2, pszPath, &dwSize );#elsereg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH2, &dwSize );#endif/ 路径名不包括EXE文件名if ( nRet = ERROR_SUCCESS )VERIFY( :PathAppend( pszPath, IDS_MSINFO_EXE_NAME ) );reg.Close();strPath.ReleaseBuffer();strPath.FreeExtra();/ 检查文件是否有效. return :PathFileExists( strPath );6. 如何直接运行一个资源中的程序bool Run()CFile f; char* pFileName = "Execution.exe"if( !f.Open( pFileName, CFile:modeCreate | CFile:modeWrite, NULL ) )AfxMessageBox("Can not create file!");return 0;CString path = f.GetFilePath();HGLOBAL hRes;HRSRC hResInfo;/获取应用实例 HINSTANCE insApp = AfxGetInstanceHandle();/寻找EXE资源名hResInfo = FindResource(insApp,(LPCSTR)IDR_EXE4,"EXE");hRes = LoadResource(insApp,hResInfo ); / Load itDWORD dFileLength = SizeofResource( insApp, hResInfo ); /计算EXE文件大小 f.WriteHuge(LPSTR)hRes,dFileLength); /写入临时文件 f.Close();HINSTANCE HINSsd = ShellExecute(NULL, "open",path, NULL, NULL, SW_SHOWNORMAL);> /运行它. return 1;7. 如何遍历整个目录#include <windows.h>#include <shlobj.h>/浏览目录.void BrowseFolder( void )TCHAR pathMAX_PATH;BROWSEINFO bi = 0 ;bi.lpszTitle = ("递归调用所有目录");LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );if ( pidl != 0 )/ 获取目录路径SHGetPathFromIDList ( pidl, path );/设置为当前路径SetCurrentDirectory ( path );/搜索所有子目录SearchFolder( path );/ 释放内存IMalloc * imalloc = 0;if ( SUCCEEDED( SHGetMalloc ( &imalloc ) )imalloc->Free ( pidl );imalloc->Release ( );/搜索其下所有子目录及文件.void SearchFolder( TCHAR * path )WIN32_FIND_DATA FindFileData;HANDLE hFind;TCHAR filename MAX_PATH + 256 ;TCHAR pathbak MAX_PATH ;/复制初始用户选择目录strcpy( pathbak, path );/寻找第一个文件hFind = FindFir