VC编程技巧20法.doc_第1页
VC编程技巧20法.doc_第2页
VC编程技巧20法.doc_第3页
VC编程技巧20法.doc_第4页
VC编程技巧20法.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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;xdss_ListCount;x+)/ 禁止屏幕保护及电源管理VERIFY(SystemParametersInfo (dss_SetListx, 0, NULL, 0);delete m_pValue;l 启用屏幕保护及电源管理m_pValue = new intdss_ListCount;for (int x=0;xlParam;/对应每个条目的数据HTREEITEM hItem = pTVTipInfo-hItem;CString tip;HTREEITEM hRootItem = m_chassisTree.GetRootItem();if (hRootItem != pTVTipInfo-hItem)tip = 树结点的提示;elsetip = 树根上的提示;strcpy(pTVTipInfo-pszText, (LPCTSTR) tip);5. 如何获取系统信息框的路径#include #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 #include /浏览目录.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 = FindFirstFile ( *.*, &FindFileData );/搜索所有文件及子目录doif ( 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 ); /right = rectClock.left;return FALSE;return TRUE;/*/* 名称:WinAnimation/* 作者:徐景周(jingzhou_)/* 功能:显示窗口动画效果的涵数/*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); /窗体动画滑入到系统区中 elseWinAnimation(false); /窗体动画从系统区滑出 ShowWindow(SW_SHOW);11. 如何判断当前操作系统的版本/-/判断操作系统涵数及变量,jingzhou xutypedef enum tagWin32SysTypeWindows32s,WindowsNT3,Windows95,Windows98,WindowsME,WindowsNT4,Windows2000,WindowsXPWin32SysType;/判断操作系统涵数及变量,jingzhou xuWin32SysType IsShellSysType()Win32SysType ShellType;DWORD winVer;OSVERSIONINFO *osvi;winVer=GetVersion();if(winVerdwOSVersionInfoSize=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)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;/-12. 如何在指定矩形框内水平/垂直显示多行文字/说明:/ 在矩形框中水平或垂直显示多行文字,jingzhou xu./ lMode: 排列方式,0:水平方式; 1:垂直对齐 / lHori: 水平对齐方式, 0:左对齐; 1:居中; 2:右对齐; 3:自定义/ lVert: 垂直对齐方式, 0:顶对齐; 1:居中; 2:底对齐; 3:自定义/CRect DrawTitleInRect(CDC *pDC, CString szString, LPRECT lpRect, long lMode, long lHori, long lVert)TEXTMETRIC tm;pDC-GetTextMetrics(&tm);int tmpWidth=tm.tmAveCharWidth, tmpHeight=tm.tmHeight;CRect rcInner(lpRect);if(lMode=0)rcInner.left+=tmpWidth;rcInner.right-=tmpWidth;rcInner.top-=tmpWidth;rcInner.bottom+=tmpWidth;if(lMode=1)rcInner.left+=tmpWidth;rcInner.right=rcInner.left+tmpWidth;rcInner.top-=tmpWidth;rcInner.bottom+=tmpWidth;pDC-DrawText(szString, rcInner,DT_CALCRECT);switch(lHori)case 0:break;case 1:long xOutCent=(lpRect-right+lpRect-left)/2;long xInnCent=(rcInner.right+rcInner.left)/2;rcInner.left+=(xOutCent-xInnCent);rcInner.right+=(xOutCent-xInnCent);break;case 2:long lInWidth=rcInner.right-rcInner.left;rcInner.right=lpRect-right-tmpWidth;rcInner.left=rcInner.right-lInWidth;break;default:break;switch(lVert)case 0:break;case 1:long yOutCent=(lpRect-bottom+lpRect-top)/2;long yInnCent=(rcInner.bottom+rcInner.top)/2;rcInner.top-=(yInnCent-yOutCent);rcInner.bottom-=(yInnCent-yOutCent);break;case 2:long lInHeigh=rcInner.top-rcInner.bottom;rcInner.bottom=lpRect-bottom+tmpWidth;rcInner.top=rcInner.bottom+lInHeigh;break;default:break;/-/功能:根据新、老矩形,重新计算行数,使文字多行显示,jingzhou xu/-/一行中最大字符数int nMaxLineChar = abs(lpRect-right - lpRect-left) / tmpWidth ; /记录当前行的宽度short theLineLength=0; /记录当前行中汉字字节数,以防止将一半汉字分为两行unsigned short halfChinese=0;for(int i=0; i= 0xA1)halfChinese+;theLineLength+;/如果行宽大于每行最大宽度,进行特殊处理if(theLineLength nMaxLineChar)/防止将一个汉字分为两行,回溯if(halfChinese%2)szString.Insert(i,(unsigned char)0x0a);szString.Insert(i,(unsigned char)0x0d);elseszString.Insert(i-1,(unsigned char)0x0a);szString.Insert(i-1,(unsigned char)0x0d);theLineLength = 0;/重新计算矩形边界范围/ int tmpLine = int(abs(szString.GetLength()*tmpWidth / abs(lpRect-right - lpRect-left)-0.5);/ tmpLine += (szString.GetLength()*tmpWidth % abs(lpRect-right - lpRect-left)? 1 : 0;/ if(tmpLine = 0)/ tmpLine = 1;if(rcInner.bottom lpRect-bottom)rcInner.bottom = lpRect-bottom;if(rcInner.top top)rcInner.top = lpRect-top;/-if(lHori=0)pDC-DrawText(szString, rcInner, DT_WORDBREAK|DT_LEFT);else if(lHori=1)pDC-DrawText(szString, rcInner, DT_WORDBREAK|DT_CENTER);else if(lHori=2)pDC-DrawText(szString, rcInner, DT_WORDBREAK|DT_RIGHT);return rcInner;13. 如何在指定矩形中旋转显示文字/说明:/ 在矩形框中旋转方式显示文字,jingzhou xu/参数: / pDC: DC指针/ str: 显示文字/ rect: 显示范围/ angle: 旋转角度/ nOptions: ExtTextOut()中相应设置/void DrawRotatedText(CDC* pDC, const CString str, CRect rect, double angle, UINT nOptions)/按比例转换角度值double pi = 3.141592654;double radian = pi * 2 / 360 * angle;/获取显示文字中心点CSize TextSize = pDC-GetTextExtent(str);CPoint center;center.x = TextSize.cx / 2;center.y = TextSize.cy / 2;/计算显示文字新的中心点CPoint rcenter;rcenter.x = long(cos(radian) * center.x - sin(radian) * center.y);rcenter.y = long(sin(radian) * center.x + cos(radian) * center.y);/绘制文字pDC-SetTextAlign(TA_BASELINE);pDC-SetBkMode(TRANSPARENT);pDC-ExtTextOut(rect.left + rect.Width() / 2 - rcenter.x, rect.top + rect.Height() / 2 + rcenter.y,nOptions, rect, str, NULL);14. 如何将32 x 32像素图标转换为16 x 16像素值的图标HICON Convert32x32IconTo16x16(HICON h32x32Icon)HDC hMainDC, hMemDC1, hMemDC2;HICON h16x16Icon;BITMAP bmp;HBITMAP hOldBmp1, hOldBmp2;ICONINFO IconInfo32x32, IconInfo16x16;GetIconInfo(h32x32Icon, &IconInfo32x32);hMainDC = :GetDC(m_hWnd);hMemDC1 = CreateCompatibleDC(hMainDC);hMemDC2 = CreateCompatibleDC(hMainDC);GetObject(IconInfo32x32.hbmColor, sizeof(BITMAP), &bmp);IconInfo16x16.hbmColor = CreateBitmap( 16, 16, bmp.bmPlanes,bmp.bmBitsPixel,NULL);hOldBmp1 = (HBITMAP) SelectObject( hMemDC1, IconInfo32x32.hbmColor);hOldBmp2 = (HBITMAP) SelectObject( hMemDC2,IconInfo16x16.hbmColor);StretchBlt(hMemDC2,0, 0,16, 16,hMemDC1,0, 0,32, 32,SRCCOPY);GetObject(IconInfo32x32.hbmMask, sizeof(BITMAP), &bmp);IconInfo16x16.hbmMask = CreateBitmap( 16, 16, bmp.bmPlanes, bmp.bmBitsPixel,NULL);SelectObject(hMemDC1, IconInfo32x32.hbmMask);SelectObject(hMemDC2, IconInfo16x16.hbmMask);StretchBlt(hMemDC2,0, 0,16, 16,hMemDC1,0, 0,32, 32,SRCCOPY);SelectObject(hMemDC1, hOldBmp1);SelectObject(hMemDC2, hOldBmp2);IconInfo16x16.fIcon = TRUE;h16x16Icon = CreateIconIndirect(&IconInfo16x16);DeleteObject(IconInfo32x32.hbmColor);DeleteObject(IconInfo16x16.hbmColor);DeleteObject(IconInfo32x32.hbmMask);DeleteObject(IconInfo16x16.hbmMask);DeleteDC(hMemDC1);DeleteDC(hMemDC2);:ReleaseDC(m_hWnd, hMainDC);return h16x16Icon;15. 如何建立一个灰度级图标HICON CreateGrayscaleIcon(HICON hIcon)HICON hGrayIcon = NULL;HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;BITMAP bmp;HBITMAP hOldBmp1 = NULL,hOldBmp2 = NULL;ICONINFO csII, csGrayII;BOOL bRetValue = FALSE;bRetValue = :GetIconInfo(hIcon, &csII);if (bRetValue = FALSE) return NULL;hMainDC = :GetDC(m_hWnd);hMemDC1 = :CreateCompatibleDC(hMainDC);hMemDC2 = :CreateCompatibleDC(hMainDC);if (hMainDC = NULL | hMemDC1 = NULL |hMemDC2 = NULL) return NULL;if (:GetObject(csII.hbmColor, sizeof(BITMAP), &bmp)csGrayII.hbmColor = :CreateBitmap(csII.xHotspot*2,csII.yHotspot*2, bmp.bmPlanes, bmp.bmBitsPixel, NULL);if (csGrayII.hbmColor)hOldBmp1 =(HBITMAP):SelectObject(hMemDC1,csII.hbmColor);hOldBmp2 = (HBITMAP):SelectObject(hMemDC2,csGrayII.hbmColor);:BitBlt(hMemDC2, 0, 0, csII.xHotspot*2,csII.yHotspot*2, hMemDC1, 0, 0,SRCCOPY);DWORD dwLoopY = 0, dwLoopX = 0;COLORREF crPixel = 0;BYTE byNewPixel = 0;for (dwLoopY = 0; dwLoopY csII.yHotspot*2; dwLoopY+)for (dwLoopX = 0; dwLoopX height)height = width;elsewidth = height;HDC memDC = CreateCompatibleDC(destDC);HBITMAP memBmp = CreateCompatibleBitmap(destDC, width, height);HBITMAP obmp = (HBITMAP) SelectObject(memDC, memBmp);/内存DC新在中心点int newCentre = int(float(width)/2);/开始旋转for(int x = srcx1; x=srcx2; x+)for(int y = srcy1; yGetWindowRect(&r);elsewnd-GetClientRect(&r);CString s;wnd-GetWindowText(s);CSize sz(r.Width(), r.Height();bm.CreateCompatibleBitmap(dc, sz.cx, sz.cy);CBitmap * oldbm = memDC.SelectObject(&bm);memDC.BitB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论