久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC中CWnd類及其派生類對(duì)話框,、消息處理,、窗口操作

 筱肆 2014-06-10

MFC中CWnd類及其派生類對(duì)話框、消息處理,、窗口操作

http://hi.baidu.com/xiaorida21/blog/item/8d8eb77a22eedee52e73b39e.html

CWnd類

我們?cè)谄聊簧峡吹降乃袑?duì)象都和窗口有關(guān),,它們或者派生于CWnd,屬繼承關(guān)系,,如對(duì)話框,、工具欄、狀態(tài)欄,、子控件,;或者被CWnd合成,屬服務(wù)員與服務(wù)對(duì)象關(guān)系,,如圖標(biāo),、菜單、顯示設(shè)備,。

CWnd類封裝的窗口操作主要包含窗口的創(chuàng)建和銷毀,、操作窗口風(fēng)格、操作窗口狀態(tài),、窗口子類化,、獲取指定窗口等。

當(dāng)然,,CWnd還實(shí)現(xiàn)了其他功能:

1,、繪制窗口

GetDC()//取得客戶區(qū)顯示設(shè)備上下文

GetWindowsDC()//取得整個(gè)窗口的顯示設(shè)備上下文

ReleaseDC()

BeginPaint()

EndPaint()

PrintClient()

RedrawWindow()//重繪客戶區(qū)的某區(qū)域

2、操作窗口子控件

GetDlgItem():取得(臨時(shí)的)控件對(duì)象指針

SetDlgItemText()和GetDlgItemText():設(shè)置,、取得控件標(biāo)題

SubclassDlgItem():將控件句柄與相應(yīng)類相關(guān)聯(lián)

DlgDirList()和DlgDirListComboBox():以文件列表或目錄列表填充(組合框)列表框

CheckDlgButton()和CheckRadioButton():設(shè)置復(fù)選框(單選按鈕)狀態(tài),。

GetNextDlgTabItem():取得下一個(gè)WS_TABSTOP風(fēng)格控件

3、窗口定時(shí)器

SetTimer():設(shè)置定時(shí)器

KillTimer():銷毀定時(shí)器

4,、窗口消息的相關(guān)函數(shù)

GetCurrentMessage():取得當(dāng)前被處理的消息

PreTranslateMessage():可重載的虛函數(shù),。被UI線程的消息循環(huán)調(diào)用,可以過濾窗口收到的消息,,過濾出的消息得以分發(fā)

SendMessage():向本窗口發(fā)送消息,。不通過消息循環(huán),直接調(diào)用窗口函數(shù)處理消息,。窗口函數(shù)執(zhí)行完畢,,該函數(shù)才返回

PostMessage():向本窗口寄送消息,。將消息放入消息隊(duì)列,立即返回,。

Default():為所有的窗口消息提供默認(rèn)處理,。對(duì)無需處理的消息或希望默認(rèn)處理的消息,可以使用Default()

5,、默認(rèn)的消息處理函數(shù)

在實(shí)際的編程中,,很少調(diào)用Default(),因?yàn)獒槍?duì)大部分消息,,CWnd類已經(jīng)定義了相應(yīng)得處理函數(shù),,封裝了Default()的調(diào)用。同時(shí),,有一些特殊的消息,,如WM_SYSCOLORCHANGE,僅執(zhí)行系統(tǒng)級(jí)的處理是不夠的,,框架必須針對(duì)消息完成一些例行的操作,。

 

////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/fb89bb29ac9a74f698250a6a.html

、CFrameWnd類

在編寫文檔/視圖結(jié)構(gòu)的應(yīng)用程序時(shí),,CFrameWnd作為主窗口管理視圖和文檔對(duì)象,。視圖對(duì)象和控制條都成為CFrameWnd的子窗口,它們分享客戶區(qū),,其位置被CFrameWnd有效的安排,。

CFrameWnd的創(chuàng)建

Creage()和LoadFrame()。前者主要?jiǎng)?chuàng)建窗口,,而后者先組織參數(shù),,再調(diào)用前者。

LoadFrame()的形參簡(jiǎn)潔,,在創(chuàng)建窗口的同時(shí),,完成許多主窗體的初始化工作。

2,、管理視圖對(duì)象

