VC++编程技巧20法.docx
《VC++编程技巧20法.docx》由会员分享,可在线阅读,更多相关《VC++编程技巧20法.docx(34页珍藏版)》请在冰豆网上搜索。
VC++编程技巧20法
1.如何激活当前屏幕保护程序
// 激活当前屏幕保护程序, jingzhou xu
PostMessage(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);
禁止屏幕保护及电源管理
{
m_pValue = new int[dss_ListCount];
for (int x=0;x{// 禁止屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetList[x], 0, NULL, 0));}delete[] m_pValue;}启用屏幕保护及电源管理{m_pValue = new int[dss_ListCount];for (int x=0;x{//启用屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetList[x], m_pValue[x], 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.如何给树控件加入工具提示首先给树控件加入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 child\n");return -1;}其次加入映射消息声明,如下所示:afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult); //树控件上加入提示消息,jingzhou xu ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip) //树控件条目上加入提示,jingzhou xu最后加入呼应涵数处理: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 = "树结点的提示"; } else { tip = "树根上的提示"; } strcpy(pTVTipInfo->pszText, (LPCTSTR) tip); }5.如何获取系统信息框的路径#include #define IDS_REG_KEY_MSINFO_PATH1 _T( "Software\\Microsoft\\Shared Tools\\MSInfo" )#define IDS_REG_KEY_MSINFO_PATH2 _T( "Software\\Microsoft\\Shared 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 ); #else nRet = reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH1, &dwSize ); #endif reg.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 ); #else reg.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 #include //浏览目录.voidBrowseFolder( void ){TCHAR path[MAX_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 ( );}}//搜索其下所有子目录及文件.voidSearchFolder( TCHAR * path ){WIN32_FIND_DATA FindFileData;HANDLEhFind;TCHARfilename[ MAX_PATH + 256 ];TCHARpathbak[ MAX_PATH ];//复制初始用户选择目录strcpy( pathbak, path );//寻找第一个文件hFind = FindFirstFile ( "*.*", &FindFileData );//搜索所有文件及子目录do{if ( hFind != INVALID_HANDLE_VALUE ){//如果是当前目录或父目录,跳过if ( ! ( strcmp( FindFileData.cFileName, "." ) ) || ! ( strcmp( FindFileData.cFileName, ".." ) ) ){continue;}//恢复初始用户选择目录strcpy( path, pathbak );//列出所有发现的文件sprintf( path, "%s\\%s", path, FindFileData.cFileName );//如果 SetCurrentDirectory 成功的话,则它是一个目录,递归调用继续搜索子目录if ( ( SetCurrentDirectory( path ) ) ){SearchFolder( path );} //插入文件及路径名到列表框m_listbox_hwnd中 SendMessage( m_listbox_hwnd, LB_ADDSTRING, 0, path ); //<--INSERT WHAT YOU WANT DONE HERE!}}while ( FindNextFile ( hFind, &FindFileData ) && hFind != INVALID_HANDLE_VALUE );FindClose ( hFind );}8.如何禁止/启用系统热键bool bOld;禁止系统热键//屏蔽掉系统键SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);启用系统热键//恢复系统热键SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&bOld,SPIF_UPDATEINIFILE);9.如何隐藏/显示WINDOWS系统任务栏隐藏系统任务栏//隐藏WINDOWS系统任务栏::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);显示系统任务栏//恢复WINDOWS系统任务栏正常显示::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);10.如何实现窗口到系统区图标11.间的动画效果//*********************************************************//* 名称:FindTrayWnd//* 作者:徐景周(jingzhou_xu@)//* 功能:在显示窗体动画效果前,先寻找系统区位置//**********************************************************BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam){ TCHAR szClassName[256]; GetClassName(hwnd, szClassName, 255); // 比较窗口类名 if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0) { CRect *pRect = (CRect*) lParam; ::GetWindowRect(hwnd, pRect); return TRUE; } // 当找到时钟窗口时表示可以结束了 if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0) { CRect *pRect = (CRect*) lParam; CRect rectClock; ::GetWindowRect(hwnd, rectClock); pRect->right = rectClock.left; return FALSE; } return TRUE;}//********************************************************//* 名称:WinAnimation//* 作者:徐景周(jingzhou_xu@)//* 功能:显示窗口动画效果的涵数//*********************************************************void CScreenSnapDlg::WinAnimation(BOOL ShowFlag) { CRect rect(0,0,0,0); // 查找托盘窗口 CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL); if (pWnd) { pWnd->GetWindowRect(rect);EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);//rect 为托盘区矩形CRect rcWnd;GetWindowRect(rcWnd);if(ShowFlag)//窗体滑向系统区 DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);else//窗体从系统区滑出 DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd); }}用法如下:if(IsWindowVisible()) //窗体是否已隐藏{ShowWindow(SW_HIDE); //先隐藏窗体WinAnimation(true); //窗体动画滑入到系统区中 }else{WinAnimation(false); //窗体动画从系统区滑出 ShowWindow(SW_SHOW);}12.如何判断当前操作系统的版本//--------------------------------------------------------//判断操作系统涵数及变量,jingzhou xutypedef enum tagWin32SysType{Windows32s,WindowsNT3,Windows95,Windows98,WindowsME,WindowsNT4,Windows2000,WindowsXP}Win32SysType;//判断操作系统涵数及变量,jingzhou xuWin32SysType IsShellSysType(){Win32SysType ShellType;DWORD winVer;OSVERSIONINFO *osvi;winVer=GetVersion();if(winVer<0x80000000){/*NT */ShellType=WindowsNT3;osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));if (osvi!=NULL){memset(osvi,0,sizeof(OSVERSIONINFO));osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);GetVersionEx(osvi);if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Windows2000;else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WindowsXP;free(osvi);}}else if (LOBYTE(LOWORD(winVer))<4)ShellType=Windows32s;else{ShellType=Windows95;osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));if (osvi!=NULL){memset(osvi,0,sizeof(OSVERSIONINFO));osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);GetVersionEx(osvi);if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Windows98;else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WindowsME;free(osvi);}}return ShellType;}//---------------------------------------------------------------13.如何在指14.定矩形框内水平/垂直显示多行文字////////////////////////////////////////////////
// 禁止屏幕保护及电源管理
VERIFY(SystemParametersInfo (dss_SetList[x], 0, NULL, 0));
}
delete[] m_pValue;
启用屏幕保护及电源管理
for (int x=0;x{//启用屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetList[x], m_pValue[x], 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.如何给树控件加入工具提示首先给树控件加入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 child\n");return -1;}其次加入映射消息声明,如下所示:afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult); //树控件上加入提示消息,jingzhou xu ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip) //树控件条目上加入提示,jingzhou xu最后加入呼应涵数处理: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 = "树结点的提示"; } else { tip = "树根上的提示"; } strcpy(pTVTipInfo->pszText, (LPCTSTR) tip); }5.如何获取系统信息框的路径#include #define IDS_REG_KEY_MSINFO_PATH1 _T( "Software\\Microsoft\\Shared Tools\\MSInfo" )#define IDS_REG_KEY_MSINFO_PATH2 _T( "Software\\Microsoft\\Shared 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 ); #else nRet = reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH1, &dwSize ); #endif reg.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 ); #else reg.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 #include //浏览目录.voidBrowseFolder( void ){TCHAR path[MAX_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 ( );}}//搜索其下所有子目录及文件.voidSearchFolder( TCHAR * path ){WIN32_FIND_DATA FindFileData;HANDLEhFind;TCHARfilename[ MAX_PATH + 256 ];TCHARpathbak[ MAX_PATH ];//复制初始用户选择目录strcpy( pathbak, path );//寻找第一个文件hFind = FindFirstFile ( "*.*", &FindFileData );//搜索所有文件及子目录do{if ( hFind != INVALID_HANDLE_VALUE ){//如果是当前目录或父目录,跳过if ( ! ( strcmp( FindFileData.cFileName, "." ) ) || ! ( strcmp( FindFileData.cFileName, ".." ) ) ){continue;}//恢复初始用户选择目录strcpy( path, pathbak );//列出所有发现的文件sprintf( path, "%s\\%s", path, FindFileData.cFileName );//如果 SetCurrentDirectory 成功的话,则它是一个目录,递归调用继续搜索子目录if ( ( SetCurrentDirectory( path ) ) ){SearchFolder( path );} //插入文件及路径名到列表框m_listbox_hwnd中 SendMessage( m_listbox_hwnd, LB_ADDSTRING, 0, path ); //<--INSERT WHAT YOU WANT DONE HERE!}}while ( FindNextFile ( hFind, &FindFileData ) && hFind != INVALID_HANDLE_VALUE );FindClose ( hFind );}8.如何禁止/启用系统热键bool bOld;禁止系统热键//屏蔽掉系统键SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);启用系统热键//恢复系统热键SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&bOld,SPIF_UPDATEINIFILE);9.如何隐藏/显示WINDOWS系统任务栏隐藏系统任务栏//隐藏WINDOWS系统任务栏::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);显示系统任务栏//恢复WINDOWS系统任务栏正常显示::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);10.如何实现窗口到系统区图标11.间的动画效果//*********************************************************//* 名称:FindTrayWnd//* 作者:徐景周(jingzhou_xu@)//* 功能:在显示窗体动画效果前,先寻找系统区位置//**********************************************************BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam){ TCHAR szClassName[256]; GetClassName(hwnd, szClassName, 255); // 比较窗口类名 if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0) { CRect *pRect = (CRect*) lParam; ::GetWindowRect(hwnd, pRect); return TRUE; } // 当找到时钟窗口时表示可以结束了 if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0) { CRect *pRect = (CRect*) lParam; CRect rectClock; ::GetWindowRect(hwnd, rectClock); pRect->right = rectClock.left; return FALSE; } return TRUE;}//********************************************************//* 名称:WinAnimation//* 作者:徐景周(jingzhou_xu@)//* 功能:显示窗口动画效果的涵数//*********************************************************void CScreenSnapDlg::WinAnimation(BOOL ShowFlag) { CRect rect(0,0,0,0); // 查找托盘窗口 CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL); if (pWnd) { pWnd->GetWindowRect(rect);EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);//rect 为托盘区矩形CRect rcWnd;GetWindowRect(rcWnd);if(ShowFlag)//窗体滑向系统区 DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);else//窗体从系统区滑出 DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd); }}用法如下:if(IsWindowVisible()) //窗体是否已隐藏{ShowWindow(SW_HIDE); //先隐藏窗体WinAnimation(true); //窗体动画滑入到系统区中 }else{WinAnimation(false); //窗体动画从系统区滑出 ShowWindow(SW_SHOW);}12.如何判断当前操作系统的版本//--------------------------------------------------------//判断操作系统涵数及变量,jingzhou xutypedef enum tagWin32SysType{Windows32s,WindowsNT3,Windows95,Windows98,WindowsME,WindowsNT4,Windows2000,WindowsXP}Win32SysType;//判断操作系统涵数及变量,jingzhou xuWin32SysType IsShellSysType(){Win32SysType ShellType;DWORD winVer;OSVERSIONINFO *osvi;winVer=GetVersion();if(winVer<0x80000000){/*NT */ShellType=WindowsNT3;osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));if (osvi!=NULL){memset(osvi,0,sizeof(OSVERSIONINFO));osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);GetVersionEx(osvi);if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Windows2000;else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WindowsXP;free(osvi);}}else if (LOBYTE(LOWORD(winVer))<4)ShellType=Windows32s;else{ShellType=Windows95;osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));if (osvi!=NULL){memset(osvi,0,sizeof(OSVERSIONINFO));osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);GetVersionEx(osvi);if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Windows98;else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WindowsME;free(osvi);}}return ShellType;}//---------------------------------------------------------------13.如何在指14.定矩形框内水平/垂直显示多行文字////////////////////////////////////////////////
//启用屏幕保护及电源管理
VERIFY(SystemParametersInfo (dss_SetList[x], m_pValue[x], NULL, 0));
3.如何激活和关闭IE浏览器
//激活并打开IE
void 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.如何给树控件加入工具提示
首先给树控件加入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 child\n");
return -1;
其次加入映射消息声明,如下所示:
afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult);
//树控件上加入提示消息,jingzhou xu
ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip)
//树控件条目上加入提示,jingzhou xu
最后加入呼应涵数处理:
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 = "树结点的提示";
else
tip = "树根上的提示";
strcpy(pTVTipInfo->pszText, (LPCTSTR) tip);
5.如何获取系统信息框的路径
#include
#define IDS_REG_KEY_MSINFO_PATH1 _T( "Software\\Microsoft\\Shared Tools\\MSInfo" )
#define IDS_REG_KEY_MSINFO_PATH2 _T( "Software\\Microsoft\\Shared 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 );
#else
nRet = reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH1, &dwSize );
#endif
reg.Close();
// 如果第一次寻找失败,则进行第二次寻找
if ( nRet !
= ERROR_SUCCESS )
nRet = reg.Open( HKEY_LOCAL_MACHINE, IDS_REG_KEY_MSINFO_PATH2, KEY_READ );
reg.QueryStringValue( IDS_REG_VAL_MSINFO_PATH2, pszPath, &dwSize );
reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH2, &dwSize );
// 路径名不包括EXE文件名
VERIFY( :
PathAppend( pszPath, IDS_MSINFO_EXE_NAME ) );
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 it
DWORD 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.如何遍历整个目录
//浏览目录.
voidBrowseFolder( void )
TCHAR path[MAX_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 ( );
//搜索其下所有子目录及文件.
voidSearchFolder( TCHAR * path )
WIN32_FIND_DATA FindFileData;
HANDLEhFind;
TCHARfilename[ MAX_PATH + 256 ];
TCHARpathbak[ MAX_PATH ];
//复制初始用户选择目录
strcpy( pathbak, path );
//寻找第一个文件
hFind = FindFirstFile ( "*.*", &FindFileData );
//搜索所有文件及子目录
do
if ( hFind !
= INVALID_HANDLE_VALUE )
//如果是当前目录或父目录,跳过
if ( !
( strcmp( FindFileData.cFileName, "." ) ) || !
( strcmp( FindFileData.cFileName, ".." ) ) )
continue;
//恢复初始用户选择目录
strcpy( path, pathbak );
//列出所有发现的文件
sprintf( path, "%s\\%s", path, FindFileData.cFileName );
//如果 SetCurrentDirectory 成功的话,则它是一个目录,递归调用继续搜索子目录
if ( ( SetCurrentDirectory( path ) ) )
//插入文件及路径名到列表框m_listbox_hwnd中
SendMessage( m_listbox_hwnd, LB_ADDSTRING, 0, path );
//<--INSERT WHAT YOU WANT DONE HERE!
while ( FindNextFile ( hFind, &FindFileData ) && hFind !
= INVALID_HANDLE_VALUE );
FindClose ( hFind );
8.如何禁止/启用系统热键
bool bOld;
禁止系统热键
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
启用系统热键
//恢复系统热键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&bOld,SPIF_UPDATEINIFILE);
9.如何隐藏/显示WINDOWS系统任务栏
隐藏系统任务栏
//隐藏WINDOWS系统任务栏
ShowWindow (:
FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
显示系统任务栏
//恢复WINDOWS系统任务栏正常显示
FindWindow("Shell_TrayWnd",NULL),SW_SHOW);
10.如何实现窗口到系统区图标11.间的动画效果
//*********************************************************
//* 名称:
FindTrayWnd
//* 作者:
徐景周(jingzhou_xu@)
//* 功能:
在显示窗体动画效果前,先寻找系统区位置
//**********************************************************
BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam)
TCHAR szClassName[256];
GetClassName(hwnd, szClassName, 255);
// 比较窗口类名
if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0)
CRect *pRect = (CRect*) lParam;
GetWindowRect(hwnd, pRect);
return TRUE;
// 当找到时钟窗口时表示可以结束了
if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0)
CRect rectClock;
GetWindowRect(hwnd, rectClock);
pRect->right = rectClock.left;
return FALSE;
//********************************************************
WinAnimation
显示窗口动画效果的涵数
void CScreenSnapDlg:
WinAnimation(BOOL ShowFlag)
CRect rect(0,0,0,0);
// 查找托盘窗口
CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
if (pWnd)
pWnd->GetWindowRect(rect);
EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);
//rect 为托盘区矩形
CRect rcWnd;
GetWindowRect(rcWnd);
if(ShowFlag)//窗体滑向系统区
DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
else//窗体从系统区滑出
DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
用法如下:
if(IsWindowVisible()) //窗体是否已隐藏
ShowWindow(SW_HIDE); //先隐藏窗体
WinAnimation(true); //窗体动画滑入到系统区中
WinAnimation(false); //窗体动画从系统区滑出
ShowWindow(SW_SHOW);
12.如何判断当前操作系统的版本
//--------------------------------------------------------
//判断操作系统涵数及变量,jingzhou xu
typedef enum tagWin32SysType{
Windows32s,
WindowsNT3,
Windows95,
Windows98,
WindowsME,
WindowsNT4,
Windows2000,
WindowsXP
}Win32SysType;
Win32SysType IsShellSysType()
Win32SysType ShellType;
DWORD winVer;
OSVERSIONINFO *osvi;
winVer=GetVersion();
if(winVer<0x80000000){/*NT */
ShellType=WindowsNT3;
osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
if (osvi!
=NULL){
memset(osvi,0,sizeof(OSVERSIONINFO));
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(osvi);
if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Windows2000;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WindowsXP;
free(osvi);
else if (LOBYTE(LOWORD(winVer))<4)
ShellType=Windows32s;
else{
ShellType=Windows95;
if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Windows98;
else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WindowsME;
return ShellType;
//---------------------------------------------------------------
13.如何在指14.定矩形框内水平/垂直显示多行文字
////////////////////////////////////////////////
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1