MFC 懸浮視窗

2022-07-19 04:00:13 字數 2823 閱讀 7785

使用vs2008+sp1建立懸浮視窗的步驟: (自己寫的文件, 以備以後使用)

1. 建立懸浮視窗類

每乙個懸浮視窗都是乙個cdockablepane的派生類的物件, 因此要為每乙個懸浮視窗建立乙個新類

1.1 新增類

通過選單project->add class...或者在類檢視中工程名字處右鍵選擇add->class...新增類

選擇mfc class, 點add按鈕進入下一步

class name處寫入新類的名字, 這裡用cdock, 選擇base class為cdockablepane

按finish按鈕, 新增類完成.

1.2 新增訊息處理函式

一般至少要處理兩個訊息, 乙個是wm_create, 乙個是wm_size, 具體步驟為:

(1) 標頭檔案中新增函式宣告(函式名及引數不可寫錯)

protected:

afx_msg int oncreate(lpcreatestruct lpcreatestruct);

afx_msg void onsize(uint ntype, int cx, int cy);

(2) cpp檔案中新增訊息對映

begin_message_map(cdock, cdockablepane)

on_wm_create()

on_wm_size()

end_message_map()

這裡begin_message_map和end_message_map巨集都是自動生成的, 只需要新增中間兩行**即可

(3) 新增函式實現部分

int cdock::oncreate(lpcreatestruct lpcreatestruct)

void cdock::onsize(uint ntype, int cx, int cy)

1.3 新增控制項

現在建立的cdock類中由於沒有任何控制項, 因此如果現在建立該類的物件並顯示, 該區域中由於全是垃圾資料, 故可能該視窗顯示時為花屏. 如果程式執行期間出現類似花屏的問題, 大概會有幾種可能性: 1. 沒有建立控制項 2. 已建立控制項, 但控制項位置不對或未覆蓋整個的dockablepane 3. 控制項雖然佔據整個區域, 但不能自動重新整理

這裡以新增乙個listbox為例:

(1) 在類的標頭檔案中新增控制項物件, **為:

protected:

clistbox _listbox;

(2) 在oncreate()中新增建立控制項視窗的**:

這裡必須要注意, 需要先呼叫基類的函式oncreate()

int cdock1::oncreate(lpcreatestruct lpcreatestruct)

return 0;

}

(3) 在onsize中設定各個控制項的位置

這裡要注意的是, 需要將控制項布滿整個視窗. 這裡只有乙個listbox, 故可以直接用listbox覆蓋視窗.

同理, 必須要先呼叫基類函式cdockablepane::onsize(ntype, cx, cy)

void cdock::onsize(uint ntype, int cx, int cy)

if (_listbox.getsafehwnd() != null)

2. 在程式中新增懸浮視窗物件

上面一步只是給工程新增了乙個懸浮視窗類, 但並沒生成該類的例項. 這裡建立該例項(在cmainframe類中)

2.1 在主框架類宣告中新增物件, **為:

protected: 

cdock m_wnddock;

2.2 建立dockablepane的視窗, 在主框架的oncreate()函式中

(注: 這裡我建議在oncreate函式中自動生成**enableautohidepanes(cbrs_align_any)的後面新增)

int cmainframe::oncreate(lpcreatestruct lpcreatestruct)

...

}2.3 給懸浮視窗新增icon, 暫時省略.

3. 設定視窗懸浮方式, 令視窗懸浮

3.1 設定視窗懸浮位置

這部分**也應該在mainframe類的oncreate函式中, 而且緊跟建立懸浮視窗的後面.

設定懸浮位置只需要呼叫cdockablepane::enabledocking即可

m_wnddock.enabledocking(cbrs_align_any);

其中, 引數可以是cbrs_align_top, cbrs_align_right, cbrs_align_bottom, cbrs_align_any

3.2 令視窗懸浮

欲使乙個cdockablepane物件懸浮, 只需要呼叫框架類的dockpane函式即可:

dockpane(&m_wnddock);

但是若有另外乙個懸浮視窗的物件需要和m_wnddock在一起顯示, 構成乙個組(就像vs的資源視力和類檢視), 那麼第二個懸浮視窗需要使用cdockablepane類的attchtotabwnd函式, **如下:

dockpane(&m_wnddock);

cdockablepane *ptabbedbar = null;

m_wnddock2.attachtotabwnd(&m_wnddock, dm_show, false, &ptabbedbar);

MFC模擬360懸浮窗加速球視窗

實現類似360懸浮視窗這樣的效果,當視窗在螢幕邊緣時,滑鼠移開,就自動向邊緣隱藏,滑鼠放上去,就又平滑顯示出來。正常狀態 邊緣自動隱藏 mfc實現不規則視窗 然後需要給沒有標題欄的視窗增加拖拽移動的功能,這個就是自己手動傳送乙個訊息,使windows認為滑鼠在標題條上 對於視窗的移動顯示隱藏,使用了...

桌面懸浮視窗(可拖動)

一 開發前原理簡述 桌面懸浮視窗,如360的清理加速等懸浮按鈕 呼叫windowmanager,並設定windowmanager.layoutparams的相關屬性,通過windowmanager的addview方法建立view,這樣產生出來的view根據windowmanager.layoutpa...

Qt建立停靠懸浮視窗

1.qt實現視窗停靠和懸浮使用類qdockwidget,它有兩個重要方法用來設定停靠特性以及停靠區域,dw1 setfeatures qdockwidget dockwidgetmovable qdockwidget dockwidgetclosable 設定停靠視窗特性,可移動,可關閉dw1 se...