设置半透明对话框
2008-03-10 13:30
要实现半透明的窗体,首先需要窗体具有0x80000值的扩展风格,然后调用User32动态库中的SetLayeredWindowAttributes 函数来设置半透明窗体,在VC中SetLayeredWindowAttributes 函数并没有被直接封装,需要手动从User32动态库中到入。
实现代码入下:
//
设置窗口扩展风格
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
定义一个与SetLayeredWindowAttributes 函数具有相同函数原型的函数指针,
typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
FSetLayeredWindowAttributes SetLayeredWindowAttributes ;
HINSTANCE hInst = LoadLibrary("User32.DLL");//
到入动态库;
SetLayeredWindowAttributes = (FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");//
调用DLL中的函数
if (SetLayeredWindowAttributes)
SetLayeredWindowAttributes(GetSafeHwnd(),RGB(0,0,0),128,2); FreeLibrary(hInst);
函数原型:
LONG GetWindowLong( HWND hWnd,int nIndex )
函数功能描述
:用这个函数能够获得指定窗口的信息
参数:
hWnd:指定窗口的句柄 nIndex:需要获得的信息的类型 值 功能
nIndex取值如下
:
GWL_EXSTYLE 得到扩展的窗口风格 GWL_STYLE 得到窗口风格 GWL_WNDPROC 得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 GWL_HINSTANCE 得到应用程序运行实例的句柄 GWL_HWNDPARENT 得到父窗口的句柄 GWL_ID 得到窗口的标识符 GWL_USERDATA 得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位 的值)
当
hWnd标识一个对话框时可以使用下面的值
Value Action DWL_DLGPROC 得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值 DWL_USER 得到额外的应用程序私有信息,如一些句柄和指针等
返回值:
成功时,返回一个请求的32位的值 失败时,返回0,可以使用GetLastError来取得错误信息
示例:
long nStyle = ::GetWindowLong(hWnd, GWL_STYLE); // hWnd是一个编辑框的句柄 if(nStyle & ES_PASSWORD) { AfxMessageBox("这是一个密码域"); }
函数:
LONG SetWindowLong( HWND hWnd,
int nIndex, LONG dwNewLong ); 这个函数根据nIndex的取值不同,可以实现不同的功能. 其中nInde可以取: GWL_EXSTYLE: 设置窗口扩展风格,即CreateWindowEx的DWORD wExStyle 参数 GWL_STYLE: 设置窗口风格,即CreateWindow的DWORD dwStyle参数 GWL_WNDPROC: 设置窗口的处理函数,即RegisterClass的WNDCLASSEX的WNDPROC lpfnWndProc成员 GWL_HINSTANCE: 设置窗口所属的应用程序句柄,即RegisterClass的WNDCLASSEX的HINSTANCE hInstance成员 GWL_ID 设置窗口的ID(对于控件,就是控件ID) GWL_USERDATA: 设置窗口的用户自定义数据 DWL_DLGPROC: 设置对话框处理函数 DWL_MSGRESULT: 设置对话框消息处理的结果值 DWL_USER: 设置扩展区域数据
函数:
GetSafeHwnd() 用来获取当前句柄;
函数:
GetProcAddress()用来调用DLL中的函数;
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function );
实现代码如下
:
OnInitDialog()中添加
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); // 加入WS_EX_LAYERED扩展属性 HINSTANCE hInst = LoadLibrary("User32.DLL"); if(hInst) { typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); MYFUNC fun = NULL; fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); //取得SetLayeredWindowAttributes函数指针 if(fun)fun(this->GetSafeHwnd(),0,129,2); FreeLibrary(hInst); } |