![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
这段VC++代码什么意思?麻烦朋友们帮忙
typedefBOOL(WINAPI*MYFUNC)(HWND,COLORREF,BYTE,DWORD);HINSTANCEhInst;MYFUNCfun;SetWind...
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
HINSTANCE hInst;
MYFUNC fun;
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
hInst = LoadLibrary("User32.DLL");
if(hInst)
{
fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
}
if (fun)
fun(this->GetSafeHwnd(),0,1,2);
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOWMAXIMIZED); 展开
HINSTANCE hInst;
MYFUNC fun;
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
hInst = LoadLibrary("User32.DLL");
if(hInst)
{
fun = NULL;
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
}
if (fun)
fun(this->GetSafeHwnd(),0,1,2);
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOWMAXIMIZED); 展开
1个回答
展开全部
这段代码的功能: 实现窗体的透明。
要使一个已经生成的窗体变为一个透明窗体需要两步:
①要使窗体透明,必须指定窗体的扩展风格:WS_EX_LAYERED ,其值为:0x80000。 但一些旧的sdk中没这个宏的定义,所以可以用0x80000。
具体实现过程是让WS_EX_LAYERED与GetWindowLong返回的窗体风格相异或。
②需要使用SetLayeredWindowAttributes函数设置窗体的透明风格的一些参数。有些api函数由于某些原因需要用户加载相应的动态链接库并从中查找函数及其实现过程,SetLayeredWindowAttributes就是这样。这个函数的原型是BOOL WINAPI SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);所以typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);是定义MYFUN为BOOL (WINAPI *)(HWND,COLORREF,BYTE,DWORD);类型的函数指针。
第一步的核心代码:
HINSTANCE hInst;
MYFUNC fun;
hInst = LoadLibrary("User32.DLL");
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
fun(this->GetSafeHwnd(),0,1,2);
首先,LoadLibrary("User32.DLL"); 加载user32.dll,然后GetProcAddress通过函数名称"SetLayeredWindowAttributes"在user32.dll中查到SetLayeredWindowAttributes这个函数的实现,并返回指向这个函数的指针。
代码中其他函数介绍:
SetWindowPos从字面上理解就是设置窗体的尺寸、位置、Z序(是否位于所有非顶端窗口的最前端),SWP_NOSIZE|SWP_NOMOVE就是在不改变窗口的尺寸信息、不移动窗口当前位置。
ShowWindow(SW_HIDE); // 隐藏窗口
ShowWindow(SW_SHOWMAXIMIZED); // 最大化显示窗口
GetSafeHwnd(); // 获取窗体的句柄
SetWindowLong、GetWindowLong分别是设置和获取窗体的一些属性信息。
PS: 我在VC++6.0下尚未通过这种方法使窗体透明,因为vc++6.0的sdk就太陈旧了。
要使一个已经生成的窗体变为一个透明窗体需要两步:
①要使窗体透明,必须指定窗体的扩展风格:WS_EX_LAYERED ,其值为:0x80000。 但一些旧的sdk中没这个宏的定义,所以可以用0x80000。
具体实现过程是让WS_EX_LAYERED与GetWindowLong返回的窗体风格相异或。
②需要使用SetLayeredWindowAttributes函数设置窗体的透明风格的一些参数。有些api函数由于某些原因需要用户加载相应的动态链接库并从中查找函数及其实现过程,SetLayeredWindowAttributes就是这样。这个函数的原型是BOOL WINAPI SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);所以typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);是定义MYFUN为BOOL (WINAPI *)(HWND,COLORREF,BYTE,DWORD);类型的函数指针。
第一步的核心代码:
HINSTANCE hInst;
MYFUNC fun;
hInst = LoadLibrary("User32.DLL");
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
fun(this->GetSafeHwnd(),0,1,2);
首先,LoadLibrary("User32.DLL"); 加载user32.dll,然后GetProcAddress通过函数名称"SetLayeredWindowAttributes"在user32.dll中查到SetLayeredWindowAttributes这个函数的实现,并返回指向这个函数的指针。
代码中其他函数介绍:
SetWindowPos从字面上理解就是设置窗体的尺寸、位置、Z序(是否位于所有非顶端窗口的最前端),SWP_NOSIZE|SWP_NOMOVE就是在不改变窗口的尺寸信息、不移动窗口当前位置。
ShowWindow(SW_HIDE); // 隐藏窗口
ShowWindow(SW_SHOWMAXIMIZED); // 最大化显示窗口
GetSafeHwnd(); // 获取窗体的句柄
SetWindowLong、GetWindowLong分别是设置和获取窗体的一些属性信息。
PS: 我在VC++6.0下尚未通过这种方法使窗体透明,因为vc++6.0的sdk就太陈旧了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询