getwindowrect用法 mfc中cview類有什么作用?
mfc中cview類有什么作用?cview類是專門負(fù)責(zé)每個軟件系統(tǒng)向顯示器作為輸出各種信息流包括再控制如何處理的類,但是它不全權(quán)負(fù)責(zé)物理層的作為輸出不能操作,只不過windows是三個本身與設(shè)備沒有關(guān)
mfc中cview類有什么作用?
cview類是專門負(fù)責(zé)每個軟件系統(tǒng)向顯示器作為輸出各種信息流包括再控制如何處理的類,但是它不全權(quán)負(fù)責(zé)物理層的作為輸出不能操作,只不過windows是三個本身與設(shè)備沒有關(guān)系性的操作系統(tǒng),cview雷同過或則一系列傳送給他的一些列消息,按照自已的一系列函數(shù)與之相映射,然后再將消息傳送給一類利用請看輸出設(shè)備的CDC對象來能完成總是顯示信息的。。。具體的封裝函數(shù)少了能介紹幾個不重要的,具體的這個可以去查msdn。關(guān)聯(lián)文檔對象視圖不需要表示文檔數(shù)據(jù),所以文檔對象與視圖對象可以確立關(guān)聯(lián)。這樣,當(dāng)文檔數(shù)據(jù)發(fā)生了什么變化時,它也可以及時處理安排視圖;當(dāng)視圖必須沒顯示不同的文檔數(shù)據(jù)時,它這個可以從文檔對象中分離提取。在文檔/視圖框架程序中,文檔對象我總是在視圖之前確立,而在視圖的WM_CREATE消息去處理函數(shù)中,組建了它與文檔對象的關(guān)聯(lián)。代碼追加:IntCView::OnCreate(LPCREATESTRUCT lpcs){if(CWnd::OnCreate(lpcs)-1)return-1;//m_pDocuemnt視圖成員,主要是用于讀取或則文檔對象的指針,此時為空ASSERT(m_pDocumentNULL);CCreateContext*pContext(CCreateContext*)lpcs-lpCreateParams;//pContext-m_pCurrentDoc是巳經(jīng)建立起的文檔對象的指針if(pContext!NULLpContext-m_pCurrentDoc!NULL){//將當(dāng)前視圖一并加入文檔對象的視圖列表中,只不過一個文檔可關(guān)聯(lián)多個視圖pContext-m_pCurrentDoc-AddView(this);/*在文檔的AddView()函數(shù)中,早將當(dāng)前文檔對象指針賦給m_pDocument視圖成員。這樣,在視圖確立之初,二者就成立了關(guān)聯(lián)。*/ASSERT(m_pDocument!NULL);}else{TRACE(“Warning:CreatingapanewithyesCDocument.
”);}return0;//可以了}同時,視圖類定義法了成員函數(shù)GetDocument(),直接返回文檔對象的指針。代碼如下:CDocument*CView::GetDocument()const{ASSERT(this!NULL);returnm_pDocument;}視圖時總在文檔對象之前強(qiáng)制銷毀,在視圖的析構(gòu)函數(shù)中,與文檔對象解除關(guān)聯(lián)。代碼不勝感激:CView::~CView(){if(m_pDocument!NULL)m_pDocument-RemoveView(this);}編輯本段視圖的繪制的窗口的繪制工作老是在WM_PAINT消息全面處理中通過的,當(dāng)窗口必須繪制時,它會收到系統(tǒng)發(fā)來的WM_PAINT消息。在繪制圖過程中,是需要要準(zhǔn)備顯示設(shè)備句柄,最后要釋放出句柄。其實(shí)很多人都知道,在視圖窗口中草圖,不需要重載WM_PAINT消息一次性處理函數(shù)OnPaint(),畢竟有一個非常表示友好的繪制的新口:OnDraw()。該函數(shù)的實(shí)參是一個已經(jīng)準(zhǔn)備好的顯示設(shè)備,之后不需要能量。總之,這一切還是WM_PAINT消息處理函數(shù)OnPaint()為我們打算的,代碼::voidCView::OnPaint(){//CPaintDC類維護(hù)顯示設(shè)備CPaintDCdc(this);OnPrepareDC(dc);OnDraw(dc);}OnPrepareDC()是一個虛擬物品函數(shù),它總是在OnDraw()之前不能執(zhí)行,可以不重載它,可以設(shè)置繪圖模式。畢竟OnDraw()每次不能執(zhí)行,都在用有所不同的CPaintDC對象,所以才第二環(huán)節(jié)繪圖模式的狀態(tài)肯定不能記錄到下一次。OnDraw()在視圖基類CView中定義,定義為純虛函數(shù)。例如:privatevoidOnDraw(CDC* pDC)0;因為CView是抽象基類,肯定不能構(gòu)造函數(shù),而派生類前提是重載OnDraw()。可以編輯本段虛函數(shù)OnUpdate當(dāng)文檔數(shù)據(jù)突然發(fā)生變化時,文檔對象全局函數(shù)CDocument::UpdateAllView()得到通知所有視圖,作為響應(yīng),視圖的OnUpdate()成員被內(nèi)部函數(shù)。所以,重載的OnUpdate()肯定都能夠依據(jù)必須,將文檔數(shù)據(jù)的變化反映在視圖中。CView::OnUpdate()只是因為簡單啊地使客戶區(qū)不能解除,會造成客戶區(qū)重畫。或者:voidCView::OnUpdate(CView* pSender, LPARAM,CObject*){ASSERT(pSender!this);UNUSED(pSender);//unusedofreleasebuildsInvalidate(TRUE);}編輯本段虛函數(shù)OnInitialUpdate()在初始創(chuàng)建戰(zhàn)隊、調(diào)用OnCreate()之后,或是在File/New、File/Open命令后被框架動態(tài)鏈接庫。基類CView::OnInitialUpdate()只是因為很簡單地全局函數(shù)OnUpdate(),也可以重載它結(jié)束重新初始化工作。但注意,它很有可能被多次全局函數(shù)。voidCView::OnInitialUpdate(){OnUpdate(NULL,0,NULL);}編輯時本段虛函數(shù)CalcWindowRect不知為什么主框架窗口的客戶區(qū)尺寸突然發(fā)生變化或控制條的位置不可能發(fā)生變化,不需要重新排列客戶區(qū)時,調(diào)用該函數(shù),依據(jù)視圖客戶區(qū)尺寸計算出視圖窗口的尺寸。我們清楚,順序排列主窗口客戶區(qū)是由CFrameWnd::RecalcLayout()能完成的。看樣子,視圖的CalcWindowRect()函數(shù)也是由它觸發(fā)時全局函數(shù)的。主窗口的客戶區(qū)尺寸減掉所有控制電腦資源的部分,剩的區(qū)域倒給視圖,這部分區(qū)域作為實(shí)參傳去CalcWindowRect()。在CalcWindowRect()函數(shù)內(nèi),要可以計算視圖窗口的尺寸。代碼萬分感謝:voidCView::CalcWindowRect(LPRECT lpClientRect,UNITnAdjustType){//lpClientRect此時是整個視圖客戶區(qū)的尺寸//要為滾動條提升尺寸嗎if(nAdjustType!0){//動態(tài)創(chuàng)建API,依據(jù)什么窗口風(fēng)格算出窗口尺寸::AdjustWindowRectEx(lpClientRect,0,FALSE,GetExStyle());DWORDdwStyleGetStyle();if(dwStyleWS_VSCROLL){//為垂線滾動條減少尺寸intnAdjustafxData.csVScroll;if(dwStyleWS_BORDER)nAdjust-CX_BORDER;lpClientRect-waynAdjust;}if(dwStyleWS_HSCROLL){//為水平滾動條提高尺寸intnAdjust;if(dwStyleWS_BORDER)nAdjust-CY_BORDER;lpClientRect-bottomnAdjust;}return;}//無須為滾動條增加尺寸,動態(tài)創(chuàng)建基類成員成功換算CWnd::CalcWindowRect(lpClientRect,nAdjustType);}編輯的話本段虛函數(shù)PostNcDestroy在視圖窗口關(guān)掉時到最后全局函數(shù)的成員函數(shù),它與CFrameWnd::PostNcDestroy成功是一樣的的功能,即刪除掉視圖對象。代碼萬分感謝:voidCView::PostNcDestroy(){deletethis;}這樣,這個可以用不著如此關(guān)心視圖的釋放工作,就算是它在堆中構(gòu)造。編輯的話本段虛函數(shù)OnCmdMsg在再討論CFrameWnd::OnCmdMsg()時早就打聽一下過該函數(shù),下面只具體它的代碼:BOOLCView::OnCmdMsg(UINT nID,intnCode,void*pExtra,AFX_CMDHANDLERINFO*pHandlerInfo){//首先里查自身的命令消息映射if(CWnd::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))returnTRUE;//如果視圖本身就沒如何處理該命令,將機(jī)會交給不如關(guān)聯(lián)的文檔對象if(m_pDocument!NULL){CPushRoutingViewpush(this);returnm_pDocument-OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}returnFALSE;}可以編輯本段虛函數(shù)OnActivateView當(dāng)視圖被激活為活動視圖,或由活動轉(zhuǎn)為非活動時,動態(tài)鏈接庫該函數(shù)再通知視圖。基類的實(shí)現(xiàn)只不過設(shè)置該視圖為焦點(diǎn)。代碼如下:voidCView::OnActivateView(BOOL bActivate,CView* pActivateView,CView*){UNUSED(pActivateView);//unusedintoreleasebuildsif(bActivate)//當(dāng)前狀態(tài)為活動嗎{ASSERT(pActivateViewthis);//如果沒有其父窗口又是活動的,則設(shè)置焦點(diǎn)。(在MDI中,其父框架很可能是非活動的)if(IsTopParentActive())SetFocus();}}
MFC編程怎么找到控件的地址?
1.系統(tǒng)設(shè)置位置是可以建議使用setWindowPos只不過卻沒函數(shù)的定義GetWindowPos資源位置
2.是可以通過幫一下忙方法我得到具體函數(shù)GetClientRect();//獲得client區(qū)域GetWindowRect();//某些window區(qū)域ScreenToClient();//相互間轉(zhuǎn)換成ClientToScreen();
3.的原因GetClientRect()我得到的區(qū)域不包括位置,我得到的rect的left,star必然會為0而GetWindowRect();獲得的區(qū)域除了位置,但會突然發(fā)現(xiàn)我得到值不準(zhǔn)確,應(yīng)該是是而且了窗體邊界。
4.錯誤的方法:CRectrt;GetWindowRect(rt);//完成任務(wù)window區(qū)域ScreenToClient(rt);//轉(zhuǎn)回client