討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 軟體開發過程中有哪些資安漏洞? 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
如何實現半透明視窗
更改我的閱讀文章字型大小
作者 : eripmav(鮮紅)
[ 貼文 71 | 人氣 7999 | 評價 170 | 評價/貼文 2.39 | 送出評價 21 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/25 下午 02:40:13
我目前用VC 作了一個 Dialog的AP,想作到BCB中的AlphaBlendValue的效果,
成為可以看到桌面的半透明視窗.請問有那位大大知道該怎麼作呢?
作者 : ohyajack(ohyajack)
[ 貼文 39 | 人氣 800 | 評價 190 | 評價/貼文 4.87 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人eripmav註記此篇回應為最佳解答 2005/5/25 下午 04:50:45
SetLayeredWindowAttributes

這個可以實現你要的效果 ^^
作者 : eripmav(鮮紅)
[ 貼文 71 | 人氣 7999 | 評價 170 | 評價/貼文 2.39 | 送出評價 21 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/25 下午 05:15:27
感謝大大的回覆,我已經完成了,
順便把程式碼補完...^^

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
     typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
     MYFUNC fun = NULL;

     fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
     if(fun)fun(this->GetSafeHwnd(),0,(256*0.9),2);
     FreeLibrary(hInst);
}
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/26 上午 02:33:21
這真是一篇經典的文章
從發問者的標題到發問內容
再到答題者的方式
最後是發問者的實作(測試心得)
可以當成發問範例教學了

從eripmav兄的實作,可以發現極高的水準(甚至達到洗練的程度)



作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人eripmav註記此篇回應為很有道理 2005/5/26 上午 02:44:53
對了,忘了重點 =.=b
SetLayeredWindowAttributes
(以前做過)這個API好像只支援win2000和win XP
win98好像不支援,可否請手上有98的人証明一下
98上的實做好像是用欺騙的方式(將視窗背景擋住的地方copy下來)
直接畫在視窗上,再利用插空隙的方式填入本視窗原有的東西(每次移動視窗就要計算重畫一次)<-土法練鋼
不知以前星海爭霸是如何做到的?
作者 : frank(frank)
[ 貼文 66 | 人氣 4967 | 評價 50 | 評價/貼文 0.76 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人eripmav註記此篇回應為很有道理 2005/5/26 上午 09:25:10
此 API 在 Win98 下是行不通的 .

而我在實作 "半透明不規則按鈕" 或是 "淡入淡出" 特效時
 , 我就是用 Alpha-Blending !

而實作起來效果還不錯 , 各位可以參考我的拙著 !

http://www.linnovatech.com/Dll_Product_01.htm
作者 : frank(frank)
[ 貼文 66 | 人氣 4967 | 評價 50 | 評價/貼文 0.76 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/26 上午 09:26:27
此 API 在 Win98 下是行不通的 .

而我在實作 "半透明不規則按鈕" 或是 "淡入淡出" 特效時
 , 我就是用 Alpha-Blending !

而實作起來效果還不錯 , 各位可以參考我的拙著 !

http://www.linnovatech.com/Dll_Product_01.htm
作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/4 下午 12:46:50
SetLayeredWindowAttributes 竟然不能直接用..
(prototype 也都有宣告了, user32.lib 也有 linke 了)
一定要用 load library 的方式才行, 這...是為什麼啊??? (我是用 VC++ 6.0)
好像有些 API 非得用 load library 才行.


作者 : steven_cheng21(cheng21)
[ 貼文 48 | 人氣 116 | 評價 310 | 評價/貼文 6.46 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/4 下午 01:15:40
因為只能用在Windows 2000以上,所以要改變以下定義:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
個人不建議直接以LoadLibrary的方式,同時以WS_EX_LAYERED取代0x80000比較直覺
作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 上午 09:46:46
再請教各位先進,
有沒有 function 是可以指定 window 某一個顏色為透明色?
因為 ModifyStyleEx( NULL, WS_EX_TRANSPARENT) 整個 window 都會變透明的.
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人eripmav註記此篇回應為最佳解答 2005/11/7 上午 10:14:24
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
 handle
COLORREF
 0~255
 LWA_COLORKEY Use crKey as the transparency color.
 LWA_ALPHA Use bAlpha to determine the opacity of the layered window.

不是說用SetLayeredWindowAttributes嗎??
例:

SetLayeredWindowAttributes(Handle, 0, 0~255, LWA_ALPHA);//改變透明度

作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 上午 10:22:25
哈~~ sorry, 這個 function 看了好幾天了,
竟然一直沒看到 COLORREF crKey 跟 LWA_COLORKEY 兩個 key words.
真是不好意思~~
作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 下午 03:29:46
我的定義已改成
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif

但是還是無法使用 SetLayeredWindowAttributes().
作者 : shing819(Clier) VC++曠世奇才貼文超過1000則人氣指數超過30000點
[ 貼文 1740 | 人氣 40353 | 評價 8630 | 評價/貼文 4.96 | 送出評價 84 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 下午 03:40:29
更新SDK為最新版,找一下我發表的文章,有提到.
作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 下午 04:21:36
我用了新的 Microsoft Platform SDK 後在 link 時竟出現這樣的 error message

error LNK2001: unresolved external symbol "public: int __thiscall CWnd::KillTimer(unsigned int)" (?KillTimer@CWnd@@QAEHI@Z)

用原本 VC 6 的是可以 link 的,

include 與 lib path 均指到新的 SDK path,
請問先進, 是那裡有用錯了嗎?
作者 : shing819(Clier) VC++曠世奇才貼文超過1000則人氣指數超過30000點
[ 貼文 1740 | 人氣 40353 | 評價 8630 | 評價/貼文 4.96 | 送出評價 84 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/7 下午 05:14:29

>我用了新的 Microsoft Platform SDK 後在 link 時竟出現這樣的 error message
>
>error LNK2001: unresolved external symbol 'public: int __thiscall CWnd::KillTimer(unsigned int)' (?KillTimer@CWnd@@QAEHI@Z)
>
>用原本 VC 6 的是可以 link 的,
>
>include 與 lib path 均指到新的 SDK path,
>請問先進, 是那裡有用錯了嗎?

1.將之前的Debug資料夾刪除重新編譯
2.在stdAfx.h定義標頭檔
   #define _WIN32_WINNT 0x0500

還不行將程式碼提供下載,方便測試


作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/8 上午 09:28:32
神奇的事情發生了,
昨天試了半了, rebulid all 也不行,
今天把 CWnd::KillTimer() 改用 SDK ::KillTimer(), 發現就可以 link 了,
再把它改回用 CWnd::KillTimer(), 結果.... link 也成功了.
作者 : taki(Taki)
[ 貼文 47 | 人氣 2689 | 評價 20 | 評價/貼文 0.43 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/8 下午 12:38:56
剛剛在網上找到的資料.

Windows Server 2003 SP1 Platform SDK
Development Tools. To build the C/C++ samples, you must have a C/C++ compiler. if you are using Microsoft Visual C/C++, run it at least once before installing the SDK. this will ensure that the environment variables are correctly configured. To build the Visual Basic samples, you must have Microsoft Visual Basic.

this SDK does not support working with Microsoft Visual C/C++, 6.0 as support for VC 6.0 has ended.

The last SDK that will work with VC 6.0 is the February 2003 Edition, you can order a CD on the fulfillment site. Side by side installations are not supported.

不巧的是, 我就是用 Windows Server 2003 SP1 Platform SDK,
可能就是這個原因吧, 因為雖然可以 link 了, run 起來卻有點怪怪的, 而且在 debug mode 下無法 link.

作者 : cog(Cog) VC++卓越專家C++優秀好手貼文超過200則
[ 貼文 458 | 人氣 12 | 評價 3390 | 評價/貼文 7.4 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/8/10 下午 04:58:18
>SetLayeredWindowAttributes 竟然不能直接用..
>(prototype 也都有宣告了, user32.lib 也有 linke 了)
>一定要用 load library 的方式才行, 這...是為什麼啊??? (我是用 VC++ 6.0)
>好像有些 API 非得用 load library 才行.

SetLayeredWindowAttributes可以用,只要在程式自行加上宣告即可。在window2000下編譯不會有SetLayeredWindowAttributes宣告。

extern "C"
{
WINUSERAPI
BOOL WINAPI SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
}
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.2177734