Visual C++編程技巧小結——進程視窗等特性總結

來源:互聯網
上載者:User
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處進行聲明,也就是常說的"宏映射"
 
  9. 如何改變視窗的表徵圖?

  向視窗發送 WM_SECTION訊息。

  Example:

HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);

  10. 如何改變視窗的預設風格?

  重寫 CWnd:: PreCreateWindow 並修改CREATESTRUCT 結構來指定視窗風格和其他建立資訊.

Example: Delete "Max" Button and Set Original Window’s Position and Size

BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs)
{
 cs.style &=~WS_MAXINIZEMOX;
 cs.x=cs.y=0;
 cs.cx=GetSystemMetrics(SM_CXSCREEN/2);
 cs.cy=GetSystemMetrics(SM_CYSCREEN/2);
 return CMDIFramewnd ::PreCreateWindow(cs);

}

  11. 如何將視窗置中顯示?

Easy, Call Function CWnd:: Center Windows
Example(1): Center Window( ); //Relative to it’s parent
// Relative to Screen
Example(2): Center Window(CWnd:: GetDesktopWindow( ));
//Relative to Application’s MainWindow
AfxGetMainWnd( ) -> Center Window( );

  12. 如何讓視窗和 MDI視窗一啟動就最大化和最小化?

  先說視窗。

  在 InitStance 函數中設定 m_nCmdShow的 取值.

m_nCmdShow=SW_SHOWMAXMIZED ; //最大化
m_nCmdShow=SW_SHOWMINMIZED ; //最小化
m_nCmdShow=SW_SHOWNORMAL ; //正常方式

  MDI視窗:

  如果是建立新的應用程式,可以用 MFC AppWizard 的Advanced 按鈕並在MDI 子視窗風格組中檢測最大化或最小化; 還可以重載 MDI Window 的PreCreateWindow函數,設定
WS_MAXMIZE or WS_MINMIZE;如果從 CMDIChildWnd 派生,調用 OnInitialUpdate函數中的 CWnd::Show Window來指定 MDI Child Window的 風格。

  13. 如何使程式保持極小狀態?

  很有意思的問題

  這麼辦: 在恢複程式表單大小時, Windows 會發送WM_QUERY-OPEN 訊息,用ClassWizard設定成員函數 OnQueryOpen() ,add following code:

Bool CMainFrame:: OnQueryOpen( )
{
 Return false;
}

  14. 如何限制視窗的大小?

  也就是 FixedDialog 形式。 Windows 發送 WM_GETMAXMININFO訊息來跟蹤, 響應它,在OnGetMAXMININFO 中寫代碼:

  15. 如何使視窗不可見?

  很簡單,用SW_HIDE 隱藏視窗,可以結合 FindWindow,ShowWindow 控制.

  16. 如何使視窗始終在最前方?

  兩種途徑.

BringWindowToTop(Handle);

  SetWindowPos函數,指定視窗的 最頂風格,用WS_EX_TOPMOST擴充視窗的 風格

  Example:

void ToggleTopMost( CWnd *pWnd)
{
 ASSERT_VALID(pWnd);
 pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)?
  &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE};

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.