創建透明窗口及其應用--屏幕畫筆
示例代碼下載:創建透明窗口(屏幕畫筆).zip (請不要直接使用迅雷下載)
注:VC6下編譯通過
一、使窗口透明其實很簡單。就是一個函數SetLayeredWindowAttributes
步驟如下:
步驟一:讓窗口具透明的特性
::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED); |
當你不希望窗口透明時,就使這個添加的屬性去掉就可以了,如下:
//取消透明 |
當然,最後別忘記先定義WS_EX_LAYERED,否則編譯時會無法識別WS_EX_LAYERED
#define WS_EX_LAYERED 0x00080000
步驟二:獲得SetLayeredWindowAttributes函數
這個函數需要從USER32.DLL裏獲得,調用如下。
//獲取模塊裏的函數 BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)= |
這樣我們就獲得了函數SetLayeredWindowAttributes。函數解釋如下:
BOOL SetLayeredWindowAttributes( |
步驟三:調用函數設置透明。
方式一:設置我們指定的顏色透明掉。(第4參數設爲1,此時第二個參數是要透明的顏色,其他參數不管)
//設置窗口透明。第4參數爲1時,第二個參數是要透明的顏色 |
具體代碼如下:(複製粘貼後可以直接使用)
HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL")); //函數指針正確獲取 FreeLibrary(hInst); //釋放調模塊句柄 |
方式二:設置窗口具有某種透明度。(第4參數設爲2,此時第三個參數表示透明度的值,其他參數不管)
//設置窗口透明。第4參數爲2時,第三個參數表示透明度 |
具體代碼如下:(複製粘貼後可以直接使用)
HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL")); //函數指針正確獲取 FreeLibrary(hInst); //釋放調模塊句柄 |
二、透明窗口的應用:屏幕畫筆
1.我們可以創建一個透明的窗口。讓其背景色透明掉。比如背景色是RGB(244,243,238),我們使用:
SetLayeredWindowAttributes(m_hWnd,RGB(244,243,238),0,1);
就可以把背景色去掉。
2.當我們使用窗口的屏幕DC畫圖時,由於顏色不是背景顏色RGB(244,243,238),所以我們畫的線都會保留在透明窗口上。
3.把窗口的邊框去掉,並且覆蓋整個屏幕。而且要置窗口爲最頂層窗口。這樣就可以實現屏幕畫筆了。
4.畫圖時,由於窗口透明瞭,所以我們的鼠標消息不會給透明窗口捕獲到。這時我們可以安裝一個低級鼠標鉤子(之所以要用
低級鼠標鉤子因爲它夠方便,直接寫在程序裏,不用dll),用於捕獲鼠標的說有消息。
具體代碼如下:當然你也可以參考我上面提供的源代碼。
HWND g_hWnd; BOOL
CDemoDlg::OnInitDialog() g_hWnd=m_hWnd; return TRUE;
switch (wParam) ::ScreenToClient(g_hWnd,&point); //畫鼠標移動痕跡
#define WS_EX_LAYERED 0x00080000 void CDemoDlg::OnButton1() //函數指針正確獲取 FreeLibrary(hInst); //釋放調模塊句柄
//函數指針正確獲取 FreeLibrary(hInst); //釋放調模塊句柄
void CDemoDlg::OnButton3()
// //如果有WS_EX_DLGMODALFRAME還要取消WS_EX_DLGMODALFRAME int cx=GetSystemMetrics(SM_CXSCREEN); void CDemoDlg::OnButton4()
void CDemoDlg::OnButton6()
//start Low Level mouse
hook void CDemoDlg::OnButton8()
void CDemoDlg::OnButton7()
|
希望對你有所幫助!阿彌陀佛!
推薦:
獅姐的博客(獅子窩,學佛與靈魂之探究)
大方廣(學習傳統文化)
慈善點擊(輕鬆一點,行善積德,何樂不爲)
電影《地球公民》(揭示不爲人知的一面)
心向光明 遠離邪淫(現世警鐘,不可不看)
戒淫(上篇)(正淫節慾,戒除邪淫)
戒淫(中篇)(縱慾之樂,憂患隨之)
公民教育——命由我造