首页 > 代码库 > 使用图形界面描述矩形

使用图形界面描述矩形



最近一直在想一些问题,如何在实例中运用算法,在网上看到许多人将算法用在图形界面编程中,这也是个不错的运用,正好我学过一些图形界面编程和一些基本控件的使用,再借助如鹏网的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);
}

执行结果



计算矩形的面积


当输入的不是数字时


当没有输入数据时


相交判断



点击下载程序