// Circle.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "Circle.h"
#include "Solve.h"
#include <math.h>
#include <vector>
#include <atlimage.h>
using std::vector;
#define MAX_LOADSTRING 100
#define MAX_INFO_SIZE 200
#define VSCROOL_PAGE 20
#define HSCROOL_PAGE 20
#define WIDTH_INFO_SHOW 200
#define SPLITTEWIDTH 6
#define COUNT_BUTTONS 11
#ifdef UNICODE
#define CHARACTERINBYTES 2
#else
#define CHARACTERINBYTES 1
#endif
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
typedef struct _MYPOINT
{
double x;
double y;
}HPPOINT;
//自定义全局变量
vector<HPPOINT> g_points; //用户点击的点
HBITMAP g_hBitmap = NULL; //打开位图句柄
TCHAR szInfo[MAX_INFO_SIZE]; //存储用户信息
RECT g_rectWindow; //窗口矩阵,暂且未用到
OPENFILENAME g_ofn ; //打开图像文件
INT g_scale = 1; //缩放比例
INT g_VscrollPos = 0; //垂直滚动条位置
INT g_HscrollPos = 0; //水平滚动条位置
INT g_ToolBarHeight = 0; //工具栏高度
INT g_pointsTop = 0; //用户显示信息的最大高度,暂且未用到
INT g_InfoWndWidth = 0; //用户显示信息窗口的宽度
BITMAP g_bitmap; //BITMAP结构,存储打开图像文件的相关信息
BOOL g_isCalculated = FALSE; //标记当前位图是否已经计算过,当前未用到
BOOL g_drawCircle = FALSE; //标记是否绘制圆
BOOL g_draging = FALSE; //标记是否在拖动分割条
INT g_radius = 0; //计算结果半径
POINT g_centre_point; //计算结果圆心
TBBUTTON g_tbButton[COUNT_BUTTONS]; //工具条按钮定义
HWND g_wndToolBar = NULL; //工具条
HWND g_wndInfo = NULL; //左侧窗口显示用户信息
HWND g_wndImage = NULL; //右侧窗口显示图片
HMENU g_hMenu = NULL; //用户菜单
HANDLE g_hFileOut=INVALID_HANDLE_VALUE;//输出数据
//TCHAR szInfoWndTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szInfoWindowClass[MAX_LOADSTRING]; // 左侧用户信息窗口类名
//TCHAR szImageWndTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szImageWindowClass[MAX_LOADSTRING]; // 右侧绘制图片窗口类名
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK InfoWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ImageWndProc(HWND, UINT, WPARAM, LPARAM);
VOID OnPaint(HWND hWnd, HDC hDC);
VOID OnCalculate();
VOID OnCut();
VOID InitToolbar();
VOID OnFileOpen(HWND hWnd);
VOID OnSave(HBITMAP hBitmap);
VOID DibFileInitialize (HWND hWnd);
VOID TestEnableScrollBar(HWND hWnd);
BOOL CreateChildWindow(HWND hWnd);
BOOL WriteLineToOutFile(HANDLE, LPCTSTR, DWORD &);
BOOL SaveBitmap(HBITMAP hBitmap, LPCTSTR FileName);
void MyTransparentBlt(HDC,INT,INT,INT,INT,HDC,INT,INT,INT,INT,UINT);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CIRCLE, szWindowClass, MAX_LOADSTRING);
LoadString(hInstance, IDS_IMAGE_VIEW, szImageWindowClass, MAX_LOADSTRING);
LoadString(hInstance, IDS_INFO_VIEW, szInfoWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
//初始化自定义全局变量
g_hMenu = NULL;
g_wndImage = g_wndImage = g_wndToolBar = NULL;
g_hBitmap = NULL;
g_hFileOut = INVALID_HANDLE_VALUE;
g_scale = 1;
g_draging = g_drawCircle = g_isCalculated = FALSE;
g_InfoWndWidth = WIDTH_INFO_SHOW;
g_ToolBarHeight = g_radius = g_pointsTop = g_VscrollPos = g_HscrollPos = 0;
ZeroMemory(&g_bitmap, sizeof(g_bitmap));
ZeroMemory(&g_centre_point, sizeof(g_centre_point));
ZeroMemory(&g_rectWindow, sizeof(g_rectWindow));
ZeroMemory(szInfo, sizeof(szInfo));
_tcscpy_s(szInfo, _T("计算圆的圆心,半径"));
//初始化工具条
InitToolbar();
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CIRCLE));
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
//注册主窗口
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = MainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CIRCLE));
wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SPLITH));
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CIRCLE);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
int i = RegisterClassEx(&wcex);
//注册左侧用户信息窗口
wcex.lpfnWndProc = InfoWndProc;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szInfoWindowClass;
wcex.hIcon = NULL;
wcex.hIconSm = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
i =RegisterClassEx(&wcex);
//注册右侧图片显示窗口
wcex.lpfnWndProc = ImageWndProc;
wcex.lpszClassName = szImageWindowClass;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
return i =RegisterClassEx(&wcex);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
tm timenow;
DWORD len = 0;
INT Width, Height;
static HBRUSH s_hBrush = NULL;
static HBRUSH s_hBrushShadow = NULL;
switch (message)
{
case WM_CREATE:
s_hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
s_hBrushShadow = (HBRUSH)GetStockObject(GRAY_BRUSH);
//创建工具条
g_wndToolBar=CreateToolbarEx(hWnd, WS_VISIBLE|WS_CHILD|WS_BORDER|TBSTYLE_TOOLTIPS,
IDM_TOOLBAR, COUNT_BUTTONS, hInst, IDB_TOOLBAR, g_tbButton, COUNT_BUTTONS,
16, 16, 16, 16, sizeof(TBBUTTON));
GetWindowRect(g_wndToolBar, &rect);
g_ToolBarHeight = rect.bottom-rect.top;
DibFileInitialize(hWnd);
g_hMenu = GetMenu(hWnd);
EnableMenuItem(g_hMenu, IDM_ZOOM_IN, MF_GRAYED);
EnableMenuItem(g_hMenu, IDM_ZOOM_OUT, MF_GRAYED);
EnableMenuItem(g_hMenu, IDM_CALCULATE, MF_GRAYED);
EnableMenuItem(g_hMenu, IDM_RECALCULATE, MF_GRAYED);
EnableMenuItem(g_hMenu, IDM_CUT, MF_GRAYED);
if(INVALID_HANDLE_VALUE == (g_hFileOut = CreateFile(_T("输出.txt"), GENERIC_WRITE,
FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)))
{
if(IDYES == MessageBox(hWnd
- 1
- 2
- 3
- 4
前往页