VC 介面程式設計之 陰影視窗的實現詳解

2022-05-04 18:51:10 字數 2971 閱讀 5009

**:

對於我們這些控制項狂來說,視窗陰影也是乙個必不可少的實現需求。雖說其沒多大用,但對於增加視窗立體感來說,那是挺有幫助的。

我實現了乙個類似於360介面的陰影效果,其可以支援正常視窗,也支援半透明視窗。

陰影視窗對於正常視窗和半透明視窗,有區別麼?且讓我慢慢寫來:)

陰影視窗的實現原理,簡單來講:就是在主視窗建立時,建立乙個子視窗,吸附於主視窗的底部。然後在子視窗上做乙個帶半透明陰影效果的描繪。

以下**是陰影視窗在父視窗的建立**,是不是很簡單?

[html]view plain

copy

lresult oninitdialog(uint /*umsg*/, wparam /*wparam*/, lparam /*lparam*/, bool& /*bhandled*/)  

下面是陰影視窗實現步驟:

1. 在陰影視窗建立時,只設定陰影視窗的樣式為ws_visible,我們這裡不能用ws_child,否則陰影視窗就跑到主視窗裡面去了。

[cpp]view plain

copy

// create shadow window.  

hwnd create(const hwnd wndparent)  

2. 在陰影視窗執行wm_create訊息時,修改其樣式為ws_ex_layered | ws_ex_transparent,注意這兩個樣式都要要。ws_ex_transparent是讓視窗無法接收點選訊息,你總不想你的視窗陰影可以被使用者點選且啟用吧:)

[cpp]view plain

copy

setwindowlong(gwl_exstyle, getwindowlong(gwl_exstyle) | ws_ex_layered | ws_ex_transparent);  

modifystyleex(ws_ex_topmost, ws_ex_noactivate);  

3. 與此同時,陰影視窗註冊父視窗的訊息處理**函式,此舉是為了獲取父視窗的移動、重繪和隱藏等重要訊息。因為陰影視窗要跟隨著父視窗的狀態改變而改變。

[cpp]view plain

copy

// set parent window original processing.  

m_oriparentproc = ::getwindowlong(m_hparentwnd, gwl_wndproc);  

::setwindowlong(m_hparentwnd, gwl_wndproc, (long)parentproc);  

**函式要做的事情很簡單,吸附于父視窗之下,像個小尾巴一樣:

[cpp]view plain

copy

// get parent message.  

static lresult callback parentproc(hwnd hwnd, uint umsg, wparam wparam, lparam lparam)  

break;  

}  case wm_destroy:  

case wm_ncdestroy:  

case wm_showwindow:  

else  

break;  

}  default:  

}  return pdefproc(hwnd, umsg, wparam, lparam);  

}  好了,視窗訊息機制處理完了,就要處理陰影畫法了,我這裡用的是gdi+的畫法,如果有童鞋覺得效果不夠好,可以嘗試多改改引數配置,以達到理想效果:

[cpp]view plain

copy

// create shadow brush.  

pathgradientbrush brshadow(m_shadowpath.m_ppath);  

color clrshadow[3] = ;  

int ncount = 3;  

real szpos[3] = ;  

brshadow.setinterpolationcolors(clrshadow, szpos, ncount);  

// draw shadow.  

rcshadow.width  = rcshadow.width - m_nshadowsize - m_nblankarea;  

rcshadow.height = rcshadow.height - m_nshadowsize - m_nblankarea;  

graphics.excludeclip(rcshadow);  

graphics.fillpath(&brshadow, m_shadowpath.m_ppath);  

注意我這裡排除了一部分的陰影部分,那是為透明視窗製作的,排除的效果圖如下,陰影視窗只顯示在矩形的右下角,而其他地方是透明的。

如果我不排除一部分陰影區域,那麼透明的視窗效果將變得很難看,如下圖,透明背景被陰影遮蓋了,這顯然不符合美學的要求。

如果你的視窗的角是橢圓的,你可能還需要增寬陰影的顯示區域,那麼可以用如下函式進行陰影的寬度增長:

[cpp]view plain

copy

// set blank area right position.  

void setrightoffsetarea(const int nrightpos)  

}  

VC動畫視窗的實現

函式功能 該函式 能在顯示與隱藏視窗時能產生特殊的效果。有兩種型別的動畫效果 滾動動畫和滑動動畫。函式原型 bool animatewindow hwnd hwnd,dword dwtime,dword dwflags 引數 hwnd 指定產生動畫的視窗的控制代碼。dwtime 指明動畫持續的時間 ...

全面剖析C 介面程式設計之實現介面 (2)

重新實現介面 我們已經介紹過,派生類可以對基類中已經定義的成員方法進行過載。類似的概念引入到類對介面 的實現中來,叫做介面的重實現 re implementation 繼承了介面實現的類可以對介面進行重實現。這個介面要求是在類定義的基類列表中出 現過的。對介面的重實現也必須嚴格地遵守首次實現介面的規...

VC中如何實現視窗的隱藏

vc中如何實現視窗的隱藏 用mfc做的dialog based 程式只要在oninitdialog 函式裡面寫如下 就能實現視窗隱藏 setwindowpos cwnd wndnotopmost,0,0,0,0,swp hidewindow 但是在任務管理器中還能看到 將上述 寫入乙個按紐的clic...