使用图形界面描述矩形



最近一直在想一些问题,如何在实例中运用算法,在网上看到许多人将算法用在图形界面编程中,这也是个不错的运用,正好我学过一些图形界面编程和一些基本控件的使用,再借助如鹏网的Win32向导,使得界面编程更加简单

我使用一个矩形结构,处理一些矩形中的参数,可以计算矩形的面积、判断两个矩形是否相交

首先搭建成下图所示的图形界面

然后修改控件的ID:


控件的名字


控件的ID


第一个矩形的长度输入框


IDC_LEN


第一个矩形的宽度输入框


IDC_WIDE


第一个矩形左上角X坐标输入框


IDC_X1


第一个矩形左上角Y坐标输入框


IDC_Y1


第二个矩形的长度输入框


IDC_LEN2


第二个矩形的宽度输入框


IDC_WIDE2


第二个矩形左上角X坐标输入框


IDC_X2


第二个矩形左上角Y坐标输入框


IDC_Y2


面积输出框


IDC_AREA1


计算面积按钮


IDC_SUM


相交判断输出框


IDC_XJ


相交判断按钮


IDC_XJ1

首先定义一个矩形类

/*定义一个矩形类*/
struct Rect
{
	double X;/*左上角的横坐标*/
	double Y;/*左上角的纵坐标*/
	double Length;/*长度*/
	double Wide;/*宽度*/
};

然后定义一些函数用于处理矩形类


函数名


函数功能


void IsString(HWND hwnd, TCHAR *str)


判断数字是否合法


void Area(HWND hwnd, Rect rect)


计算矩形的面积


void Func(HWND hwnd, Rect rect1, Rect rect2)


判断两个矩形是否相交

程序的全部代码

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include "resource.h"
#include "MainDlg.h"

/*定义一个矩形类*/
struct Rect
{
	double X;/*左上角的横坐标*/
	double Y;/*左上角的纵坐标*/
	double Length;/*长度*/
	double Wide;/*宽度*/
};

/*判断数字是否合法*/
void IsString(HWND hwnd, TCHAR *str)
{
	/*得到输入的数据*/
	double num = atof(str);

	TCHAR Temp[256];

	/*将数据转换为字符串*/
	sprintf(Temp, "%g", num);

	/*判断两个字符串是否相等*/
	if(0 != lstrcmp(str,Temp))
	{
		MessageBox(hwnd, TEXT("你输入的数据非法"), TEXT("判断"), MB_OK|MB_ICONERROR);
		return;
	}
}

/*判断编辑框中是否有数据*/
int Str_Empty(HWND hwnd, TCHAR *str)
{
	int length = lstrlen(str);

	if(0 == length)
	{
		MessageBox(hwnd, TEXT("请输入数据"), TEXT("提醒"), MB_OK|MB_ICONEXCLAMATION);

		return 0;
	}
	else
	{
		/*判断数据是否合法*/
		IsString(hwnd, str);

		return 0;
	}
}

/*计算矩形的面积*/
void Area(HWND hwnd, Rect rect)
{
	/*保存矩形的长*/
	TCHAR Length[256];

	/*保存矩形的宽*/
	TCHAR Wide[256];

	/*保存矩形的面积*/
	TCHAR Area[256];

	ZeroMemory(Wide, sizeof(Wide));
	ZeroMemory(Area, sizeof(Area));

	/*得到矩形的长度*/
	GetDlgItemText(hwnd, IDC_LEN, Length, sizeof(Length));

	/*判断编辑框中是否有数据*/
	Str_Empty(hwnd, Length);

	/*得到矩形的宽度*/
	GetDlgItemText(hwnd, IDC_WIDE, Wide, sizeof(Wide));

	/*判断编辑框中是否有数据*/
	Str_Empty(hwnd, Wide);

	rect.Length = atof(Length);
	rect.Wide = atof(Wide);

	/*计算矩形的面积*/
	double area = rect.Length * rect.Wide;

	sprintf(Area, "%g", area);

	SetDlgItemText(hwnd, IDC_AREA1, Area);
}

