編程技巧20法 (上)

[代碼如下]
編程技巧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<dss_ListCount;x++) 
    { 
        // 禁止屏幕保護及電源管理 
        VERIFY(SystemParametersInfo(dss_SetList[x],0,NULL,0)); 
    } 
    delete []m_pValue ; 


l 啓 用 屏 幕 保 護 及 電 源 管 理 

    m_pValue=new int [dss_ListCount]; 
    for (int x=0;x<dss_ListCount;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<atlbase.h> 

#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<windows.h> 
#include<shlobj.h> 

//瀏覽目錄. 
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 protected]
//* 功能:在顯示窗體動畫效果前,先尋找系統區位置 
//******************************************************************************** 
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 protected]
//* 功能:顯示窗口動畫效果的涵數 
//******************************************************************************** 
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); 
發佈了29 篇原創文章 · 獲贊 34 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章