半透明显示窗体
要实现窗体的半透明效果,首先需要窗体具有0x80000值的扩展风格,然后调用User32.DLL动态链接库中的SetLayeredWindowAttributes函数设置半透明窗体。
在VC++中,SetLayeredWindowAttributes函数并没有被直接封装,需要用户手动从User32动态链接库中导入。
使窗体具有0x80000值的扩展风格很容易,可以调用SetWindowLong API 函数实现
语法: LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong)
参数说明: hWnd:表示窗口的句柄 nIndex:表示修改窗口的哪一特性。
本实例需要修改窗口的扩展风格,因此该参数应为GWL_EXSTYLE。 dwNewLong:表示窗口的新的特征。 导入SetLayeredWindowAttributes函数,首先需要定义一个与SetLayeredWindowAttributes函数具有相同函数原型的函数指针。例如: typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD); FSetLayeredWindowAttributes SetLayeredWindowAttributes; 然后调用LoadLibrary函数加载User32.DLL动态库,最后调用GetProcAddress函数将SetLayeredWindowAttributes指向User32动态库中的SetLayeredWindowAttributes函数。
实例:
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
typedef BOOL(WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
FSetLayeredWindowAttributes SetLayeredWindowAttributes;
HINSTANCE hInst=LoadLibrary(_T("User32.DLL"));
SetLayeredWindowAttributes=(FSetLayeredWindowAttributes)GetProcAddress(hInst,"SetLayeredWindowAttributes");
GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(SetLayeredWindowAttributes)
SetLayeredWindowAttributes(GetSafeHwnd(),RGB(0,0,0),128,2);
FreeLibrary(hInst);
应用程序背景与桌面融合
对话框的背景 要实现应用程序背景与桌面融合,可以使用API 函数PaintDesktop()将桌面墙纸图案绘制在窗体上, 在WM_MOVE消息的处理函数中调用PaintDesktop()函数就可以将当前程序遮挡部分绘制在窗体上。
语法: BOOL WINAPI PaintDesktop(HDC hdc);
参数说明: hdc:要进行填充的设备上下文。
实例: 在OnPaint中添加如下代码:
void CRRDlg::OnPaint()
{ CPaintDC dc(this); // 用于绘制的设备上下文
PaintDesktop(dc.m_hDC); //绘制桌面背景到窗体上 }
窗体移动时处理函数
void CRRDlg::OnMove(int x, int y)
{
CDialogEx::OnMove(x, y);
CDC* pDC=GetDC();
PaintDesktop(pDC->m_hDC); // TODO: 在此处添加消息处理程序代码
}
渐变色背景窗体
原理:
要实现窗体颜色的渐变,需要重载对话框的OnPaint函数,在OnPaint函数中通过画刷和CDC的FillRect 方法来进行渐变。
CDC类的FillRect成员函数使用指定的画刷填充给定的矩形。 函数将完全填充矩形,包括左边界和顶部边界,但不包括右边界和底部。
画刷需要用CBrush成员函数CreateHatchBrush、CreatePaletteBrush、CreateSolidBrush创建,或用 Windows函数::GetStockObject获得。当填充矩形时,FillRect并不包括矩形的右边界和底部。GDI也可以 填充矩形但不包括右边界和底部。不管时何种模式下,FillRect都会比较top,bottom、left和right 成员的值。如果Bottom小于或等于top,或者right小于等于left,那么矩形将不会被画出。
FillRect函数的语法:
void FillRect(LPCRECT lpRect,CBrush* pBrush);
参数说明:
lpRect:指向RECT结构的指针,包含被填充的矩形的逻辑坐标,可以为该参数传递CRect对象。
pBrush:标识填充矩形的画刷。
实例:
void CRRDlg::OnPaint()
{
int m; CPaintDC dc(this); // 用于绘制的设备上下文
CBrush brush; CRect rect;
GetClientRect(&rect);
for(m=255;m>0;m--)
{
int x,y;
x=rect.Width()*m/255;
y=rect.Height()*m/255;
brush.DeleteObject();
brush.CreateSolidBrush(RGB(255,m,0));
dc.FillRect(CRect(0,0,x,y),&brush); }
}
制作立体窗体阴影效果
原理: 制作立体窗口阴影效果是在主窗口的右边和下边放两个非模态对话框,然后半透明显示, 就形成了阴影效果,然后在WM_MOVE消息的处理函数中设置非模态对话框的显示位置即可。
关键技术: 窗体的半透明处理以及窗体的移动
实例:
1.创建两个大小跟主对话框大小一致的对话框,为它们添加半透明窗体效果。
2.在主对话框的OnCreate方法中创建作为阴影的窗体。
代码如下:
dlg1.Create(IDD_DIALOG1);
dlg2.Create(IDD_DIALOG2);
3.在主窗体移动时修改阴影窗体的位置,代码如下:
void CAbcDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y); // TODO: Add your message handler code here
CRect rect;
GetWindowRect(&rect);
dlg1.MoveWindow(rect.left+10,rect.bottom,rect.Width()-10,10);
dlg1.ShowWindow(SW_SHOW);
dlg2.MoveWindow(rect.right,rect.top+10,10,rect.Height());
dlg2.ShowWindow(SW_SHOW);
}
浙公网安备 33010602011771号