?? vctip1.html
字號:
<html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="doccomm" CONTENT="sss"><meta NAME="Template" CONTENT="C:\MSOffice\Template\Sl_BOOK.dot"><meta NAME="Author" CONTENT="Cheng Jinxing"><title>Visual C++編程技巧之一</title></head><body TEXT="#000000" BGCOLOR="#CCFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><p align="center"><br><font SIZE="+3" FACE="楷體_GB2312">Visual C++編程技巧之一</font> </p><p><a HREF="#tip1"><font SIZE="+0" FACE="Times New Roman">1. </font><font SIZE="+0">如何獲取應用程序的實例句柄</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip2"><font SIZE="+0" FACE="Times New Roman">2. </font><font SIZE="+0">如何通過代碼獲得應用程序主窗口的指針</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip3"><font SIZE="+0" FACE="Times New Roman">3.</font><font SIZE="+0">如何在程序中獲得其他程序的 圖標</font><font SIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip4"><font SIZE="+0" FACE="Times New Roman">4.</font><font SIZE="+0">如何編程結束應用程序</font><fontSIZE="+0" FACE="Times New Roman">?</font><font SIZE="+0">如何編程控制</font><fontSIZE="+0" FACE="Times New Roman">windows</font><font SIZE="+0">的重新引導</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip5"><font SIZE="+0" FACE="Times New Roman">5.</font><font SIZE="+0">怎樣加栽其他的應用程序</font><fontSIZE="+0" FACE="Times New Roman">?</font></a> </p><p><a HREF="#tip6"><font SIZE="+0" FACE="Times New Roman">6. </font><font SIZE="+0">確定應用程序的 路徑</font></a> </p><p><a HREF="#tip7"><font SIZE="+0" FACE="Times New Roman">7. </font><font SIZE="+0">獲得各種目錄信息</font></a> </p><p><a HREF="#tip8"><font SIZE="+0" FACE="Times New Roman">8. </font><font SIZE="+0">如何自定義消息</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip1"></a><b><font SIZE="+2"><font FACE="Times New Roman">1. </font><fontFACE="黑體">如何獲取應用程序的實例句柄</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">應用程序的 實例句柄保存在<font FACE="Times New Roman">CWinAppIm_hInstance </font>中<font FACE="Times New Roman">,</font>可以這么調用</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">AfxGetInstancdHandle</font>獲得句柄<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">Example: HANDLE hInstance=AfxGetInstanceHandle();</font> </p><p><a NAME="tip2"></a><b><font SIZE="+2"><font FACE="Times New Roman">2. </font><fontFACE="黑體">如何通過代碼獲得應用程序主窗口的指針</font><fontFACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">主窗口的 指針保存在<font FACE="Times New Roman">CWinThread::m_pMainWnd</font>中<fontFACE="Times New Roman">,</font>調用 <font FACE="Times New Roman">AfxGetMainWnd</font>實現。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //</font>使程序最大化<font FACE="Times New Roman">.</font></font> </p><p><a NAME="tip3"></a><b><font SIZE="+2"><font FACE="Times New Roman">3.</font><fontFACE="黑體">如何在程序中獲得其他程序的</font> <font FACE="黑體">圖標</font><fontFACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">兩種方法<font FACE="Times New Roman">:</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(1) SDK</font>函數 <fontFACE="Times New Roman">SHGetFileInfo </font>或使用 <font FACE="Times New Roman">ExtractIcon</font>獲得圖標資源的 <font FACE="Times New Roman">handle,</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(2) SDK</font>函數 <fontFACE="Times New Roman">SHGetFileInfo</font>獲得有關文件的 很多信息<fontFACE="Times New Roman">,</font>如大小圖標<font FACE="Times New Roman">,</font>屬性<fontFACE="Times New Roman">,</font>類型等<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Example(1): </font>在程序窗口左上角顯示 <font FACE="Times New Roman">NotePad</font>圖標<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView: OnDraw(CDC * pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,</font> </p><p><font SIZE="+0" FACE="Times New Roman">&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC ->DrawIcon(10,10,stFileInfo.hIcon);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Example(2):</font>同樣功能<fontFACE="Times New Roman">,Use ExtractIcon Function</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView:: OnDraw(CDC *pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T</font> </p><p><font SIZE="+0" FACE="Times New Roman">("NotePad.exe"),0);</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (hIcon &&hIcon!=(HICON)-1)</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->DrawIcon(10,10,hIcon);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">說明<font FACE="Times New Roman">: </font>獲得<fontFACE="Times New Roman">notepad.exe</font>的路徑正規上來說用<fontFACE="Times New Roman">GetWindowsDirectory </font>函數得到<font FACE="Times New Roman">,</font>如果是調用 <font FACE="Times New Roman">win95</font>下的畫筆,應該用訪問注冊表的方法獲得其路徑,要作成一個比較考究的程序,考慮應該全面點<fontFACE="Times New Roman">.</font></font> </p><p><a NAME="tip4"></a><b><font SIZE="+2"><font FACE="Times New Roman">4.</font><fontFACE="黑體">如何編程結束應用程序</font><font FACE="Times New Roman">?</font><fontFACE="黑體">如何編程控制</font><font FACE="Times New Roman">windows</font><fontFACE="黑體">的重新引導</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">這是個很簡單又是編程中經常要遇到的問題<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0">第一問<font FACE="Times New Roman">,</font>向窗口發送 <fontFACE="Times New Roman">WM_CLOSE</font>消息<font FACE="Times New Roman">,</font>調用 <fontFACE="Times New Roman">CWnd::OnClose</font>成員函數<font FACE="Times New Roman">.</font>允許對用戶提示</font> </p><p><font SIZE="+0">是否保存修改過的數據<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);</font> </p><p><font SIZE="+0">還可以創建一個自定義的函數 <font FACE="Times New Roman">Terminate Window</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">void Terminate Window(LPCSTR pCaption)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (pWnd)</font> </p><p><font SIZE="+0" FACE="Times New Roman">pWnd ->SendMessage(WM_CLOSE);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">說明<font FACE="Times New Roman">: FindWindow</font>函數不是提倡的做法,因為它無法處理標題欄自動改變,比如我們要檢測 <font FACE="Times New Roman">Notepad</font>是不是已運行而事先不知道<fontFACE="Times New Roman">Notepad</font>的標題欄<font FACE="Times New Roman">,</font>這時 <font FACE="Times New Roman">FindWindow</font>就無能為力了,可以通過枚舉 <fontFACE="Times New Roman">windows</font>任務列表的辦法來實現。 在 機械出版社<fontFACE="Times New Roman">"Windows 95 API</font>開發人員指南<fontFACE="Times New Roman">"</font>一書有比較詳細的介紹<fontFACE="Times New Roman">,</font>這里就不再多說樂。</font> </p><p><font SIZE="+0">第二問<font FACE="Times New Roman">,Use ExitWindowsEx Function</font>函數控制系統是重新引導,還是重啟 <font FACE="Times New Roman">windows.</font>前面已經有人講過樂,就不再提了。</font> </p><p><a NAME="tip5"></a><b><font SIZE="+2"><font FACE="Times New Roman">5.</font><fontFACE="黑體">怎樣加栽其他的應用程序</font><font FACE="Times New Roman">?</font></font></b> </p><p><font SIZE="+0">我記得這好象是出場頻度很高的問題。</font> </p><p><font SIZE="+0">三個<font FACE="Times New Roman">SDK</font>函數 <fontFACE="Times New Roman">winexec, shellexecute,createprocess</font>可以使用。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">WinExec</font>最簡單,兩個參數,前一個指定路徑,后一個指定顯示方式<fontFACE="Times New Roman">.</font>后一個參數值得說一下,比如泥用 <fontFACE="Times New Roman">SW_SHOWMAXMIZED</font>方式去加栽一個無最大化按鈕的 程序,呵呵就是<font FACE="Times New Roman">Neterm,calc</font>等等,就不會出現正常的 窗體,但是已經被加到任務列表里了。<font FACE="Times New Roman">ShellExecute</font>較 <font FACE="Times New Roman">WinExex</font>靈活一點,可以指定工作目錄<fontFACE="Times New Roman">,</font>下面的 <font FACE="Times New Roman">Example</font>就是直接打開 <font FACE="Times New Roman">c:\temp\1.txt,</font>而不用加栽與 <fontFACE="Times New Roman">txt</font>文件關聯的應用程序<font FACE="Times New Roman">,</font>很多安裝程序完成后都會打開一個窗口,來顯示<fontFACE="Times New Roman">Readme or Faq,</font>偶猜就是這么作的啦<fontFACE="Times New Roman">.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">CreateProcess</font>最復雜,一共有十個參數,不過大部分都可以用<fontFACE="Times New Roman">NULL</font>代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等<fontFACE="Times New Roman">.</font>來看個很簡單的 <font FACE="Times New Roman">Example:</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">STARTUPINFO stinfo; //</font>啟動窗口的信息</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">PROCESSINFO procinfo; //</font>進程的信息</font> </p><p><font SIZE="+0" FACE="Times New Roman">CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_</font> </p><p><font SIZE="+0" FACE="Times New Roman">CLASS,NULL,NULL, &stinfo,&procinfo);</font> </p><p><a NAME="tip6"></a><b><font SIZE="+2"><font FACE="Times New Roman">6. </font><fontFACE="黑體">確定應用程序的</font> <font FACE="黑體">路徑</font></font></b> </p><p><font SIZE="+0">前些天好象有人問過這個問題<font FACE="Times New Roman">.</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Use GetModuleFileName </font>獲得應用程序的路徑,然后去掉可執行文件名。</font> </p><p><font SIZE="+0" FACE="Times New Roman">Example:</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">TCHAR exeFullPath[MAX_PATH]; // MAX_PATH</font>在<fontFACE="Times New Roman">API</font>中定義了吧,好象是<font FACE="Times New Roman">128</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">GetModuleFileName(NULL,exeFullPath,MAX_PATH)</font> </p><p><a NAME="tip7"></a><b><font SIZE="+2"><font FACE="Times New Roman">7. </font><fontFACE="黑體">獲得各種目錄信息</font></font></b> </p><p><font SIZE="+0"><font FACE="Times New Roman">Windows</font>目錄<fontFACE="Times New Roman">: Use "GetWindowsDirectory</font>“</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">Windows</font>下的<fontFACE="Times New Roman">system</font>目錄<font FACE="Times New Roman">: Use "GetSystemDirectory"</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">temp</font>目錄<fontFACE="Times New Roman">: Use "GetTempPath "</font></font> </p><p><font SIZE="+0">當前目錄<font FACE="Times New Roman">: Use "GetCurrentDirectory"</font></font> </p><p><font SIZE="+0">請注意前兩個函數的第一個參數為 目錄變量名,后一個為緩沖區<font FACE="Times New Roman">; </font>后兩個相反<fontFACE="Times New Roman">.</font></font> </p><p><a NAME="tip8"></a><b><font SIZE="+2"><font FACE="Times New Roman">8. </font><fontFACE="黑體">如何自定義消息</font></font></b> </p><p><font SIZE="+0">也有人問過的,其實不難。</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(1) </font>手工定義消息,可以這么寫 <font FACE="Times New Roman">#define WM_MY_MESSAGE(WM_USER+100),</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">MS </font>推薦的至少是 <fontFACE="Times New Roman">WM_USER+100;</font></font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(2)</font>寫消息處理函數<fontFACE="Times New Roman">,</font>用 <font FACE="Times New Roman">WPARAM,LPARAM</font>返回<fontFACE="Times New Roman">LRESULT.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">//</font>加入你的處理函數</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">(3) </font>在類的 <fontFACE="Times New Roman">AFX_MSG</font>處進行聲明,也就是常說的<fontFACE="Times New Roman">"</font>宏映射<font FACE="Times New Roman">"</font></font> </p><p><font SIZE="+0"> </font> </p><hr><p> <a HREF="skill.htm">返回上頁</a> </p></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -