日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建透明窗口及其应用--屏幕画笔

發(fā)布時間:2025/3/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建透明窗口及其应用--屏幕画笔 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

創(chuàng)建透明窗口及其應用--屏幕畫筆


示例代碼下載:創(chuàng)建透明窗口(屏幕畫筆).zip (請不要直接使用迅雷下載)

注:VC6下編譯通過


一、使窗口透明其實很簡單。就是一個函數(shù)SetLayeredWindowAttributes

步驟如下:

步驟一:讓窗口具透明的特性

::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);

當你不希望窗口透明時,就使這個添加的屬性去掉就可以了,如下:

//取消透明
?? ::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函數(shù)

這個函數(shù)需要從USER32.DLL里獲得,調(diào)用如下。

?? //獲取模塊里的函數(shù)
HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL"));

BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=
??? (BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");

這樣我們就獲得了函數(shù)SetLayeredWindowAttributes。函數(shù)解釋如下

BOOL SetLayeredWindowAttributes(
HWND hwnd,??? handle to the layered window
COLORREF crKey,?? specifies the color key
BYTE bAlpha,?? value for the blend function
DWORD dwFlags?? action);
其中dwFlags有LWA_ALPHA(值為2)和LWA_COLORKEY(值為1)兩種設置,如果LWA_ALPHA被設置的話,
通過bAlpha參數(shù)指定窗體的透明度;如果LWA_COLORKEY標志被設置的話,則指定關(guān)鍵色為crKey,
該顏色所覆蓋的區(qū)域?qū)拇绑w去除,去除后的區(qū)域?qū)⒉辉龠M行點擊檢測,其他顏色則正常顯示。
如果阿爾法混合值設置為0,其窗口區(qū)域同樣不進行點擊檢測。

步驟三:調(diào)用函數(shù)設置透明。

方式一:設置我們指定的顏色透明掉。(第4參數(shù)設為1,此時第二個參數(shù)是要透明的顏色,其他參數(shù)不管)

??? //設置窗口透明。第4參數(shù)為1時,第二個參數(shù)是要透明的顏色
??? SetLayeredWindowAttributes(m_hWnd,RGB(244,243,238),0,1);

具體代碼如下:(復制粘貼后可以直接使用)

HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL"));
if (hInst)
{
?? //獲取模塊里的函數(shù)
?? BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=
??? (BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");

?? //函數(shù)指針正確獲取
?? if(SetLayeredWindowAttributes)
?? {
??? //讓窗口具透明的特性
??? ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
??? //設置窗口透明。第4參數(shù)為1時,第二個參數(shù)是要透明的顏色
??? SetLayeredWindowAttributes(m_hWnd,RGB(244,243,238),0,1);
?? }

?? FreeLibrary(hInst); //釋放調(diào)模塊句柄
}

方式二:設置窗口具有某種透明度。(第4參數(shù)設為2,此時第三個參數(shù)表示透明度的值,其他參數(shù)不管)

??? //設置窗口透明。第4參數(shù)為2時,第三個參數(shù)表示透明度
??? SetLayeredWindowAttributes(m_hWnd, 0, 80, 2);

具體代碼如下:(復制粘貼后可以直接使用)

HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL"));
if (hInst)
{
?? //獲取模塊里的函數(shù)
?? BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=
??? (BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");

?? //函數(shù)指針正確獲取
?? if(SetLayeredWindowAttributes)
?? {
??? //讓窗口具透明的特性
??? ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
??? //設置窗口透明。第4參數(shù)為2時,第三個參數(shù)表示透明度
??? SetLayeredWindowAttributes(m_hWnd, 0, 80, 2);
?? }

?? FreeLibrary(hInst); //釋放調(diào)模塊句柄
}


二、透明窗口的應用:屏幕畫筆

1.我們可以創(chuàng)建一個透明的窗口。讓其背景色透明掉。比如背景色是RGB(244,243,238),我們使用:

SetLayeredWindowAttributes(m_hWnd,RGB(244,243,238),0,1);

就可以把背景色去掉。

2.當我們使用窗口的屏幕DC畫圖時,由于顏色不是背景顏色RGB(244,243,238),所以我們畫的線都會保留在透明窗口上。

3.把窗口的邊框去掉,并且覆蓋整個屏幕。而且要置窗口為最頂層窗口。這樣就可以實現(xiàn)屏幕畫筆了。

4.畫圖時,由于窗口透明了,所以我們的鼠標消息不會給透明窗口捕獲到。這時我們可以安裝一個低級鼠標鉤子(之所以要用

低級鼠標鉤子因為它夠方便,直接寫在程序里,不用dll),用于捕獲鼠標的說有消息。

具體代碼如下:當然你也可以參考我上面提供的源代碼。

HWND g_hWnd;
POINT LastPoint;
bool IsDrawingLine=false;

BOOL CDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);??? // Set big icon
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); //設置窗口最頂
?? static CLoadMyLibrary inst(m_hWnd);
//-----------------------------------------------------------------------------

