在MDI視窗中防止子視窗閃爍

2021-03-31 08:56:28 字數 1137 閱讀 6161

解決的方法:

1、過載precreatewindow,此方法能夠解決上述前兩種情況的閃爍問題:

bool cchildframe::precreatewindow(createstruct& cs)

2、第3個問題的方法是處理mainframe的mdi client區域,mainframe(cmdiframewnd)的的mdi client視窗控制代碼儲存在成員變數m_hwndmdiclient中,只需要在呼叫showcontrolbar之前將該視窗的更新鎖定,呼叫完showcontrolbar後再恢復更新即可消除閃爍,方法可以解決所有子視窗改變引起的閃爍,例子如下:

// 切換顯示左邊的面板

void cmainframe::toggleleftpane(ccontrolbar & pbar)

呼叫mdiactivate切換子視窗引起的閃爍同樣可以解決,但只需要用setredraw即可,

......

::sendmessage(m_hwndmdiclient, wm_setredraw, false, 0l);

mdiactivate( ptmpchild );

::sendmessage(m_hwndmdiclient, wm_setredraw, true, 0l);

::redrawwindow(m_hwndmdiclient, null, null,

rdw_updatenow | rdw_allchildren | rdw_invalidate);//強制重繪,包括子視窗

......

至於原理,我認為是封裝的緣故,為了保證視窗的內容的更新,重繪的操作時時在發生,如果重繪不夠快且每個視窗都在重繪的話,閃爍就產生了,所以適當的時候禁止視窗重繪,適當的時候再恢復,就可以解決問題。

不過總是在操作視窗之前鎖定更新,操作之後又恢復更新麻煩了一點,似乎應該能夠找到兩個合適的位置來放置這兩句話,起到一勞永逸的效果。對於第三種情況,可以簡單地通過子類化m_hwndmdiclient,在wm_windowposchanging和wm_windowposchanged的訊息響應處理過程中分別鎖定更新和恢復更新來實現,但

在前兩種情況下,視窗重繪時涉及兩個視窗,就比較麻煩了。

C 防止WebBrowser在新視窗中開啟連結頁面

在日常的開發中,大家有時需要用webbrowser載入url,來實現某些功能。而這時,我們就不希望所開啟的頁面中的連結,在新視窗中開啟,因為這樣的話,實際上是用系統預設的瀏覽器開啟了,從而脫離了你的webbrowser,也就不能被你所控制了。要解決這個問題,可以使用下面的方法 假設webbrowse...

C 防止WebBrowser在新視窗中開啟連結頁面

在日常的開發中,大家有時需要用webbrowser載入url,來實現某些功能。而這時,我們就不希望所開啟的頁面中的連結,在新視窗中開啟,因為這樣的話,實際上是用系統預設的瀏覽器開啟了,從而脫離了你的webbrowser,也就不能被你所控制了。要解決這個問題,可以使用下面的方法 假設webbrowse...

怎麼在框架視窗中退出

下面的 列出了window物件某些屬性的相關資訊。屬性方法 描述opener open opener 屬性僅在使用window.open 方法開啟的頁面中可用。parent,top 無parent 和 top 屬性對frame或iframe內開啟的視窗可用。這兩個屬性分別返回立即父視窗和最上層的祖先...

MFC在子視窗中輸入資料在其他視窗中的資料傳輸

第一種方法 子視窗中將輸入資料儲存在建立的檔案中,在其他視窗讀取檔案內容 第二種方法 子視窗標頭檔案中加入 cstring inputaccount 子視窗.cpp檔案函式dodataexchange中加入 ddx text pdx,idc combo1,inputaccount 將控制元件輸入資料...

C 在子視窗中呼叫父視窗的方法

基本思想 1.c 中的每個form 窗體 都是class 類 2.每個form都有一個mdiparent 屬性 設定或者獲取此窗體的當前多文件介面 mdi 的父窗體 具體實現 本例假設在父窗體 窗體類名 main 上有一個方法setmainmenu 子窗體要呼叫該方法。1 父視窗定義setmainm...