椭圆窗体的实现

2016-01-29 11:54 54 1 收藏

椭圆窗体的实现,椭圆窗体的实现

【 tulaoshi.com - C语言心得技巧 】

椭圆窗体的实现
作者:张建明

下载本文示例源代码

代码运行效果图如下:


我将分三部分介绍这一程序的实现过程:
1. 生成椭圆形图形界面,并在上面写斜体带颜色的子和鼠标拖动功能。
2. 增加鼠标右键菜单,并实现总在前面和其他程序自动覆盖的功能。
3. 生成鼠标的全局钩子,截获鼠标事件,返回****的值。

1. 生成椭圆形图形界面,并在上面写斜体带颜色的子。
在VC集成编译环境中,选择“文件”,“新建”,然后选择“工程”选项卡。在左侧的工程选择项中选取“MFC AppWizard[exe]”,在右侧工程标题下的编辑框中输入“EllipseWindow”。
单击“确定”按钮,进入“MFC AppWizard step-1”选择页,选中“D基本对话框”左侧的单选按钮,将应用程序的类型设为基本对话框,然后点击“完成”按钮后点击“确定”即可。

在自动生成的“IDD_ELLIPSEWINDOW_DIALOG”对话框资源中删除“取消”,“确定”按钮和标题为“TODO:在这里设置对话框”的文本框。此时,编译运行这个程序,应该能在窗口弹出一个空的对话框。

椭圆窗体的实现主要是靠CRgn类来实现的。

1.1 生成椭圆窗体
在类CEllipseWindowDlg的定义中填加CRgn m_rgnWnd的protected型变量。在CEllipseWindowDlg::OnInitDialog()中加入如下代码:

CRect rc;GetClientRect(rc);m_rgnWnd.CreateEllipticRgn(rc.left+32,rc.top+32,rc.Width()-64,rc.Height()-20);SetWindowRgn((HRGN)m_rgnWnd,TRUE);
此时运行这个程序,将出现一个灰色的椭圆窗体。如果不能关闭这个应用程序,可用Alt+F4关闭这个程序。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

1.2 按下鼠标左键后,用鼠标拖动椭圆的实现方法。
使用类向导,添加CEllipseWindowDlg的WM_MOUSEMOVE的处理函数CEllipseWindowDlg::OnMouseMove(UINT nFlags, CPoint point),代码如下:

static CPoint p;ClientToScreen(&point);if(nFlags & MK_LBUTTON){SetCursor(LoadCursor(NULL,IDC_CROSS));CRect rc;GetWindowRect(rc);MoveWindow(rc.left+point.x-p.x,rc.top+point.y-p.y,rc.Width(),rc.Height());}p=point;
此时运行程序,按下鼠标左键,就可以拖动椭圆窗体了。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
1.3 为这个窗体添加渐变的背景颜色。
在CEllipseWindowApp增加public成员函数void CEllipseWindowApp::SetBkColor(),代码为:
static BYTE x=80,y=40,z=30;static BOOL flagx=TRUE,flagy=FALSE,flagz=TRUE;if(flagx){x++;if(x>120)flagx=FALSE;}else{x--;if(x<10)flagx=TRUE;}if(flagy){y+=2;if(y>100)flagy=FALSE;}else{y-=2;if(y<20)flagy=TRUE;}if(flagz){z+=3;if(z>80)flagz=FALSE;}else{z-=3;if(z<20)flagz=TRUE;}SetDialogBkColor(RGB(x,y,z),RGB(x+100,y+120,140));
此时运行程序,椭圆界面的颜色就会自动发生渐变。

在EllipseWindowDlg.cpp中加入代码:
extern CEllipseWindowApp theApp;
在CEllipseWindosDlg中加入定时器void CEllipseWindowDlg::OnTimer(UINT nIDEvent),其中的实现代码为:
theApp.SetBkColor();Invalidate();
在BOOL CEllipseWindowDlg::OnInitDialog()中加入对初始化定时器代码:
SetTimer(1,20,NULL);
1.4 在窗体上显示欢迎词“enjoy!!!”
添加CEllipseWindowDlg的protected数据成员 CFont m_font;
在BOOL CEllipseWindowDlg::OnInitDialog()中创建字体,代码如下:
LOGFONT lf;SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),&lf,SPIF_SENDWININICHANGE);lf.lfHeight=60;lf.lfEscapement=100;lf.lfItalic=TRUE;lf.lfQuality=DRAFT_QUALITY;m_font.CreateFontIndirect(&lf);
在void CEllipseWindowDlg::OnPaint()中加入显示代码:
CPaintDC dc(this);dc.SetBkMode(TRANSPARENT);dc.SetTextAlign(TA_BASELINE|TA_CENTER);CRect rc;GetClientRect(rc);CFont *oldfont=dc.SelectObject(&m_font);dc.TextOut(rc.Width()/2,rc.Height()/2,"enjoy!!!");dc.SelectObject(oldfont);
好了,第一步完成了,也累了,have a rest :-)
检查一下我们的成果:程序运行,显示椭圆窗体,显示 “enjoy!!!”,并且背景颜色在不停的改变,按下鼠标左键后可以拖动。

2. 增加鼠标右键菜单,并实现总在前面和其他程序自动覆盖的功能。

2.1 增加鼠标右键菜单
添加资源中添加菜单资

来源:http://www.tulaoshi.com/n/20160129/1483777.html

延伸阅读
用作者编写的椭圆类可以绘制任意方向的任意长短半轴椭圆,可以设置椭圆线型和粗细。 下面是利用CWzjEllipse类是绘制椭圆的代码: const double PI = 3.14159265; //获取绘图设备环境 CDC* pDC = GetDC(); //定义椭圆对象 CWzjEllipse ell; //绘制红色椭圆花瓣 for (int i = 0; i 4; i++) { //设置长短半轴长 ell.SetAB(80, 30); ...
Windows 中不规则窗体的编程实现 作者:上海伟功通信 roc 下载源代码 一、序言 在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等。矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使...
'分割区的宽度 PrivateConstSPLITTERWIDTH=45 '最小移动宽度 PrivateConstHMIN=15 'picLeft和picRight的宽度相对于窗体的比例 PrivatePercentAsSingle '正在拖动的标志 PrivateDragFlagAsBoolean '每次拖动后需要重排窗体上的控件 PrivateSubRedrawMe() DimNewWidthAsSingle ...
标签: 办公软件
笔者学校需要经常打印学生毕业证、在教案纸上书写教案等。我们想出一种办法:在所编辑的文档里把原表内容和需要填写的内容都输入,而在打印到现成的表格上时只打印填写的内容,不再把原表内容打印出来,这可以用Word2000的窗体及对窗体域的打印控制来实现。以打印学生毕业证为例,学生毕...
标签: Web开发
所以要引入JQUERY框架。 把我的这个控件代码放到一个js文件里面直接引入就可以了 控件代码 代码如下: $.fn.myDrag = function() { var self = $(this); self.css("position", "absolute"); var p = self.position(); self.css({ left: p.left, top: p.top }); self.mousedown( function(event) { // debugger; self.data("ifDary...

经验教程

838

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部