g_hWnd=m_hWnd;
OnButton1();

return TRUE;
}

/****************************************************************************
低級鼠標鉤子
#define?? _WIN32_WINNT?? 0x0500 //必須在stdafx.h中添加這一句
****************************************************************************/
HHOOK g_LowLevelMouseHook=NULL; //鉤子句柄
LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam, LPARAM lParam)
{
if (nCode<0 )
?? return CallNextHookEx(g_LowLevelMouseHook,nCode,wParam,lParam);
static POINT point;
point=(POINT)((MSLLHOOKSTRUCT *)lParam)->pt;

switch (wParam)
{
case WM_LBUTTONDOWN:
?? {
??? TCHAR ClassName[20]={0};
??? ::GetClassName(::WindowFromPoint(point),ClassName,sizeof(ClassName)/sizeof(TCHAR));
??? if (_tcscmp(ClassName,_T("Button"))==0)
???? break;

??? ::ScreenToClient(g_hWnd,&point);
??? LastPoint=point;
??? IsDrawingLine=true;
??? return 1;
?? }
?? break;
case WM_LBUTTONUP:
?? {
??? IsDrawingLine=false;
?? }
?? break;
case WM_MOUSEMOVE:
?? {
??? if (IsDrawingLine)
??? {
???? ::ScreenToClient(g_hWnd,&point);

???? //畫鼠標移動痕跡
???? HDC hdc=::GetDC(g_hWnd);??? //畫曲線
???? HPEN pen=::CreatePen(PS_SOLID,4,RGB(30,30,30));
???? SelectObject (hdc,pen) ;
???? ::MoveToEx(hdc,LastPoint.x,LastPoint.y,NULL);
???? ::LineTo(hdc,point.x,point.y);
???? LastPoint=point;
???? DeleteObject(pen);
???? ::ReleaseDC(NULL,hdc) ;
??? }
?? }
?? break;
}
return CallNextHookEx(g_LowLevelMouseHook,nCode,wParam,lParam); //傳遞鉤子信息
}

#define WS_EX_LAYERED 0x00080000

void CDemoDlg::OnButton1()
{
HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL"));
if (hInst)
{
?? //獲取模塊里的函數(shù)
?? BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=
??? (BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");

?? //函數(shù)指針正確獲取
?? if(SetLayeredWindowAttributes)
?? {
??? //讓窗口具透明的特性
??? ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
??? //設置窗口透明。第4參數(shù)為1時,第二個參數(shù)是要透明的顏色
??? SetLayeredWindowAttributes(m_hWnd,RGB(244,243,238),0,1);
?? }

?? FreeLibrary(hInst); //釋放調(diào)模塊句柄
}
}

void CDemoDlg::OnButton5()
{
HINSTANCE hInst=GetModuleHandle(_T("USER32.DLL"));
if (hInst)
{
?? //獲取模塊里的函數(shù)
?? BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=
??? (BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");

?? //函數(shù)指針正確獲取
?? if(SetLayeredWindowAttributes)
?? {
??? //讓窗口具透明的特性
??? ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
??? //設置窗口透明。第4參數(shù)為2時,第三個參數(shù)表示透明度
??? SetLayeredWindowAttributes(m_hWnd, 0, 80, 2);
?? }

?? FreeLibrary(hInst); //釋放調(diào)模塊句柄
}
}

void CDemoDlg::OnButton2()
{
//取消透明
?? ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)& ~WS_EX_LAYERED);
}

void CDemoDlg::OnButton3()
{
//取消所有邊框
::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)
?? & ~WS_CAPTION & ~WS_THICKFRAME );??
::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);

// //如果有WS_EX_DLGMODALFRAME還要取消WS_EX_DLGMODALFRAME
// ::SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE)
//?? & ~WS_EX_DLGMODALFRAME);
// ::SetWindowPos(m_hWnd,NULL,0,0,0,0,SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE);