/*判断两个矩形是否相交*/
void Func(HWND hwnd, Rect rect1, Rect rect2)
{
	/*保存矩形的长*/
	TCHAR Length1[256];

	/*保存矩形的宽*/
	TCHAR Wide1[256];

	/*储存矩形左上角的X坐标*/
	TCHAR str_X1[256];

	/*储存矩形左上角的Y坐标*/
	TCHAR str_Y1[256];

	ZeroMemory(Length1, sizeof(Length1));
	ZeroMemory(Wide1, sizeof(Wide1));
	ZeroMemory(str_X1, sizeof(str_X1));
	ZeroMemory(str_Y1, sizeof(str_Y1));

	GetDlgItemText(hwnd, IDC_LEN, Length1, sizeof(Length1));
	Str_Empty(hwnd, Length1);

	GetDlgItemText(hwnd, IDC_WIDE, Wide1, sizeof(Wide1));
	Str_Empty(hwnd, Wide1);

	GetDlgItemText(hwnd, IDC_X1, str_X1, sizeof(str_X1));
	Str_Empty(hwnd, str_X1);

	GetDlgItemText(hwnd, IDC_Y1, str_Y1, sizeof(str_Y1));
	Str_Empty(hwnd, str_Y1);

	rect1.Length = atof(Length1);
	rect1.Wide = atof(Wide1);
	rect1.X = atof(str_X1);
	rect1.Y = atof(str_Y1);

	/*保存矩形的长*/
	TCHAR Length2[256];

	/*保存矩形的宽*/
	TCHAR Wide2[256];

	/*储存矩形左上角的X坐标*/
	TCHAR str_X2[256];

	/*储存矩形左上角的Y坐标*/
	TCHAR str_Y2[256];

	ZeroMemory(Length2, sizeof(Length2));
	ZeroMemory(Wide2, sizeof(Wide2));
	ZeroMemory(str_X2, sizeof(str_X2));
	ZeroMemory(str_Y2, sizeof(str_Y2));

	GetDlgItemText(hwnd, IDC_LEN2, Length2, sizeof(Length2));
	Str_Empty(hwnd, Length2);

	GetDlgItemText(hwnd, IDC_WIDE2, Wide2, sizeof(Wide2));
	Str_Empty(hwnd, Wide2);

	GetDlgItemText(hwnd, IDC_X2, str_X2, sizeof(str_X2));
	Str_Empty(hwnd, str_X2);

	GetDlgItemText(hwnd, IDC_Y2, str_Y2, sizeof(str_Y2));
	Str_Empty(hwnd, str_Y2);

	rect2.Length = atof(Length2);
	rect2.Wide = atof(Wide2);
	rect2.X = atof(str_X2);
	rect2.Y = atof(str_Y2);

	/*当第一个矩形的右上角的横坐标小于小于第二个矩形的左上角的横坐标时,不相交*/
	if((rect1.X + rect1.Length) < rect2.X)
	{
		SetDlgItemText(hwnd, IDC_XJ, TEXT("这两个矩形不相交"));
	}

	/*当第一个矩形的左上角横坐标大于第二个矩形右上角的横坐标时,不相交*/
	else if(rect1.X > (rect2.X + rect2.Length))
	{
		SetDlgItemText(hwnd, IDC_XJ, TEXT("这两个矩形不相交"));
	}

	/*当第一个矩形左下角的纵坐标大于第二个矩形的左上角的纵坐标时,不相交*/
	else if((rect1.Y - rect1.Wide) > rect2.Y)
	{
		SetDlgItemText(hwnd, IDC_XJ, TEXT("这两个矩形不相交"));
	}

	/*当第一个矩形左上角的纵坐标小于第二个矩形左下角的纵坐标时,不相交*/
	else if(rect1.Y < (rect2.Y - rect2.Wide))
	{
		SetDlgItemText(hwnd, IDC_XJ, TEXT("这两个矩形不相交"));
	}
	else
	{
		SetDlgItemText(hwnd, IDC_XJ, TEXT("这两个矩形相交"));
	}
}

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
		HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {

    /*计算矩形的面积*/
	case IDC_SUM:
		{
			Rect rect;

			/*计算矩形的面积*/
			Area(hwnd, rect);
		}
        break;

    /*判断矩形是否相交*/
	case IDC_XJ1:
		{
			Rect rect1, rect2;

			Func(hwnd,rect1,rect2);
		}
		break;
        default:
		break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

执行结果

计算矩形的面积

当输入的不是数字时

当没有输入数据时

相交判断

点击下载程序

使用图形界面描述矩形

时间: 2024-12-20 00:57:01

使用图形界面描述矩形的相关文章

实验十四 Swing图形界面组件

实验十四  Swing图形界面组件 实验时间 20178-11-29 1.实验目的与要求 (1) 掌握GUI布局管理器用法: (2) 掌握各类Java Swing组件用途及常用API: 2.实验内容和步骤 实验1: 导入第12章示例程序,测试程序并进行组内讨论. 测试程序1 在elipse IDE中运行教材479页程序12-1,结合运行结果理解程序: 掌握各种布局管理器的用法: 理解GUI界面中事件处理技术的用途. 在布局管理应用代码处添加注释: 测试结果: 这个程序是一个网格布局,网格布局像一

part11-2 Python图形界面编程(Tkinter常用组件、对话框(Dialog)、菜单、Canvas绘图)

五. Tkinter 常用组件 Tkinter 各组件的详细用法还需要掌握,也就是掌握各个“积木块”的的详细功能. 1. 使用 ttk 组件 在前面直接使用的 tkinter 模块下的 GUI 组件看上去并不美观.为此 Tkinter 引了一个 ttk 组件作为补充,并使用功能更强大的 Combobox 取代原来的 Listbox,且新增了 LabeledScale(带标签的Scale).Notebook(多文档窗口).Progressbar(进度条).Treeview(树)等组件. ttk 是

python图形界面:首选Tkinter

1.首选Tkinter, tk本身就是为了快速GUI开发而生,且经过多年发展,已经十分成熟,而且Tkiner是python内置的事实上的标准GUI库. 2.在这个不是桌面为王的时代. 买本HTML5的书, 用Python的WEB框架, 建立一个本地服务器..虽然说又要学HTML5很麻烦, 但相比于用桌面各种各样的GUI描述语言, HTML那种标签化设计已经简单很多了. 你完全不需要管理内存, 不需要担心异步的处理. 为下一步的在线化铺平道路.Python是什么都能做一点, 但什么都有替代品. 那

系统盘满载导致无法启动图形界面

场景描述:Linux无法进入图形界面,通过Ctrl+Alt+F3进入字符界面,尝试使用命令如下 进入图形界面:方法1:startx方法2:startx -- :1当时这两种方法都没有奏效,得到如下的错误提示:xinit:No such file directory (errno 2)unable to connect to X serverxinit:No such process (errno 3)想到会不会是/tmp/.X0.lock导致的问题,所以想到删除这个文件,重新启动电脑.进入目录发

正则表达式、多线程、图形界面

正则表达式 所谓正则表达式,是根据一组字符串中每个字符串所共有的特征,使用特定的符号来描述该组字符串的一种方法. ^ 匹配输入字符串的开始位置 $ 匹配输入字符串的结束位置 * 匹配前面表达式零次或多次 + 匹配前面表达式一次或多次 ?匹配前面表达式零次或一次 {n} 匹配某字符n次  a{3}匹配a字符3次 {n,} 匹配某字符至少n次  a{3,}匹配a字符至少3次 . 匹配除/n外的任何单个字符 x|y 匹配x或y [xyz] 匹配包含的任意一个字符 [^xyz] 匹配未包含的任意一个字符

XenServer 6.5实战系列之十三:图形界面安装Linux Redhat系统

Citrix目前已经支持发布Linux桌面,然而在XenServer上创建VM和安装图形界面系统是有一定讲究的,为此今天在此跟大家分享如何在XenServer 6.5中部署Red Hat Enterprise Linux Server 6.6. 1. 创建虚拟机 1.1 打开XenCenter右键"XS"选择"New VM" 1.2 选择对应的模板"Red Hat Enterprise Linux 6(64-bit)" 注:当然有些人在部署Lin

Java知多少(84)图形界面之布局设计

在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计.java.awt中定义了多种布局类,每种布局类对应一种布局的策略.常用的有以下布局类: FlowLayout,依次放置组件. BoarderLayout,将组件放置在边界上. CardLayout,将组件像扑克牌一样叠放,而每次只能显示其中一个组件. GridLayout,将显示区域按行.列划分成一个个相等的格子,组件依次放入这些格子中. GridBagLayout,将显示区域划分成许多矩形小单元,每个组件

Java知多少(80)图形界面设计基础

早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上.现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单.按钮等,用户通过鼠标选择菜单中的选项和点击按钮,命令程序功能模块.本章学习如何用Java语言编写GUI科学试验,如何通过GUI实现输入和输出. AWT和Swing 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT

十. 图形界面(GUI)设计2.框架窗口

窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这个窗口,当应用程序程序启动时,由系统创建和处理: 框架窗口(JFrame):这是通常意义上的窗口,它支持窗口周边的框架.标题栏,以及最小化.最大化和关闭按钮: 一种无边框窗口(JWindow):没有标题栏,没有框架,只是一个空的矩形. 用Swing中的JFrame类或它的子类创建的对象就是JFram