/*
Copyright (c) 2001
Author: Konstantin Boukreev
E-mail: konstantin@mail.primorye.ru
Created: 01.11.2001 17:39:39
Version: 1.0.0
*/
/*
bugs : sometimes, it doesn't draw anything in a top desk even if the pattern was recognized
*/
#include "stdafx.h"
#include "board.h"
#include "resource.h"
#include "GestureData.h"
const int DESK_WIDTH = 100;
const int DESK_HEIGHT = 100;
const int STATUS_HEIGHT = 20;
const int STATUS_INDENT = 2;
const double pi = 3.1415926535;
#ifdef max
#undef max
#endif
Board::Board(unsigned range)
:
NUMBER_OF_ANGLES(range),
NUMBER_OF_ANCHOR_POINTS(range + 1),
m_angles (NUMBER_OF_ANGLES),
m_cosines(NUMBER_OF_ANGLES),
m_sinuses(NUMBER_OF_ANGLES),
m_hpdesk(NUMBER_OF_ANGLES / 4),
m_mode(untrained_mode)
{
m_refresh = false;
// m_timestamp = 0;
m_hMemDC = 0;
m_hBitmap = 0;
m_hOldBitmap = 0;
m_hMemDC2 = 0;
m_hBitmap2 = 0;
m_hOldBitmap2 = 0;
m_hMemDC3 = 0;
m_hBitmap3 = 0;
m_hOldBitmap3 = 0;
m_hMemDC4 = 0;
m_hBitmap4 = 0;
m_hOldBitmap4 = 0;
m_hbrh1 = CreateSolidBrush(RGB(255, 255, 255));
m_hbrh2 = CreateSolidBrush(RGB(231, 231, 231));
m_hpen1 = CreatePen(PS_SOLID, 0, RGB(0, 0, 128));
m_hpen2 = CreatePen(PS_SOLID, 0, RGB(192, 192, 192));
m_hpen3 = CreatePen(PS_SOLID, 0, RGB(255, 0, 0));
m_hpen4 = CreatePen(PS_DOT, 0, RGB(221, 221, 221));
unsigned dc = 255 / m_hpdesk.size();
for (unsigned i = 0; i < m_hpdesk.size(); ++i)
{
m_hpdesk[i] = CreatePen(PS_SOLID, 0, RGB(255 - i * dc, 0, i * dc));
}
}
Board::~Board()
{
CleanupMemDC();
if (m_hbrh1) DeleteObject(m_hbrh1);
if (m_hbrh2) DeleteObject(m_hbrh2);
if (m_hpen1) DeleteObject(m_hpen1);
if (m_hpen2) DeleteObject(m_hpen2);
if (m_hpen3) DeleteObject(m_hpen3);
if (m_hpen4) DeleteObject(m_hpen4);
for (unsigned i = 0; i < m_hpdesk.size(); ++i)
if (m_hpdesk[i]) DeleteObject(m_hpdesk[i]);
}
LRESULT Board::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
RECT rc;
GetClientRect(&rc);
PAINTSTRUCT ps;
HDC hDC = BeginPaint(&ps);
Draw(hDC, rc);
EndPaint(&ps);
return 0;
}
LRESULT Board::OnEraseBknd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return 1;
}
LRESULT Board::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CleanupMemDC();
return 0;
}
LRESULT Board::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (wParam & MK_RBUTTON)
{
POINT pt = {LOWORD(lParam), HIWORD(lParam)};
AddMouseRecord(pt);
}
return 0;
}
LRESULT Board::OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// at first always tries to stop any active action (training or testing)
CWindow(GetParent()).SendMessage(WM_COMMAND, MAKEWPARAM(ID_STOP, 0));
StartMouseRecord();
return 0;
}
LRESULT Board::OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
StopMouseRecord();
return 0;
}
LRESULT Board::OnAsyncRefresh(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
MSG msg;
while (PeekMessage(&msg, m_hWnd, WM_ASYNC_REFRESH, WM_ASYNC_REFRESH, PM_REMOVE))
;
Refresh();
return 0;
}
void Board::Draw(HDC hDC, RECT& rc)
{
if (!m_hMemDC)
CreateMemDC(hDC, rc);
if (m_refresh)
{
DrawMemDC();
m_refresh = false;
}
BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
m_hMemDC, 0, 0, SRCCOPY);
// m_timestamp = GetTickCount();
}
void Board::CreateMemDC(HDC hDC, RECT& rc)
{
CleanupMemDC();
m_hMemDC = CreateCompatibleDC(hDC);
m_hBitmap = CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
m_hMemDC2 = CreateCompatibleDC(hDC);
m_hBitmap2 = CreateCompatibleBitmap(hDC, DESK_WIDTH, DESK_HEIGHT);
m_hOldBitmap2 = (HBITMAP)SelectObject(m_hMemDC2, m_hBitmap2);
m_hMemDC3 = CreateCompatibleDC(hDC);
m_hBitmap3 = CreateCompatibleBitmap(hDC, rc.right - rc.left - STATUS_INDENT * 2, STATUS_HEIGHT);
m_hOldBitmap3 = (HBITMAP)SelectObject(m_hMemDC3, m_hBitmap3);
m_hMemDC4 = CreateCompatibleDC(hDC);
m_hBitmap4 = CreateCompatibleBitmap(hDC, DESK_WIDTH, DESK_HEIGHT);
m_hOldBitmap4 = (HBITMAP)SelectObject(m_hMemDC4, m_hBitmap4);
m_refresh = true;
m_rcMemDC = rc;
}
void Board::CleanupMemDC()
{
if (m_hMemDC)
{
SelectObject(m_hMemDC, m_hOldBitmap);
DeleteDC(m_hMemDC);
DeleteObject(m_hBitmap);
SelectObject(m_hMemDC2, m_hOldBitmap2);
DeleteDC(m_hMemDC2);
DeleteObject(m_hBitmap2);
SelectObject(m_hMemDC3, m_hOldBitmap3);
DeleteDC(m_hMemDC3);
DeleteObject(m_hBitmap3);
SelectObject(m_hMemDC4, m_hOldBitmap4);
DeleteDC(m_hMemDC4);
DeleteObject(m_hBitmap4);
m_hMemDC = 0;
}
}
void Board::DrawMemDC()
{
unsigned cx = m_rcMemDC.right - m_rcMemDC.left;
unsigned cy = m_rcMemDC.bottom - m_rcMemDC.top;
int n_save_dc = SaveDC(m_hMemDC);
FillRect(m_hMemDC, &m_rcMemDC, m_hbrh1);
// draw grid
SelectObject(m_hMemDC, m_hpen4);
#define GRID_WIDTH 16
#define GRID_HEIGHT 16
for (int x = m_rcMemDC.left; x < m_rcMemDC.right; x += GRID_WIDTH)
{
MoveToEx(m_hMemDC, x, m_rcMemDC.top, 0);
LineTo (m_hMemDC, x, m_rcMemDC.bottom);
}
for (int y = m_rcMemDC.top; y < m_rcMemDC.bottom; y += GRID_HEIGHT)
{
MoveToEx(m_hMemDC, m_rcMemDC.left, y, 0);
LineTo (m_hMemDC, m_rcMemDC.right, y);
}
// draw main screen
if (training_mode == m_mode ||
trained_mode == m_mode)
{
RECT rc = m_rcMemDC;
rc.top += 3;
rc.left += 3;
rc.right -= (DESK_WIDTH + 3);
rc.bottom -= (STATUS_HEIGHT + 3);
DrawGraph(m_hMemDC, rc);
}
else
{
DrawPath(m_hMemDC, m_rcMemDC);
if (recognized_success == m_mode ||
recognized_fail == m_mode)
{
DrawWinners(m_hMemDC, m_rcMemDC);
}
}
// draw desks and status info
int x_desk = m_rcMemDC.right - DESK_WIDTH - 3;
int y_desk = m_rcMemDC.top + 3;
RECT rcDesc = {0, 0, DESK_WIDTH, DESK_HEIGHT};
DrawTopDesc(m_hMemDC2, rcDesc);
BLENDFUNCTION bf = {AC_SRC_OVER, 0, 150, 0};
AlphaBlend(m_hMemDC, x_desk, y_desk, DESK_WIDTH, DESK_HEIGHT,
m_hMemDC2, 0, 0, DESK_WIDTH, DESK_HEIGHT, bf);
y_desk += (DESK_HEIGHT + 3);
DrawBottomDesc(m_hMemDC2, rcDesc);
bf.SourceConstantAlpha = 170;
AlphaBlend(m_hMemDC, x_desk, y_desk, DESK_WIDTH, DESK_HEIGHT,
m_hMemDC2, 0, 0, DESK_WIDTH, DESK_HEIGHT, bf);
bf.SourceConstantAlpha = 150;
RECT rcStatus = {0, 0, cx - STATUS_INDENT * 2, STATUS_HEIGHT};
DrawStatusInfo(m_hMemDC3, rcStatus);
AlphaBlend(m_hMemDC, STATUS_INDENT, cy - STATUS_HEIGHT, cx - STATUS_INDENT * 2, STATUS_HEIGHT,
m_hMemDC3, 0, 0, cx - STATUS_INDENT * 2, STATUS_HEIGHT, bf);
RestoreDC(m_hMemDC, n_save_dc);
}
void Board::DrawWinners(HDC hDC, RECT& rc)
{
int n_save_dc = SaveDC(hDC);
SetBkMode (hDC, TRANSPARENT);
SetTextColor(hDC, RGB(191, 191, 191));
SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
char buf[255] = {0};
SIZE sz;
int x = rc.left + 3;
int y = rc.top + 3;
for (unsigned n = 0; n < sizeof(m_winners)/sizeof(m_winners[0]); ++n)
{
sprintf(buf, "%s - %f", pattern_names[m_winners[n].m_id], m_winners[n].m_probability);
TextOut(hDC, x, y, buf, lstrlen(buf));
GetTextExtentPoint32(hDC, buf, lstrlen(buf), &sz);
y += sz.cy;
}
RestoreDC(hDC, n_save_dc);
}
void Board::DrawPath(HDC hDC, RECT& rc)
{
typedef path_t::iterator iterator;
iterator i;
// draw a mouse's path
for (i = m_path.begin(); i != m_path.end(); ++i)
{
POINT& pt = (*i);
SetPixel(hDC, pt.x, pt.y, RGB(255, 0, 0));
}
_ASSERTE((m_path2.size() == NUMBER_OF_ANCHOR_POINTS) || (m_path2.size() == 0));
// draw a smoothed path
for (i = m_path2.begin(); i != m_path2.end(); ++i)
{
POINT& pt = (*i);
SetPixel(hDC, pt.x - 1, pt.y + 0, RGB(0, 0, 255));
SetPixel(hDC, pt.x + 1, pt.y + 0,
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
.rar (25个子文件)
SelectionSliderCtrl.h 4KB
stdafx.cpp 52B
AboutBox.h 3KB
kbase.h 8KB
Main.h 4KB
stdafx.h 783B
CustTestDlg.h 4KB
GestureApp.dsw 543B
GestureApp.dsp 6KB
TrainOptDlg.h 2KB
GestureLearn.h 6KB
AnimationCtrl.h 6KB
resource.h 2KB
Board.cpp 18KB
GestureApp.rc 8KB
ATLControls.h 168KB
MLNet.h 3KB
GestureApp.plg 3KB
GESTUREAPP.cpp 1KB
Res
b1.jpg 42KB
Board.h 4KB
Main.cpp 14KB
MLNet.cpp 8KB
GestureData.h 5KB
GESTUREAPP.idl 78B
共 25 条
- 1
资源评论
- WANGKAIJODAN2015-11-07还行吧,凑合能看!实用意义不大
- CT_DR_MR_CR2017-10-17一个外国人写的字符识别训练源码,有病毒?
ionlylovehebe
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功