int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,cx,cy,NULL);
}

void CDemoDlg::OnButton4()
{
//添加標題欄
::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)
?? | WS_CAPTION );??
::SetWindowPos(m_hWnd,HWND_TOPMOST,100,100,400,400,SWP_FRAMECHANGED);
}

void CDemoDlg::OnButton6()
{
if(g_LowLevelMouseHook!=NULL)
?? return;

//start Low Level mouse hook
g_LowLevelMouseHook=SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,GetModuleHandle(NULL),0);
if(!g_LowLevelMouseHook)
?? ::MessageBox(m_hWnd,TEXT("SetWindowsHookEx LowLevelMouseProc failed"),NULL,MB_OK);
}

void CDemoDlg::OnButton8()
{
//stop Low Level mouse hook
UnhookWindowsHookEx(g_LowLevelMouseHook);
g_LowLevelMouseHook=NULL;
}

void CDemoDlg::OnButton7()
{
::InvalidateRect(m_hWnd,NULL,true);
}

希望對你有所幫助!阿彌陀佛!

總結(jié)

以上是生活随笔為你收集整理的创建透明窗口及其应用--屏幕画笔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线观看免费高清在线观看 | 九九九九九精品 | 国产精品嫩草久久久久 | 999久久久精品视频 亚洲视频精品在线 | 国产日韩在线一区 | 樱花电影最新免费观看国语版 | 欧美一区二区三区精品 | 中字幕视频在线永久在线观看免费 | 噜噜噜视频 | 欧美成人一区二区三区四区 | 色综合久久久久 | 青青99| 永久黄网站色视频免费观看w | 免费污网站在线观看 | 午夜天堂精品久久久久 | 亚洲精品免费电影 | 麻豆91av| 青娱乐最新地址 | 精品69| 国产高清一区二区三区四区 | 国产一级片免费视频 | 国产www视频 | 免费古装一级淫片潘金莲 | 日韩美一区二区三区 | 欧美成人a视频 | 中文字幕一区二区三三 | 成人黄色大片在线观看 | 一区二区三区免费网站 | 中文在线免费看视频 | 亚洲爱爱网站 | 国产乱论 | 美国色综合 | 日韩美女一区 | 香蕉视频在线免费 | 亚洲视频免费在线观看 | 欧美精品网站 | 91网站在线免费观看 | 久久精品国产免费看久久精品 | 国产国语videosex另类 | 久久91av | 日韩 欧美 国产 综合 | 欧美大片在线播放 | 国产精品久久中文字幕 | 啪啪免费网| 亚洲av无码专区国产乱码不卡 | 久久精品国产亚洲av麻豆色欲 | 国产精品伦一区二区三区免费看 | 婷婷激情综合 | 亚洲图片综合区 | 超碰成人免费在线 | 久久99精品国产.久久久久久 | 丁香激情网 | 欧美视频在线不卡 | 日韩乱码在线观看 | 超碰97av在线 | 男人捅爽女人 | 2025国产精品视频 | 久久99精品久久久久子伦 | 在线观看日韩一区二区 | 一级二级在线观看 | 欧美日韩国产一区二区 | 三上悠亚亚洲一区 | 成人网色| 无码一区二区三区在线 | 九九九久久久久 | 美女av毛片| 精品一区二区在线免费观看 | 邪恶久久 | 欧美精品中文 | 欧美人妻一区二区三区 | 国产成年人视频网站 | 亚洲干干干 | 献给魔王伊伏洛基亚吧动漫在线观看 | 亚洲日本中文字幕 | 欧美黑人添添高潮a片www | 手机在线一区二区三区 | 可以免费观看av | 天天狠天天插 | 黄色网址www | 国产91一区在线精品 | 日韩免费淫片 | 青青草国产在线视频 | 谁有av网址 | 色永久 | 婷婷影视 | 日本在线不卡一区二区三区 | 一二三区av | 国产偷人妻精品一区二区在线 | 国产做爰免费观看视频 | 久草国产在线视频 | 婷婷六月天 | 精品一区二区三区欧美 | 亚洲综合精品国产一区二区三区 | 一区二区久久 | 日韩影视在线 | www色日本| 亚洲三级中文字幕 | 污污视频免费看 | 黄色爱爱视频 |