Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676222
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 03:29:28

编程技巧20法 (上)
分类: 2.3 VC技巧收集 184人阅读 评论(0) 收藏 举报
[代码如下]
编程技巧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); 
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_INFOTIP,jingzhou xu(树控件ID:100) 
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP,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); 
//树控件上加入提示消息,jingzhou xu 

//树控件条目上加入提示,jingzhou xu 
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 
//* 作者:徐景周(jingzhou_xu@163.net) 
//* 功能:在显示窗体动画效果前,先寻找系统区位置 
//******************************************************************************** 
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@163.net) 
//* 功能:显示窗口动画效果的涵数 
//******************************************************************************** 
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); 
阅读(850) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~