《案例1:创建不规则窗口》由会员分享,可在线阅读,更多相关《案例1:创建不规则窗口(18页珍藏版)》请在金锄头文库上搜索。
1、成都信息工程学院 计算机学院 案例1:创建不规则窗口张欢*VC+程序设计成都信息工程学院 计算机学院 需求n利用MFC创建的窗口都具有统一的风格n长时间使用同一种界面往往就会产生一些 界面变化的需要Date2VC+程序设计成都信息工程学院 计算机学院 可行性nMFC没有为我们提供现成可用的圆形窗口 、三角形窗口等Date3VC+程序设计成都信息工程学院 计算机学院 可行性nMFC没有为我们提供现成可用的圆形窗口 、三角形窗口等n但是MFC的运行机制提供了按我们的想法 修改窗口外观的手段Date4VC+程序设计成都信息工程学院 计算机学院 可行性nMFC为程序设计人员封装了原有的 Windows
2、 SDK,但是仍然保留了我们直接 调用底层API函数的能力。n我们可以通过原有的API函数实现MFC没有 为我们提供的功能Date5VC+程序设计成都信息工程学院 计算机学院 目标n创建一个椭圆形的窗口Date6VC+程序设计成都信息工程学院 计算机学院 手段n使用API函数SetWindowRgnn该函数将绘画和鼠标消息限定在一个指定 的区域,实际上使窗口拥有了不规则的形 状。Date7VC+程序设计成都信息工程学院 计算机学院 编程步骤(1)n使用AppWizard创建一个基于对话框的应 用程序Date8VC+程序设计成都信息工程学院 计算机学院 CDialogn对话框类nHeader F
3、ile :Afxwin.hDate9VC+程序设计成都信息工程学院 计算机学院 CDialog:OnInitDialog n语法:nvirtual BOOL OnInitDialog( ); nFramework调用这个函数来响应 WM_INITDIALOG 消息。n当执行Create, CreateIndirect, 或者 DoModal 来产生对话框的时候n在即将显示出对话框时, WM_INITDIALOG消息会被发送给对话 框Date10VC+程序设计成都信息工程学院 计算机学院 CDialog:OnInitDialog n语法:nvirtual BOOL OnInitDialog( )
4、; nFramework调用这个函数来响应 WM_INITDIALOG 消息。n当执行Create, CreateIndirect, 或者 DoModal 来产生对话框的时候n在即将显示出对话框时,WM_INITDIALOG消 息会被发送给对话框n一般在这里做一些对话框的初始化操作Date11VC+程序设计成都信息工程学院 计算机学院 CRgnnCRgn用于形成窗口的GDI(graphics device interface )n形状是椭圆或者多边形nHeader FileAfxwin.hDate12VC+程序设计成都信息工程学院 计算机学院 CRgn:CreateEllipticRgn nB
5、OOL CreateEllipticRgn( int x1, int y1, int x2, int y2 );n创建一个椭圆区域(x2,y2)(x1,y1)Date13VC+程序设计成都信息工程学院 计算机学院 CRectnHeader file:Afxwin.hn与结构RECT很相似表示一个矩形区域ntypedef struct tagRECT nLONG left;nLONG top;nLONG right;nLONG bottom;n RECT; nCRect是class,封装了一些操作Date14VC+程序设计成都信息工程学院 计算机学院 CWnd:GetClientRect nvo
6、id GetClientRect( LPRECT lpRect ) const;nlpRect:n指向一个RECT结构或者一个CRect对象以获取 client(客户区)坐标Date15VC+程序设计成都信息工程学院 计算机学院 API:SetWindowRgn nint SetWindowRgn( nHWND hWnd, / 将要设置形状的窗口句柄nHRGN hRgn, / 要设置的形状的句柄nBOOL bRedraw / 是否重绘窗口n); Date16VC+程序设计成都信息工程学院 计算机学院 编程步骤(2)n修改OnInitDialog函数n用CRgn的对象建立一个椭圆区域n调用SetWindowRgn将该区域指定给窗口n/ Get size of dialognCRect rcDialog;nGetClientRect(rcDialog);n/ Create region and assign to windownCRgn rgn;nrgn.CreateEllipticRgn(0, 0, rcDialog.Width(), rcDialog.Height();n:SetWindowRgn(GetSafeHwnd(), (HRGN)rgn, TRUE);Date17VC+程序设计成都信息工程学院 计算机学院 效果Date18