当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 椭圆窗体的实现

VC++
泛型编程-转移构造函数(Generic Programming: Move Constructor)
C++中的废料收集
C语言中trim的实现
使非MFC窗口程序的窗口回调过程成为C++类的成员函数
可用于数论计算的无符号大整数类
基于位操作的类CBitBuffer
What are you, Anyway?
《新加坡程序员考题一则及分析》的讨论
关于拷贝构造函数和赋值运算符
简单模板概念
析构函数的奥秘
从软件工程的角度看const的用法
泛型编程:再现Min和Max
Tuples
运用设计模式设计MIME编码类
const传奇
使用namespace的正确方法
新加坡程序员考题一则及分析
在C++中实现属性
深入分析MFC中的CArray类

VC++ 中的 椭圆窗体的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 50 ::
收藏到网摘: n/a

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

下载本文示例源代码

代码运行效果图如下:


我将分三部分介绍这一程序的实现过程:
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;
此时运行程序,按下鼠标左键,就可以拖动椭圆窗体了。


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 增加鼠标右键菜单
添加资源中添加菜单资