視窗陰影效果

2022-09-16 20:42:18 字數 2574 閱讀 5621

win7系統中可以在設定視窗底部有陰影效果,這樣使得視窗看起來更有立體感。如果我們自定義視窗,沒有用到系統預設的邊框,這時陰影效果也隨著沒有了。我們需要在這樣的視窗上加上陰影效果。

1)建立乙個ws_ex_transparent樣式的視窗,該類視窗具有滑鼠穿透的效果(這樣的效果也可以用setwindowrgn實現,但是我們這裡比較特殊,只能使用前者)。

2)將視窗繪製成陰影,這個可以用gdi+來實現。

3)跟隨目標視窗,這裡需要處理這些訊息:show、hide、minimize、maximize、paint、resize。這裡採用的做法是hook目標視窗的視窗處理函式。這比編寫**是接受目標視窗傳送來的訊息更加方便,而且對於目標視窗來說陰影視窗是透明的。

1)首先在視窗類中加入我們定義的陰影類物件:

cshadowwndbase m_shadowwnd;

2)我們在oncreate(oninitdlg)中將目標視窗的視窗控制代碼傳給陰影視窗類物件,然後建立陰影視窗:

陰影視窗建立過程還有乙個工作要做,就是要hook目標視窗的視窗處理函式,注意這裡需要儲存原來目標視窗的處理函式位址,因為我們會在新處理函式中呼叫舊函式

int cshadowwndbase::oncreate(lpcreatestruct lpcreatestruct)

3)這裡還有一些問題,新處理函式是靜態函式,無法訪問非靜態成員變數;另外還要考慮到另外的情況,可能同一程序中有多個視窗使用了陰影視窗類,我們也需要記錄目標視窗和陰影視窗的對應關係。只需要定義乙個類靜態變數(其作用在這裡就相當於乙個全域性變數):

static std::mapm_szshadowwindows;

4)這樣對於目標視窗的一些訊息就可以直接處理,然後再傳給預設函式。下面是新處理函式:

lresult callback cshadowwndbase::shadowproc( hwnd hwnd, uint umsg, wparam wparam, lparam lparam )

break;

}case wm_destroy:

case wm_ncdestroy:

case wm_showwindow:

else

break;

}default:

break;

}return pdefproc(hwnd, umsg, wparam, lparam);//注意最後將訊息都給原來的處理函式,讓其保持原狀(至少是外表上的)。

}5)視窗在檢測到目標視窗尺寸或位置改變時需要相應的改變:

void cshadowwndbase::adjustwindowpos()

}6)利用gdi+繪製陰影效果:

void cshadowwndbase::drawshadow()

;int ncount = 2;

real szpos = ;

brshadow.setinterpolationcolors(clrshadow, szpos, ncount);

brshadow.setfocusscales((real)(rcshadow.width-6*m_nshadowsize)/(rcshadow.width), (real)(rcshadow.height-6*m_nshadowsize)/(rcshadow.height));

// draw shadow.

rcshadow.inflate(-m_nshadowsize-6,-m_nshadowsize-6);

graphics.excludeclip(rcshadow);

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

// update layered window.

hbitmap hbitmap;

m_pbitmap.gethbitmap((argb)color::black, &hbitmap);

cbitmap bitmap;

bitmap.attach(hbitmap);

cclientdc dc(this);

cdc dccompat;

dccompat.attach(::createcompatibledc(null));

dccompat.selectobject(bitmap);

bitmap bmpinfo = ;

bitmap.getbitmap(&bmpinfo);

csize size(bmpinfo.bmwidth, bmpinfo.bmheight);

crect rcwindow;

getwindowrect(&rcwindow);

blendfunction bf = ;

cpoint ptwnd(rcwindow.left, rcwindow.top);

cpoint ptsource(0, 0);

::updatelayeredwindow(m_hwnd, dc.m_hdc, &ptwnd, &size,

dccompat.m_hdc, &ptsource, 0, &bf, ulw_alpha);

}

Qt設定彈出視窗背景陰影效果

通過maskwidget來實現,原理如下 1.設定要遮擋的窗體 一般是主視窗 2.設定目標視窗,並繫結該視窗的顯示事件,一旦目標顯示,陰影視窗就顯示 反則同樣 3.完成陰影效果。據觀察存在一定問題,目標視窗的父視窗問題,工作列會有兩個視窗圖示如 直接插入 maskwidget.h ifndef ma...

文字陰影效果

關於android文字陰影,共有四個屬性可以設定 android shadowcolor 陰影顏色 android shadowdx 陰影x方向位移 android shadowdy 陰影y方向位移 android shadowradius 陰影的半徑 注意 陰影的半徑必須設,為0時沒有效果。下面為...

Qt陰影效果

1.widget.h ifndef widget h define widget h include include include namespace uiclass widget public qwidget endif widget h2.widget.cpp include widget.h...