窗口操作函數


涉及函數:

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);來使得父窗口重新調整大小。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值