robosight.cpp

来自「通过使机器人进行简单的图像识别」· C++ 代码 · 共 311 行

CPP
311
字号
// RoboSight.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "RoboSight.h"

#include "SMode.h"
#include "Engine\hGraphic2D.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE	g_hInst= NULL;								// 当前实例
HWND		g_hWnd= NULL;
HACCEL		g_hAccelTable= NULL;
int			g_sViewMode= SMODE_VIEW_BLANK;
int			g_sUpdateMode= SMODE_UPDATE_CAPTURE;
bool		g_bActive= true;

extern	LPI_DISPLAY2D g_pDisplay;

TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
void				MainProcess(void);
void				ResetMenuCheck(void);
void				ChangeUpdateMode(unsigned long PreMode, unsigned long NewMode);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: 在此放置代码。

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_ROBOSIGHT, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	g_hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ROBOSIGHT);

	ResetMenuCheck();
	// 主消息循环:
	MainProcess();

	exit(0);
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_ROBOSIGHT);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= NULL;
	wcex.lpszMenuName	= (LPCTSTR)IDC_ROBOSIGHT;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   g_hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_CAPTION,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   g_hWnd= hWnd;
   return TRUE;
}

void ResetMenuCheck(void)
{
	HMENU hMMenu= GetMenu(g_hWnd);
	HMENU hVMenu= GetSubMenu(hMMenu, 0);
	HMENU hUMenu= GetSubMenu(hMMenu, 1);

	// 显示图像标记
	if (g_sViewMode == SMODE_VIEW_UPDATE)
	{
		CheckMenuItem(hVMenu, IDM_VIEW_UPDATE, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_INCISE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_FLITER, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_TARGET, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_BLANK, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sViewMode == SMODE_VIEW_INCISE)
	{
		CheckMenuItem(hVMenu, IDM_VIEW_UPDATE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_INCISE, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_FLITER, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_TARGET, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_BLANK, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sViewMode == SMODE_VIEW_FLITER)
	{
		CheckMenuItem(hVMenu, IDM_VIEW_UPDATE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_INCISE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_FLITER, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_TARGET, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_BLANK, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sViewMode == SMODE_VIEW_TARGET)
	{
		CheckMenuItem(hVMenu, IDM_VIEW_UPDATE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_INCISE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_FLITER, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_TARGET, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_BLANK, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sViewMode == SMODE_VIEW_BLANK)
	{
		CheckMenuItem(hVMenu, IDM_VIEW_UPDATE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_INCISE, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_FLITER, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_TARGET, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hVMenu, IDM_VIEW_BLANK, MF_BYCOMMAND | MF_CHECKED);
	}
	
	// 图像更新来源
	if (g_sUpdateMode == SMODE_UPDATE_STATIC)
	{
		CheckMenuItem(hUMenu, IDM_UPDATE_STATIC, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_VIDEO, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_CAPTURE, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sUpdateMode == SMODE_UPDATE_VIDEO)
	{
		CheckMenuItem(hUMenu, IDM_UPDATE_STATIC, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_VIDEO, MF_BYCOMMAND | MF_CHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_CAPTURE, MF_BYCOMMAND | MF_UNCHECKED);
	}
	else if (g_sUpdateMode == SMODE_UPDATE_CAPTURE)
	{
		CheckMenuItem(hUMenu, IDM_UPDATE_STATIC, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_VIDEO, MF_BYCOMMAND | MF_UNCHECKED);
		CheckMenuItem(hUMenu, IDM_UPDATE_CAPTURE, MF_BYCOMMAND | MF_CHECKED);
	}
}

void ShutDownSystem(void)
{
	static HANDLE hToken;

	static TOKEN_PRIVILEGES tp; 

	static LUID luid; 

	OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ; 

	LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid ); 

	tp.PrivilegeCount = 1; 

	tp.Privileges[0].Luid = luid; 

	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

	AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); 

	ExitWindowsEx(EWX_SHUTDOWN, NULL);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	
	switch (message) 
	{
	case WM_MOVE:
	case WM_SIZE:
		if (g_pDisplay) g_pDisplay->UpdateBounds();
		break;
	case WM_ACTIVATE:	// 窗口的活動狀態
		{
			switch((LOWORD(wParam)))
			{
			case WA_ACTIVE:
			case WA_CLICKACTIVE:
				g_bActive = true;
				break;
			case WA_INACTIVE:
				g_bActive = false;
				break;
			default:
				break;
			}
		}
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam); 
		wmEvent = HIWORD(wParam); 
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		case IDM_SHUTDOWN:
			ShutDownSystem();
			break;
		case IDM_VIEW_UPDATE:
			g_sViewMode= SMODE_VIEW_UPDATE;
			ResetMenuCheck();
			break;
		case IDM_VIEW_INCISE:
			g_sViewMode= SMODE_VIEW_INCISE;
			ResetMenuCheck();
			break;
		case IDM_VIEW_FLITER:
			g_sViewMode= SMODE_VIEW_FLITER;
			ResetMenuCheck();
			break;
		case IDM_VIEW_TARGET:
			g_sViewMode= SMODE_VIEW_TARGET;
			ResetMenuCheck();
			break;
		case IDM_VIEW_BLANK:
			g_sViewMode= SMODE_VIEW_BLANK;
			ResetMenuCheck();
			break;
		case IDM_UPDATE_STATIC:
			ChangeUpdateMode(g_sViewMode, SMODE_UPDATE_STATIC);
			g_sUpdateMode= SMODE_UPDATE_STATIC;
			ResetMenuCheck();
			break;
		case IDM_UPDATE_VIDEO:
			ChangeUpdateMode(g_sViewMode, SMODE_UPDATE_VIDEO);
			g_sUpdateMode= SMODE_UPDATE_VIDEO;
			ResetMenuCheck();
			break;
		case IDM_UPDATE_CAPTURE:
			ChangeUpdateMode(g_sViewMode, SMODE_UPDATE_CAPTURE);
			g_sUpdateMode= SMODE_UPDATE_CAPTURE;
			ResetMenuCheck();
			break;
		case IDM_FILE_SAVE:
		{
			SYSTEMTIME t;
			::GetSystemTime(&t);
			char c[512];
			sprintf(c, "Capture%dY%dM%dD%dH%dM%d.bmp", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wMilliseconds);
			g_pDisplay->GetBackSurface()->SaveImageAsBMP(c);
			break;
		}
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;
	}
	return FALSE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?