Visual C++程序开发范例宝典(软件工程师典藏版)
上QQ阅读APP看书,第一时间看更新

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;
        }

举一反三

根据本实例,读者可以:

实现透明窗体;

实现不规则窗体。