椭圆窗体的实现
作者:张建明
下载本文示例源代码
代码运行效果图如下:
我将分三部分介绍这一程序的实现过程:
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关闭这个程序。
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://m.tulaoshi.com/cyuyanjiaocheng/)
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 增加鼠标右键菜单
添加资源中添加菜单资