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