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 + -
显示快捷键?