視圖無非是主框架窗口的一個(gè)ID為AFX_IDW_PANE_FIRST,,帶有邊框的子窗口,由CFrameWnd封裝并創(chuàng)建的,。成員函數(shù)CFrameWnd::OnCreateClient()用于創(chuàng)建視圖窗口,,它是在該類的WM_CREATE消息處理函數(shù)中被調(diào)用的。一個(gè)主窗口可能包含多個(gè)視圖,,它們或者是通過CSplitterWnd在客戶區(qū)拆分創(chuàng)建的,,或者直接在客戶區(qū)以子窗口形式創(chuàng)建。

在主窗口創(chuàng)建后,視圖也創(chuàng)建了,,一般要調(diào)用CFrameWnd::InitialUpdateFrame()進(jìn)行初始化,該函數(shù)設(shè)置第一個(gè)視圖ID為AFX_IDW_PANE_FIRST,。

3,、管理控制條

主窗口有豐富的控制條,它們都是由CControlBar派生的,。

CFrameWnd封裝了對(duì)這些的操作,,如:

EnableDockinng();
DockControlBar();
FloatControlBar();
ShowControlBar();
SaveBarState();
LoadBarState();
GetDockState();
SetDockState();
SetMessageText();
RecalcLayout()

4、發(fā)送命令消息

命令消息是指菜單,、工具欄,、加速鍵及命令按鈕向其所在窗口發(fā)送的WM_COMMAND消息。主框架窗口通常包含應(yīng)用程序的系統(tǒng)主菜單和工具欄,,而加速鍵往往在LoadFrame()中裝入主窗口,,它們向主窗口發(fā)送命令消息。

處WM_COMMAND外,,其他以WM_開頭的消息叫窗口消息,,窗口消息與某一窗口緊密相關(guān),應(yīng)該由接收消息的窗口處理,。而命令消息往往與具體的窗口無關(guān),。

CCmdTarget類定義了一個(gè)OnCmdMsg()虛擬函數(shù),用于處理命令消息,,派生類可以重載它,。CFrameWnd就是通過重載該函數(shù)實(shí)現(xiàn)命令消息的分發(fā):首先將命令消息傳給活動(dòng)視圖,如果視圖沒有處理,,它將被傳送給關(guān)聯(lián)的文檔對(duì)象,,視圖或者文檔都沒有處理該消息時(shí),即它們沒有建立該消息的消息映射,,則由主窗口本身處理,,若主窗口沒有處理,最后嘗試應(yīng)用類,,如果還是沒有處理,,該消息就由默認(rèn)過程處理。

注意:主窗口直接調(diào)用視圖,、應(yīng)用類的OnCmdMsg()虛函數(shù)處理命令消息,,并沒有通過SendMessage()或PostMessage()將消息轉(zhuǎn)發(fā)。OnCmdMsg()僅在類中搜索消息映射表,,查找該命令的處理函數(shù),。找不到則返回。所以視圖類只有通過消息映射,才能處理主窗口轉(zhuǎn)發(fā)的命令消息,。如果使用CView::WindowProc()捕捉該類消息,,會(huì)一無所獲。

5,、必要的消息處理

為了管理控制條和視圖,,CFrameWnd為幾個(gè)窗口消息建立了消息映射,專門進(jìn)行處理,。

OnInitMenuPopup();
OnEnterIdle();
OnMenuSelect();
OnToolTipText();
OnUpdateKeyIndicator();
OnUpdateControlBarMenu();
OnSize();
OnHScroll();
OnVScroll();
OnClose();

 

////////////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/9cbd5507fe6c73c57a894751.html

CView類

1,、關(guān)聯(lián)文檔對(duì)象

一個(gè)視圖對(duì)象只關(guān)聯(lián)一個(gè)文檔對(duì)象,但一個(gè)文檔對(duì)象可以關(guān)聯(lián)多個(gè)視圖,,每個(gè)視圖對(duì)象以不同的形式表示文檔數(shù)據(jù),。

