- Visual C++程序开发范例宝典(软件工程师典藏版)
- 刘志铭 李贺 高茹编著
- 557字
- 2020-06-27 11:09:45
1.11 窗体形状及应用
将对话框以不规则的颜色显示在桌面上,可以给人一种新鲜的感觉。本节中的实例实现了特殊的对话框效果,增加了程序的视觉效果。
实例033 半透明窗体
本实例是一个提高效率的程序
实例位置:光盘\mingrisoft\01\033
实例说明
很多专业软件在启动前都会显示一个说明该软件信息或用途的窗口,这些窗口很多都是非常漂亮的半透明窗体。本实例实现了一个半透明的窗体,效果如图1.43所示。
技术要点
要实现窗体的半透明效果,首先需要窗体具有0x80000值的扩展风格,然后调用User32 动态库中的SetLayered WindowAttributes函数设置半透明窗体。在Visual C++中,SetLayeredWindowAttributes函数并没有被直接封装,需要用户手动从User32动态库中导入。
图1.43 半透明窗体
使窗体具有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动态库,最后调用GetProcAddress函数将SetLayeredWindowAttributes指向User32动态库中的SetLayeredWindowAttributes函数。
实现过程
(1)新建一个基于对话框的应用程序。
(2)在对话框类中添加一个CFont变量m_font。
(3)在对话框的OnInitDialog方法中设置窗口扩展风格,并调用User32动态库中的SetLayeredWindowAttributes函数,代码如下:
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000); //设置窗口扩展风格 typedef BOOL (WINAPI *FSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD); FSetLayeredWindowAttributes SetLayeredWindowAttributes ; HINSTANCE hInst=LoadLibrary("User32.DLL"); //加载动态链接库 SetLayeredWindowAttributes = (FSetLayeredWindowAttributes) GetProcAddress(hInst,"SetLayeredWindowAttributes"); //获得函数地址 if (SetLayeredWindowAttributes) SetLayeredWindowAttributes(GetSafeHwnd(),RGB(0,0,0),128,2); //设置透明度 FreeLibrary(hInst); //释放动态链接库 m_font.CreateFont(18,16,0,0,600,0,0,0,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SCRIPT,"宋体"); //创建字体
举一反三
根据本实例,读者可以:
设计半透明渐显窗体。
实例034 创建字型窗体
本实例是一个提高效率、人性化的程序
实例位置:光盘\mingrisoft\01\034
实例说明
在启动大型的应用程序时,往往要等待一段时间,这样会给用户一种程序可能没有运行起来的错觉,如果加上启动界面就可以消除这样的错觉了。启动界面通常可以设计成字形窗体等样式,本实例将创建一个字型窗体,实例运行结果如图1.44所示。
图1.44 创建字型窗体
技术要点
要设计字型窗体可以利用设备上下文CDC类的通道方法实现,包括BeginPath、EndPath和TextOut等方法。
(1)BeginPath方法。BeginPath方法用于在设备环境中打开路径,语法如下:
BOOL BeginPath( );
(2)EndPath方法。EndPath方法用于在设备环境中关闭路径,语法如下:
BOOL EndPath( );
(3)TextOut方法。TextOut方法用于输出文本,语法如下:
virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); BOOL TextOut( int x, int y, const CString& str );
参数说明:
● x、y:指定文本起点的横坐标和纵坐标。
● lpszString:要绘制的字符串的指针。
● nCount:字符串中的字节数。
● str:包含字符的CString对象。
实现过程
(1)新建一个基于对话框的应用程序。
(2)主要程序代码如下:
BOOL CFontWindowDlg::OnInitDialog() { //此处代码省略 CDC*pDC=GetDC(); //获得设备上下文 font.CreatePointFont(800,"宋体",pDC); //创建字体 pDC->SelectObject(&font); //选入字体 pDC->BeginPath(); //打开路径 pDC->SetBkMode(TRANSPARENT); //设置背景透明 pDC->TextOut(20,20,"明日科技"); //输出字符串 pDC->EndPath(); //关闭路径 HRGN rgn; rgn=PathToRegion(pDC->m_hDC); //获得路径区域 SetWindowRgn(rgn,TRUE); //设置窗体区域 pDC->StrokePath(); //使用当前画笔绘制路径 font.DeleteObject(); return TRUE; }
举一反三
根据本实例,读者可以:
实现透明窗体;
实现不规则窗体。