找回密码
 注册
搜索
查看: 3453|回复: 0

编程技巧20法(1-10)

[复制链接]
发表于 2004-1-4 20:51:30 | 显示全部楼层 |阅读模式
编程技巧20法(1-10) 徐景周日期:2002-09-12 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); l 禁止屏幕保护及电源管理 { m_pValue = new int[dss_ListCount]; for (int x=0;x { // 禁止屏幕保护及电源管理 VERIFY(SystemParametersInfo (dss_SetList[x], 0, NULL, 0)); } delete[] m_pValue; } l 启用屏幕保护及电源管理 { 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浏览器 //激活并打开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. 如何给树控件加入工具提示 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 child\n"); return -1; } l 其次加入映射消息声明,如下所示: afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult); //树控件上加入提示消息, ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip) //树控件条目上加入提示, l 最后加入呼应涵数处理: 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 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. 如何遍历整个目录 #include #include //浏览目录. void BrowseFolder( 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 ( ); } } //搜索其下所有子目录及文件. void SearchFolder( TCHAR * path ) { WIN32_FIND_DATA FindFileData; HANDLE hFind; TCHAR filename[ MAX_PATH + 256 ]; TCHAR pathbak[ 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; l 禁止系统热键 //屏蔽掉系统键 SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE); l 启用系统热键 //恢复系统热键 SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&bOld,SPIF_UPDATEINIFILE); 9. 如何隐藏/显示WINDOWS系统任务栏 l 隐藏系统任务栏 //隐藏WINDOWS系统任务栏 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE); l 显示系统任务栏 //恢复WINDOWS系统任务栏正常显示 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW); 10. 如何实现窗口到系统区图标间的动画效果 //******************************************************************************** //* 名称:FindTrayWnd //* 作者:徐景周([email=jingzhou_xu@163.net]jingzhou_xu@163.net[/email]) //* 功能:在显示窗体动画效果前,先寻找系统区位置 //******************************************************************************** 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 //* 作者:徐景周([email=jingzhou_xu@163.net]jingzhou_xu@163.net[/email]) //* 功能:显示窗口动画效果的涵数 //******************************************************************************** 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); } } 用法如下: { ShowWindow(SW_HIDE); //先隐藏窗体 WinAnimation(true); //窗体动画滑入到系统区中 } else { WinAnimation(false); //窗体动画从系统区滑出 ShowWindow(SW_SHOW); }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-20 04:03 , Processed in 0.036245 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表