在文檔/視圖框架程序中,文檔對(duì)象總是在視圖之前建立,,而在視圖的WM_CREATE消息處理函數(shù)中,,建立了它與文檔對(duì)象的關(guān)聯(lián),m_pDocument->AddView(this),,將當(dāng)前視圖加入文檔對(duì)象的視圖列表中,,因?yàn)橐粋€(gè)文檔可關(guān)聯(lián)多個(gè)視圖。同時(shí),,視圖類定義了成員函數(shù)GetDocument(),返回文檔對(duì)象的指針,。視圖總是在文檔對(duì)象之前銷毀,在視圖析構(gòu)函數(shù)中,,與文檔對(duì)象接觸關(guān)聯(lián),,m_pDocument->RemoveView(this)。

2,、視圖的繪制

窗口繪制工作總是在WM_PAINT消息處理中進(jìn)行的,,窗口需要繪制時(shí),它會(huì)收到系統(tǒng)發(fā)來的WM_PAINT消息,。繪制過程,,我們需要準(zhǔn)備顯示設(shè)備句柄,最后要釋放句柄,。但是我們無需加載WM_PAINT消息處理函數(shù)OnPaint(),,我們只需要在OnDraw()繪制,并且OnDraw()準(zhǔn)備了一個(gè)顯示設(shè)備,,最后也無需釋放,,這些都由OnPaint()為我們準(zhǔn)備的。

OnDraw()在視圖基類CView中定義為純虛函數(shù):virtual void OnDraw(CDC* pDC) = 0;

所以CView是抽象基類,,不能實(shí)例化,,而派生類必須重載OnDraw(),。

3、虛函數(shù)virtual void OnUpdate(CView* pSender, LPARAM, CObject*)

當(dāng)文檔數(shù)據(jù)發(fā)生變化時(shí),,文檔對(duì)象調(diào)用CDocument::UpdateAllView()通知所有視圖,,視圖的OnUpdate()成員被調(diào)用。所以,,重載的OnUpdate()應(yīng)該能夠根據(jù)需要,,將文檔數(shù)據(jù)的變化反映在視圖上。而CView::OnUpdate()只是簡(jiǎn)單的使客戶區(qū)無效,,導(dǎo)致客戶區(qū)重畫。

4,、虛函數(shù)virtual void OnInitialUpdate()

在初始創(chuàng)建,、調(diào)用OnCreate()之后,或者在File|New,、File|Open命令之后被框架調(diào)用,。基類CView::OnInitalUpdate()只是簡(jiǎn)單的調(diào)用OnUpdate(),,可以重載它完成初始化工作,,但注意,它可能被多次調(diào)用,。

5,、虛函數(shù)virtual void CalcWindowRect(LPRECT lpClientRect, UNIT nAdjustType)

每當(dāng)主框架窗口的客戶區(qū)尺寸發(fā)生變化,或者控制條的位置發(fā)生變化,,需要重新排列客戶區(qū)時(shí),,調(diào)用該函數(shù),根據(jù)視圖客戶區(qū)尺寸計(jì)算視圖窗口的尺寸,。

我們知道,,排列主窗口客戶區(qū)是由CFrameWnd::RecalcLayout()完成的。顯然,,視圖的CalcWindowRect()函數(shù)也是由它觸發(fā)調(diào)用的,。主窗口的客戶區(qū)尺寸減掉所有控制條占用的都分,剩下的區(qū)域分給視圖,,這部分區(qū)域作為實(shí)參傳入CalcWindowRect(),。在CalcWindowRect()函數(shù)內(nèi),需要計(jì)算視圖窗口的尺寸,。

6,、虛函數(shù)virtual void PostNcDestroy()

在視圖窗口關(guān)閉時(shí)調(diào)用的成員函數(shù),它與CFrameWnd::PostNcDestroy完成相同的功能,,即刪除視圖對(duì)象,。

void CView::PostNcDestroy()

{delete this;}

這樣,,可以不必關(guān)心視圖的釋放工作,即使它在堆中構(gòu)造,。

7,、虛函數(shù)virtual BOOL OnCmdMsg(UINT, int, void*, AFX_CMDHANDLERINFO*)

Cview::OnCmdMsg首先查找自身的命令消息映射,若本身沒有處理該消息,,將機(jī)會(huì)留給與其關(guān)聯(lián)的文檔對(duì)象,。

8、虛函數(shù)virtual void OnActivateView(BOOL, CView*, CView*)

