程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Visual C++編程技巧小結

Visual C++編程技巧小結

編輯:vc教程

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 otepad.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: emp1.txt,而不用加栽與 txt 文件關聯的應用程序,很多安裝程序完成後都會打開一個窗口,來顯示Readme or Faq,偶猜就是這麼作的啦。

ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c: emp"),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};
}

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved