涉及函數:
1.SetForegroundWindow()
2.SetWindowPlacement()
3.SetActiveWindow()
4.BringWindowToTop()
5.SetFocus()
6.
7.SwitchToThisWindow()
------------------------------------------------------------------------------------------------------
頭文件:winuser.h;
庫文件:user32.lib。
SetForegroundWindow()
----------------------
函數功能:該函數將創建指定窗口的線程設置到前台,并且激活該窗口。
鍵盤輸入轉向該窗口,并為用戶改各种可視的記號。系統給創建前台窗口的線程分配的權限稍高于其他線程。
函數原型:BOOL SetForegroundWindow()
SetForegroundWindow()函數本身是不帶參數的,具体激活某個窗口的方法可以用:
pWnd->SetForegroundWindow();//這里的pWnd即所要激活窗口的句柄。
返回值:如果窗口設入了前台,返回值為非零;如果窗口未被設入前台,返回值為零。
備注:前台窗口是z序頂部的窗口,是用戶的工作窗口。在一個多任務优先優占環境中,應讓用戶控制前台窗口。
-------------------------------------------------------------------------------------------------------
SetWindowPlacement()
---------------------
函?功能:該函數設置指定窗口的顯示狀態和恢复,最大化,最小化位置。
函及原型;BOOL SetWindowPlacement(HWND hWnd,CONST WINDOWPLACEMENT* lpwndpl);
參數:hWnd:窗口句柄。
lpwndpl:指向一個WINDOWPLACEMWNT結构的指針,該結構給出了新的顯示狀態和窗口位置。
在調用函數 SetWindowPlacement 之前,將 WINDOWPLACEMWNT 結构的長度單元置為 sizeof(WINDOWPLACEMENT)。
如果lpwndpl->length設置不正确,函數 SetWindowPlacement 將失敗。
返回值:如果函數成功,返回值為非零。如果函數失敗,返回值為零。若想獲得更多錯誤信息,請調用 callGetLastErro 函數。
備注:如果在 WIDNOWPLACEMENT 中指定的信息使窗口完全顯示在屏幕之外,系統自動調整坐標以使窗口可見,兼顧屏幕設置和多种監視器配置。
WINDOWPLACEMENT 的長度成員信息設置為 sizeof(WINDOWPLACEMENT),如果設置不正确,函數將返回FLASE。
查看窗口位置坐標的信息,參看WINDOWPLACEMENT。
-----------------------------------------------------------------------------------------------------------------------
SetActiveWindow()
------------------
原型: <span style="font-size:14px;">CWnd* SetActiveWindow();
HWND SetActiveWindow(hWnd);</span>
功能:該函數激活一個窗口,hWnd:將被激活的最頂層窗口。
返回值:若函數調用成功,則返回原先活動窗口的句柄。若函數調用失敗,則返回值為NULL
備注:SetActiveWindow函數激活一個窗口,但當應用程序處于后台時,將不激活指定窗口。當應用程序激活窗口時處于前台,則窗口將被放到前台
---------------------------------------------------------------------------------------------------------------------------
BringWindowToTop()
----------------------
原型:<span style="font-size:14px;">VOID BringWindowToTop();
BOOL ::BringWindowToTop(m_hWnd)</span>
功能:該函數將指定的窗口設置到Z序的頂部。如果窗口為頂層窗口,則該窗口被激活;如果窗口為子窗口,則相應的頂級父窗口被激活。
返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零。
備注:使用BringWindowToTop函數顯示出被其他窗口部分或全部遮蓋的窗口。
調用這個函數類似于調用 SetWindowPos 函數來改變窗口在Z序中的位置,但是 BringWindowToTop 函數并不能使一個窗口成為前台窗口。
如果應用程序不在前台中而想設置在前台中,可以調用 SetForegroundWindow 函數。
--------------------------------------------------------------------------------------------------------------------------
SetFocus()SetCapture和SetActiveView
--------------
---------------------------------------------------------------------------------------------------------------------------
SwitchToThisWindow()
----------------------
原型:void SwitchToThisWindow()
參數:HWND hWnd, // 被激活的窗口句柄
BOOL bRestore // 如果被极小化,則恢复窗口
因為是dll中的函數,所以需要動態加載這個函數:
typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
HMODULE hUser32 = GetModuleHandle("user32");
SwitchToThisWindow = ( PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
接下來只要用任何現存窗口的句柄調用這個函數即可,第二個參數指定如果窗口极小化,是否恢复其原狀態。
SwitchToThisWindow(hWnd, TRUE);
------------------------------------------------------------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++
[VC & MFC] 動態創建View的几個方法
+++++++++++++++++++++++++++++++++++++++++
1.如果是在CSplitterWnd內,可以如下方法:
CCreateContext context;
context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;
pSplitter->CreateView(row,col,pViewClass,size, &context);
其中 pViewClass 是你要創建的 View 類的 RUNTIME_CLASS,pSplitter 是指向 CSplitterWnd 的指針。
----------------------------------------------------------------------------------------------
2.在 FrameWnd 內,創建作為 FrameWnd 子窗口的 View 類:
// the third way, use framewnd.
CCreateContext ccx;
ccx.m_pNewViewClass = RUNTIME_CLASS(CMainView);
// here “this” means the framewnd.
m_pMainView = DYNAMIC_DOWNCAST( CMainView, this->CreateView(&ccx) );
-----------------------------------------------------------------------------------------------
3.在其他任何地方創建 View 類:
CView* pNewView = View*)pViewClass->CreateObject();
pNewView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0),pSplitter,
pSplitter->IdFromRowCol(row, col),&context);
---------------------------------------------------------------
其他:
1.創建完畢后,可以使用如下代碼更新顯示 View:
SetActiveView(pNewView);
pSplitter->RecalcLayout();
pNewView->OnInitialUpdate();
pNewView->SendMessage(WM_PAINT);
2.可以使用下面的代碼刪除某個 View,比如舊的 View:
pDoc->m_bAutoDelete = FALSE;
pOldView->DestroyWindow();
pDoc->m_bAutoDelete = TRUE;
3.下面代碼可以設置 View 的 ID:
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
::SetWindowLong(pNewView->m_hWnd, GWL_ID, pSplitter->IdFromRowCol(row, col));
4.使用 GetDlgItem() 也可以根据 ID來得到一個View的指針;
5.可以使用 m_pMainView->ResizeParentToFit(FALSE);來使得父窗口重新調整大小。