當(dāng)視圖被激活為活動(dòng)視圖,,或由活動(dòng)轉(zhuǎn)為非活動(dòng)時(shí),,調(diào)用該函數(shù)通知視圖。CView::OnActivateView只是實(shí)現(xiàn)設(shè)置該視圖為焦點(diǎn),。

 

//////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/24b83838f7c3d9cad4622556.html

CDialog類

對(duì)話框時(shí)通過對(duì)話框模版建立起來的,,只需要一個(gè)以模版為實(shí)參的創(chuàng)建命令,如CDialog::Create,,就可以完成對(duì)話框窗口及其子控件的創(chuàng)建工作,,所有創(chuàng)建細(xì)節(jié)都由對(duì)話框模版來指示。

模態(tài)對(duì)話框的消息循環(huán)

當(dāng)調(diào)用對(duì)話框的Domodal()成員后,,就創(chuàng)建了模態(tài)對(duì)話框,。它可以禁止它所屬的主窗口,以及該主窗口的子窗口(除了重疊窗口和普通彈出窗口),。

1,、模態(tài)對(duì)話框的創(chuàng)建和模式循環(huán)

其實(shí)“模態(tài)”不是對(duì)話框的專利,模態(tài)特性封裝與CWnd中,,如果采取與模態(tài)對(duì)話框相同的創(chuàng)建方法,,普通窗口也可以使模態(tài)的。這個(gè)方法就是在創(chuàng)建窗體后,,調(diào)用CWnd::RunModalLoop()模式循環(huán)函數(shù),。它與CWnd::Run()相似,也是一個(gè)消息循環(huán)泵,,而且CWnd::RunModalLoop()得消息處理還要復(fù)雜一些,。

CDialog::DoModal()函數(shù)的操作過程:首先AfxGetResourceHandle()和LoadResource(hInst,hResource)裝入對(duì)話框資源,在建立模版對(duì)話框之前,,::EnableWindow(hWndParent, FALSE)禁止父窗口的鼠標(biāo)和鍵盤輸入,,禁止父窗口也間接的禁止父窗口的下屬窗口,但不包括下屬的重疊窗口和普通彈出窗口,。CreateDlgIndirect(lpDialog Template, CWnd::FromHandl(hWndParent), hInst))通過資源模版創(chuàng)建對(duì)話框及其子控件,,創(chuàng)建成功后,進(jìn)入模式循環(huán)RunModalLoop(),,當(dāng)用戶選擇IDOK和IDCANCEL時(shí),,模式循環(huán)退出,,對(duì)話框?qū)⒈讳N毀。::EnableWindow(hWndParent, TRUE)恢復(fù)父窗口的工作狀態(tài),,間接地恢復(fù)其兄弟窗口,。SetActiveWindows(hWndParent)激活父窗口,DestroyWindow()銷毀該對(duì)話框,。

RunModalLoop()實(shí)現(xiàn)的消息循環(huán):這個(gè)消息循環(huán)完成UI線程消息循環(huán)(由CWinThread::Run封裝)的全部功能,,同時(shí)為處理模態(tài)窗口的特殊消息,添加了必要的處理代碼,。模態(tài)窗口建立后,,就進(jìn)入這個(gè)循環(huán),其中的消息循環(huán)泵暫時(shí)代替了UI線程的消息循環(huán)泵,,為所有窗口提取并分發(fā)信息,。但所有被禁止的窗口無法接收鼠標(biāo)和鍵盤的消息,除非使用了PostMessage()命令,。

RunModalLoop()的實(shí)現(xiàn)過程:RunModalLoop(DWORD dwFlags)形參可以使地下三個(gè)的組合:MLF_NOIDLEMSG(消息隊(duì)列空閑時(shí),不發(fā)送WM_ENTERIDLE消息給當(dāng)前主窗口)

MLF_NOKICKIDLE(消息隊(duì)列空閑時(shí),,不發(fā)送WM_KICKIDLE消息給當(dāng)前模態(tài)對(duì)話框)

MLF_SHOWONIDLE(消息隊(duì)列空閑時(shí),,刷新顯示當(dāng)前對(duì)話框(僅一次))

