win32API實現透明字幕視窗

2021-07-25 14:54:00 字數 2145 閱讀 3247

hwnd hwnd = createwindowex(ws_ex_layered, text("testwindow"), text("透明視窗"), ws_popup | ws_visible, 0, 0, 20, 20, null, hinstance, null);

setlayeredwindowattributes(hwnd, 0, 0, lwa_colorkey);

這樣就建立了乙個對黑色透明的視窗。

然後我們在wm_paint訊息處理中給字幕框繪製邊框和字幕內容。

case wm_paint:

hdc = beginpaint(hwnd, &ps);

// todo: add any drawing code here...

rect rc;

getclientrect(hwnd, &rc);

//繫結字型

hfont holdfont = (hfont)selectobject(hdc, m_hfont);

//寫入字幕內容

drawtext(hdc, sztext, strlen(sztext), &rc, dt_editcontrol | dt_wordbreak);

//建立畫筆畫邊框

logpen lg;

lg.lopncolor = 0x00ff0000

; lg.lopnstyle = ps_dash;

lg.lopnwidth

.x = 2

; hpen hpen = createpenindirect(&lg);

hpen holdpen = (hpen)selectobject(hdc, hpen);

point pt;

::movetoex(hdc, rc.left, rc.top, &pt);

lineto(hdc, rc.left, rc.bottom);

lineto(hdc, rc.right, rc.bottom);

lineto(hdc, rc.right, rc.top);

lineto(hdc, rc.left, rc.top);

selectobject(hdc, holdfont);

selectobject(hdc, holdpen);

endpaint(hwnd, &ps);

break

;

繪製了內容後,我們就可以看到字型下面是透明的了,不過我們還要加上邊框拉伸的功能,和拖動功能,響應wm_nchittest和wm_size訊息。

case wm_nchittest: 

//獲取滑鼠位置

point pt;

pt.x = get_x_lparam(lparam);

pt.y = get_y_lparam(lparam);

::screentoclient(hwnd,&pt);

//得到視窗矩形

rect rcclient;

::getclientrect(hwnd, &rcclient);

//左上角

if (pt.x20&&pt.y20)

//左下角

else

if (pt.x20 && pt.y>rcclient.bottom-20)

//右下角

else

if (pt.x>rcclient.right-20 && pt.y>rcclient.bottom-20)

//以下這四個是上、下、左、右四個邊

else

if (pt.x20)

else

if (pt.x>rcclient.right-20)

else

if (pt.y20)

if (pt.y>rcclient.bottom-20)

else

break;

//響應wm-size訊息

case wm_size:

; ::getclientrect(hwnd, &rcclient);

invalidaterect(hwnd,&rcclient,false);

} break;

WIN32 API程式設計之 透明static

createwindow可以直接建立乙個staitc,但這個static是不透明的,如果我們把視窗背景設定為gray brush,則static會很明顯的有乙個白色背景,一般來說這樣肯定很難看。可以先給 static設定乙個ws ex transparent的擴充套件屬性,然後在訊息 函式中攔截 w...

在Win32API窗體下實現透明背景

前面拜讀過本站無數高手的許多好文章,受益非淺,首先向各位大俠致敬!今天程式設計偶有小得,不敢獨享,特拿出來與各位共享,希望對某些朋友有些許幫助。如果我的窗體支援resize,那麼我調整大小的過程中,要不停的計算裁切框 要逐點掃瞄象素,並對裁切框進行操作 計算量相當大,特別當窗體比較大的時候更是如此,...

win32彙編使用win32 api實現字串拷貝

字串拷貝,呼叫win32的lstrcpy函式 拷貝了以後用訊息框顯示一下 386 model flat,stdcall option casemap none include s masm32 include windows.inc include s masm32 include user32.i...