VisualC++編程技巧

字號(hào):

1. 如何獲取應(yīng)用程序的實(shí)例句柄?
    應(yīng)用程序的 實(shí)例句柄保存在CWinAppIm_hInstance 中,可以這么調(diào)用
    AfxGetInstancdHandle獲得句柄.
    Example: HANDLE hInstance=AfxGetInstanceHandle();
    2. 如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?
    主窗口的 指針保存在CWinThread::m_pMainWnd中,調(diào)用 AfxGetMainWnd實(shí)現(xiàn)。
    AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序化.
    3. 如何在程序中獲得其他程序的 圖標(biāo)
    兩種方法:
    (1) SDK函數(shù) SHGetFileInfo 或使用 ExtractIcon獲得圖標(biāo)資源的 handle,
    (2) SDK函數(shù) SHGetFileInfo獲得有關(guān)文件的 很多信息,如大小圖標(biāo),屬性,類型等.
    Example(1): 在程序窗口左上角顯示 NotePad圖標(biāo).
    void CSampleView: OnDraw(CDC * pDC)
    {
    if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
    &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
    {
    pDC ->DrawIcon(10,10,stFileInfo.hIcon);
    }
    }
    Example(2): 同樣功能,Use ExtractIcon Function
    void CSampleView:: OnDraw(CDC *pDC)
    {
    HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
    ("NotePad.exe"),0);
    if (hIcon &&hIcon!=(HICON)-1)
    pDC->DrawIcon(10,10,hIcon);
    }
    說(shuō)明: 獲得notepad.exe 的路徑正規(guī)上來(lái)說(shuō)用GetWindowsDirectory 函數(shù)得到,如果是
    調(diào)用 win95下的畫(huà)筆,應(yīng)該用訪問(wèn)注冊(cè)表的方法獲得其路徑,要作成一個(gè)比較考究的程
    序,考慮應(yīng)該全面點(diǎn).
    4. 如何編程結(jié)束應(yīng)用程序?如何編程控制windows 的重新引導(dǎo)?
    這是個(gè)很簡(jiǎn)單又是編程中經(jīng)常要遇到的問(wèn)題.
    第一問(wèn),向窗口發(fā)送 WM_CLOSE消息,調(diào)用 CWnd::OnClose成員函數(shù).允許對(duì)用戶提示
    是否保存修改過(guò)的數(shù)據(jù).
    Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);
    還可以創(chuàng)建一個(gè)自定義的函數(shù) Terminate Window
    void Terminate Window(LPCSTR pCaption)
    {
    CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);
    if (pWnd)
    pWnd ->SendMessage(WM_CLOSE);
    }
    說(shuō)明: FindWindow 函數(shù)不是提倡的做法,因?yàn)樗鼰o(wú)法處理標(biāo)題欄自動(dòng)改變,比如我們要
    檢測(cè) Notepad 是不是已運(yùn)行而事先不知道Notepad 的標(biāo)題欄,這時(shí) FindWindow 就無(wú)能
    為力了,可以通過(guò)枚舉 windows 任務(wù)列表的辦法來(lái)實(shí)現(xiàn)。 在 機(jī)械出版社"Windows 95
    API開(kāi)發(fā)人員指南"一書(shū)有比較詳細(xì)的介紹,這里就不再多說(shuō)樂(lè)。
    第二問(wèn),Use ExitWindowsEx Function 函數(shù)控制系統(tǒng)是重新引導(dǎo),還是重啟 windows.
    前面已經(jīng)有人講過(guò)樂(lè),就不再提了。
    5. 怎樣加栽其他的應(yīng)用程序?
    我記得這好象是出場(chǎng)頻度很高的問(wèn)題。
    三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。
    WinExec 最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式.后一個(gè)參數(shù)值得說(shuō)
    一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一個(gè)無(wú)化按鈕的 程序,呵呵就是
    Neterm,calc 等等,就不會(huì)出現(xiàn)正常的 窗體,但是已經(jīng)被加到任務(wù)列表里了。
    ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的 Example就是直接打開(kāi)
    c:\temp\1.txt,而不用加栽與 txt 文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)打開(kāi)
    一個(gè)窗口,來(lái)顯示Readme or Faq,偶猜就是這么作的啦.
    ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);
    CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大部分都可以用NULL 代替,它可以指定
    進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等.來(lái)看個(gè)很簡(jiǎn)單的 Example:
    STARTUPINFO stinfo; //啟動(dòng)窗口的信息
    PROCESSINFO procinfo; //進(jìn)程的信息
    CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_
    CLASS,NULL,NULL, &stinfo,&procinfo);
    6. 確定應(yīng)用程序的 路徑
    前些天好象有人問(wèn)過(guò)這個(gè)問(wèn)題.
    Use GetModuleFileName 獲得應(yīng)用程序的路徑,然后去掉可執(zhí)行文件名。
    Example:
    TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定義了吧,好象是128
    GetModuleFileName(NULL,exeFullPath,MAX_PATH)
    7. 獲得各種目錄信息
    Windows目錄: Use "GetWindowsDirectory“
    Windows下的system目錄: Use "GetSystemDirectory"
    temp目錄: Use "GetTempPath "
    當(dāng)前目錄: Use "GetCurrentDirectory"
    請(qǐng)注意前兩個(gè)函數(shù)的第一個(gè)參數(shù)為 目錄變量名,后一個(gè)為緩沖區(qū); 后兩個(gè)相反.
    8. 如何自定義消息
    也有人問(wèn)過(guò)的,其實(shí)不難。
    (1) 手工定義消息,可以這么寫(xiě) #define WM_MY_MESSAGE(WM_USER+100), MS 推薦的至
    少是 WM_USER+100;
    (2)寫(xiě)消息處理函數(shù),用 WPARAM,LPARAM返回LRESULT.
    LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)
    {
    //加入你的處理函數(shù)
    }
    (3) 在類的 AFX_MSG處進(jìn)行聲明,也就是常說(shuō)的"宏映射"