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