设置半透明对话框

要实现半透明的窗体,首先需要窗体具有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
);

你可能感兴趣的:(设置半透明对话框)