int CWnd::RunModalLoop(DWORD dwFlags)
{
ASSERT(::IsWindow(m_hWnd)); //窗口必須已經(jīng)創(chuàng)建且不在模式狀態(tài)

//m_nFlags值為WF_MODALLOOP標(biāo)志進(jìn)入模態(tài)

ASSERT(!(m_nFlags & WF_MODALLOOP));
// 以下變量用于Idle處理
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) &&
   !(GetStyle() & WS_VISIBLE);
HWND hWndParent = ::GetParent(m_hWnd);
m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
MSG* pMsg = &AfxGetThread()->m_msgCur;//取得存儲(chǔ)當(dāng)前消息的緩沖
//獲取和派發(fā)消息直到模式狀態(tài)結(jié)束
for (;;)
{
   ASSERT(ContinueModal());
   //第一階段,判斷是否可以進(jìn)行Idle處理
   while (bIdle &&!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
   {
    ASSERT(ContinueModal());
    //必要的話,,當(dāng)Idle時(shí)顯示對(duì)話框窗口
    if (bShowIdle)
    {
     ShowWindow(SW_SHOWNORMAL);
     UpdateWindow();
     bShowIdle = FALSE;
    }
    // 進(jìn)行Idle處理
    //必要的話發(fā)送WM_ENTERIDLE消息給父窗口
    if (!(dwFlags & MLF_NOIDLEMSG) &&hWndParent != NULL && lIdleCount == 0)
    {
     ::SendMessage(hWndParent, WM_ENTERIDLE,
      MSGF_DIALOGBOX, (LPARAM)m_hWnd);
    }
    //必要的話發(fā)送WM_KICKIDLE消息給父窗口
    if ((dwFlags & MLF_NOKICKIDLE) ||
     !SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
    {
     //終止Idle處理
     bIdle = FALSE;
    }
   }
   //第二階段,,提取并分發(fā)消息

   do
   {
    ASSERT(ContinueModal());
    // 若是WM_QUIT消息,則發(fā)送該消息到消息隊(duì)列,,返回,;否則發(fā)送消息。
    if (!AfxGetThread()->PumpMessage())
    {
     AfxPostQuitMessage(0);
     return -1;
    }
    //收到特殊消息,,是否刷新顯示該對(duì)話框窗口
    if (bShowIdle &&
     (pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
    {
     ShowWindow(SW_SHOWNORMAL);
     UpdateWindow();
     bShowIdle = FALSE;
    }
    if (!ContinueModal())//可能是關(guān)閉當(dāng)前對(duì)話框消息,,判斷是否結(jié)束模式循環(huán)
     goto ExitModal;
    //在派發(fā)了“正常 ”消息后,重新開始Idle處理
    if (AfxGetThread()->IsIdleMessage(pMsg))
    {
     bIdle = TRUE;
     lIdleCount = 0;
    }
   } while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
}
ExitModal://用戶已關(guān)閉對(duì)話框,,結(jié)束模式循環(huán),。
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
return m_nModalResult;
}

RunModalLoop()與Run()不同的是,RunModalLoop()既可以向父窗口發(fā)送WM_ENTERIDLE消息,,也可以向當(dāng)前窗口發(fā)送與空閑消息等同的WM_KICKIDLE消息,,使對(duì)話框有能力在空閑時(shí)完成一定得操作。同時(shí)允許刷新顯示對(duì)話框,。但注意CWinThread::OnIdle()在這里不被調(diào)用,。

在發(fā)送WM_KICKIDLE消息時(shí),由于它在消息泵中不被分發(fā)處理,,所有只能是用SendMessage()而不是PostMessage()發(fā)送該消息,。

2,、結(jié)束模式循環(huán)

只要在對(duì)話框中調(diào)用CDialog::EndDialog()就可以結(jié)束模式循環(huán)。結(jié)束后必須調(diào)用DestroyWindow()銷毀對(duì)話框(DoModal()退出前已經(jīng)完成),。用CDialog::Create()創(chuàng)建非模態(tài),,則必須自己調(diào)用EndDialog()和DestroyWindow()。

3,、創(chuàng)建普通的模態(tài)對(duì)話框

(1),、調(diào)用EnableWindow()禁止程序主窗口。

(2),、使用CWnd::Create()等創(chuàng)建命令,,創(chuàng)建該窗口??梢允箯棾龃翱?,也可以使重疊窗口。

(3),、調(diào)用模式循環(huán)函數(shù)RunModalLoop(DWORD dwFlags),,根據(jù)實(shí)際需要設(shè)置實(shí)參,如果需要空閑處理,,還須手工添加消息映射,。

(4)、當(dāng)關(guān)閉窗口時(shí),,調(diào)用EndModalLoop(int nResult),,根據(jù)實(shí)際需要結(jié)束代碼。

(5),、激活主窗口,,調(diào)用DestroyWindow()摧毀當(dāng)前模態(tài)窗口。一定要確保窗口銷毀前已經(jīng)結(jié)束了模式循環(huán),。

 

//////////////////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/79988df3fe53edc30b46e05c.html

對(duì)話框的命令消息路由

如果一個(gè)對(duì)話框(無論是彈出和重疊,,不分模態(tài)與非模態(tài))的父窗口是主框架或視圖,該對(duì)話框的菜單命令就可以在對(duì)個(gè)對(duì)象中處理,,它的處理路由是:對(duì)話框->視圖->文檔對(duì)象->主框架->應(yīng)用類,。一旦命令消息被處理,將不再繼續(xù)傳遞,。

首先搜尋該對(duì)象的消息映射,,若該對(duì)象沒有處理這個(gè)命令消息,則若命令I(lǐng)D在[0x8000,0xF000]范圍內(nèi),,則向下傳遞,,否則終止處理。(命令I(lǐng)D在[0x8000,0xF000]:全局命令,,包括菜單,、加速鍵,、系統(tǒng)命令等;命令范圍在[0xF000,0xFFFF]:Windows系統(tǒng)命令(不被傳遞)),。若是命令I(lǐng)D在[0x8000,0xF000]范圍內(nèi),,則傳遞給父窗口,有父窗口負(fù)責(zé)命令路由,。如果父窗口也沒有處理,,則將它交給應(yīng)用類,在父窗口不是主框架窗口時(shí),,傳給應(yīng)用類是有意義的,。

如果父窗口不是主框架,應(yīng)用類得到最后的處理機(jī)會(huì),;如果父窗口是主框架,,最后應(yīng)用類(UI線程)的代碼是多余的。若父窗口是視圖,,而視圖是主框架的子窗口,,而對(duì)話框時(shí)彈出或重疊窗口,所以不能被視圖控制,,而最終由主框架接管,。

疑問:為什么說“對(duì)話框的父窗口是視圖,而視圖是主框架的子窗口,,而對(duì)話框時(shí)彈出或重疊窗口,,所以不能被視圖控制,,而最終由主框架接管,。”,?疑問中……

 

////////////////////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/8cd26af82ef8c707d8f9fd37.html

1,、檢索窗口

1、1根據(jù)標(biāo)題和窗口類查找窗口

CWnd類的靜態(tài)函數(shù)FindWindow()或者同名的API函數(shù),,只要是重疊或彈出窗口,,都可以用該函數(shù)查找窗口。

HWND FindWindow(LPCTSTR lpClassName, //目標(biāo)窗口的窗口類名稱

LPCTSTR lpWindowName//目標(biāo)窗口的窗口標(biāo)題名稱);

1,、2根據(jù)窗口的相對(duì)位置或所屬關(guān)系查找窗口

API函數(shù)GetWindow()可以用于枚舉所有窗口,。

HWND GetGetWindow(HWND hWnd,//作為參照物的窗口句柄

UINT nCmd//目標(biāo)窗口與參照窗口的位置關(guān)系)

這樣,,將FindWindow()與GetWindow()結(jié)合使用,,前者查到符合條件的Z-Order順序最高的窗口,后者以這個(gè)窗口為起點(diǎn),,反復(fù)枚舉當(dāng)前所得句柄的下一個(gè)窗口,,就可以得到所有符合條件的窗口了,。

 

/////////////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/694f73d3a320a0d7a9ec9ac8.html

CWnd類封裝了兩個(gè)函數(shù):GetClientRect()和GetWindowRect(),分別用于返回窗口的屏幕坐標(biāo)和客戶區(qū)坐標(biāo)的矩形區(qū)域,。ScreenToClient()和ClientToScreen(),,用于屏幕坐標(biāo)與客戶區(qū)坐標(biāo)之間的轉(zhuǎn)換。以上的四個(gè)函數(shù)都是通過封裝同名API實(shí)現(xiàn),。

對(duì)于彈出窗口和重疊窗口,,GetClientRect()和GetWindowRect()取得的rect尺寸是不相等的,因?yàn)榭蛻魠^(qū)不包括標(biāo)題欄,、邊框等區(qū)域,;如果是子窗口,則取得的rect尺寸相等,,因?yàn)樽哟翱谝话阒挥锌蛻魠^(qū),。

 

//////////////////////////////////////////////////////////

http://hi.baidu.com/xiaorida21/blog/item/386c038bd80519dbfd1f10de.html

一、windows窗口之間的關(guān)系包括所有與被所有關(guān)系,,父子關(guān)系等,。

操作系統(tǒng)為每個(gè)窗口實(shí)例都分配一個(gè)內(nèi)存空間,該空間被稱為窗口實(shí)例的信息結(jié)構(gòu),。該結(jié)構(gòu)包含了窗口實(shí)例的所有信息,,其中有四個(gè)窗口句柄:1、本窗口實(shí)例的Z_Order順序最高的子窗口句柄,;2,、本窗口實(shí)例的下一個(gè)兄弟窗口的句柄(子窗口之間稱為兄弟窗口);3,、本窗口實(shí)例的父窗口句柄,;4、本窗口實(shí)例的所有者窗口句柄,。

二,、桌面窗口(第一層窗口)

windows初始化時(shí),首先創(chuàng)建一個(gè)桌面窗口,,其他所有窗口都顯示在其上,。::GetDesktopWindow()可以取得桌面窗口的句柄。桌面窗口位于系統(tǒng)窗口層次的最上層,。

三,、頂級(jí)窗口(第二層窗口)

它沒有被設(shè)置為WS_CHILD風(fēng)格的窗口,但它是桌面的子窗口,。雖然頂級(jí)窗口之間存在兄弟關(guān)系,,但它們之間可以建立一種所有與被所有的關(guān)系(所有者窗口和受控窗口)。受控窗口位于所有者窗口前段,即它的Z_Order順序可以被所有者窗口被激活而提高,。所有者窗口最小化時(shí),,受控窗口被隱藏。當(dāng)使用CreateWindow()和CreateWindowEx()創(chuàng)建一個(gè)頂級(jí)窗口時(shí),,參數(shù)hWndParent決定所有者窗口,,若hWndParent為子窗口,則由系統(tǒng)搜索該子窗口的上級(jí)窗口,,直到找到最近的頂級(jí)窗口,,作為被創(chuàng)建窗口的所有者。

四,、子窗口(第三層及其以下窗口)

子窗口以同樣的方式和父窗口連接,。決定頂級(jí)窗口之間的Z_Order順序的規(guī)則,同樣適合子窗口之間,,即由擴(kuò)展風(fēng)格WS_EX_TOPMOST和窗口激活的先后順序共同決定,。

五、重疊窗口與彈出窗口的區(qū)別

它們都是頂級(jí)窗口,。前者總有標(biāo)題欄和邊框,,并且總是自動(dòng)設(shè)置WS_CLIPSIBLINGS風(fēng)格。調(diào)用CreateWindow()和CreateWindowEx()創(chuàng)建重疊窗口時(shí),,可以指定默認(rèn)的窗口尺寸參數(shù),,即CW_USEDEFAULT,由系統(tǒng)設(shè)置窗口的初始尺寸,。彈出窗口同樣自動(dòng)設(shè)置WS_CLIPSIBLINGS風(fēng)格,,但其他風(fēng)格必須專門指定,不可以使用CW_USEDEFAULT作為初始尺寸,。

文檔信息

作者:一個(gè)農(nóng)夫 ( www.cnblogs.com/afarmer )

鏈接:http://www.cnblogs.com/afarmer/archive/2011/05/06/2038974.html

歡迎轉(zhuǎn)載,,請(qǐng)保留文檔信息。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多