详解VC编程实现不规则窗体

2014-08-10 09:53:34|?次阅读|上传:huigezrx【已有?条评论】发表评论

关键词:C/C++, 界面设计, MFC|来源:唯设编程网

不规则窗体的使用,可以使我们的程序更加生动有趣,许多商业软件的启动画面都是一个不规则窗体,如下面的VS2010启动画面就是一个不规则窗体:

详解VC编程实现不规则窗体

除此之外,包括PhotoShop,Dreamweaver等软件的启动界面也采用了不规则窗体,使之看起来更加生动有趣。那么怎样才能生成不规刚形状的窗体呢?

原理:所有的 Windows 窗体都位于一个称为“region”中,窗体的大小如果超出“region”的范围,windows 会自动裁剪超出"region"范围那部分的窗体,使其不可见。所以,要创建不规则窗体有两个步骤:第一步就是创建不规则"region".第二步就是将窗体放到创建的“region”中。

首先准备一张含有目标窗体形状的图片,设置透明色即将图片中部不属于窗体形状的部分,标记成同一种颜色,例如蓝色RGB(0,0,255).程序运行后先装入图片。然后逐个扫描图片的每个像素,如这个像素不属于透明色,则在相应位置创建一个只含一个像素的“region”然后将这些小”region ”合并起来组成一个任意形状的”region”.这里将使用到CRgn的一个成员函数 :

int CRgn::CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );

其中:pRgn1,pRgn2为要合并的两个“region”,nCombineMode为合并的方式,此应用中取RGN_OR,即两”region”全部合并去处重复部分

其中第二步很简单就调用一条语句即可。在SDK中调用API函数SetWindowRgn,该函数原型如下:

int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw ); 

其中:hWnd为待设置的窗体句柄,hRgn为已经创建的"region"句柄,bRedraw代表是否要重绘窗体。在MFC 中使用窗口类CWnd的成员函数int CWnd::SetWindowRgn(HRGN hRgn, BOOL bRedraw );该函数的参数意义与API中同名函数相同。

下面详细介绍不规则窗体实现的具体步骤:

step1:准备位图文件

你可以在photoshop或者其它图像编辑软件中绘制需要的窗体框架图,保存为bmp格式,并将其导入到VC项目中,改变其ID为IDB_BITMAP1。本文作为一个示例程序,直接在VS环境中创建了一个简单的位图,如下图:

详解VC编程实现不规则窗体

step2: 在对话框类中添加成员变量CBitmap m_bmp;

在对话框类的头文件添加CBitmap类成员变量m_bmp的声明:

详解VC编程实现不规则窗体

在对应的类构造函数中添加m_bmp的初始化代码:

CCEllipseWndDlgDlg::CCEllipseWndDlgDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCEllipseWndDlgDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_bmp.LoadBitmap(IDB_BITMAP1); 
}

step3: 设定窗口大小

在对话框类的OnInitDialog函数中添加代码,将窗口大小设置为和位图尺寸一样大:

    // TODO: 在此添加额外的初始化代码	
       BITMAP bm;
    m_bmp.GetBitmap(&bm);

    CRect rtWindow;
    GetWindowRect(&rtWindow);
    rtWindow.right = rtWindow.left+bm.bmWidth;
    rtWindow.bottom =rtWindow.top +bm.bmHeight;
    MoveWindow(&rtWindow);

    CClientDC dc(this);
    SetupRegion(&dc,m_bmp,RGB(255,255,255));

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

在OnInitDialog函数的最后还调用了SetupRegion函数绘制窗体。

<12>
发表评论0条 】
网友评论(共?条评论)..
详解VC编程实现不规则窗体