219 lines
5.1 KiB
C++
219 lines
5.1 KiB
C++
#include "stdafx.h"
|
|
#include "CDrawingBoard.h"
|
|
#include "afxdialogex.h"
|
|
#include "Resource.h"
|
|
|
|
IMPLEMENT_DYNAMIC(CDrawingBoard, CDialog)
|
|
|
|
CDrawingBoard::CDrawingBoard(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject)
|
|
: DialogBase(IDD_DRAWING_BOARD, pParent, IOCPServer, ContextObject, IDI_ICON_DRAWING),
|
|
m_bDrawing(false)
|
|
{
|
|
m_bTopMost = true;
|
|
m_bTransport = true;
|
|
m_bMoving = false;
|
|
m_bSizing = false;
|
|
}
|
|
|
|
CDrawingBoard::~CDrawingBoard()
|
|
{
|
|
}
|
|
|
|
void CDrawingBoard::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CDrawingBoard, CDialog)
|
|
ON_WM_CLOSE()
|
|
ON_WM_SIZE()
|
|
ON_WM_PAINT()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_WINDOWPOSCHANGED()
|
|
ON_COMMAND(ID_DRAWING_TOPMOST, &CDrawingBoard::OnDrawingTopmost)
|
|
ON_COMMAND(ID_DRAWING_TRANSPORT, &CDrawingBoard::OnDrawingTransport)
|
|
ON_COMMAND(ID_DRAWING_MOVE, &CDrawingBoard::OnDrawingMove)
|
|
ON_COMMAND(ID_DRAWING_SIZE, &CDrawingBoard::OnDrawingSize)
|
|
ON_COMMAND(ID_DRAWING_CLEAR, &CDrawingBoard::OnDrawingClear)
|
|
END_MESSAGE_MAP()
|
|
|
|
void CDrawingBoard::OnReceiveComplete()
|
|
{
|
|
// 接收时处理逻辑(暂空)
|
|
}
|
|
|
|
void CDrawingBoard::OnClose()
|
|
{
|
|
CancelIO();
|
|
if (IsProcessing()) {
|
|
ShowWindow(SW_HIDE);
|
|
return;
|
|
}
|
|
DialogBase::OnClose();
|
|
}
|
|
|
|
void CDrawingBoard::OnPaint()
|
|
{
|
|
CPaintDC dc(this);
|
|
|
|
CPen pen(PS_SOLID, 2, RGB(0, 0, 0));
|
|
CPen* pOldPen = dc.SelectObject(&pen);
|
|
|
|
for (const auto& path : m_paths)
|
|
{
|
|
if (path.size() < 2) continue;
|
|
|
|
dc.MoveTo(path[0]);
|
|
for (size_t i = 1; i < path.size(); ++i)
|
|
dc.LineTo(path[i]);
|
|
}
|
|
|
|
if (m_bDrawing && m_currentPath.size() >= 2)
|
|
{
|
|
dc.MoveTo(m_currentPath[0]);
|
|
for (size_t i = 1; i < m_currentPath.size(); ++i)
|
|
dc.LineTo(m_currentPath[i]);
|
|
}
|
|
|
|
dc.SelectObject(pOldPen);
|
|
}
|
|
|
|
void CDrawingBoard::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
m_bDrawing = true;
|
|
m_currentPath.clear();
|
|
m_currentPath.push_back(point);
|
|
|
|
SetCapture();
|
|
}
|
|
|
|
void CDrawingBoard::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_bDrawing)
|
|
{
|
|
m_currentPath.push_back(point);
|
|
Invalidate(FALSE);
|
|
|
|
// 发送当前点
|
|
BYTE pkg[1 + sizeof(POINT)] = { CMD_DRAW_POINT };
|
|
memcpy(pkg + 1, &point, sizeof(POINT));
|
|
m_ContextObject->Send2Client((BYTE*)pkg, sizeof(pkg));
|
|
}
|
|
}
|
|
|
|
void CDrawingBoard::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_bDrawing)
|
|
{
|
|
m_bDrawing = false;
|
|
m_currentPath.push_back(point);
|
|
ReleaseCapture();
|
|
|
|
m_paths.push_back(m_currentPath);
|
|
Invalidate();
|
|
|
|
// 发送结束命令,表示当前路径完成
|
|
BYTE endCmd = CMD_DRAW_END;
|
|
m_ContextObject->Send2Client(&endCmd, 1);
|
|
}
|
|
}
|
|
|
|
void CDrawingBoard::OnWindowPosChanged(WINDOWPOS* lpwndpos)
|
|
{
|
|
CDialog::OnWindowPosChanged(lpwndpos);
|
|
if (!m_bMoving) return;
|
|
|
|
CRect rect;
|
|
GetWindowRect(&rect); // 获取当前窗口屏幕位置
|
|
BYTE pkg[1 + sizeof(CRect)] = { CMD_MOVEWINDOW };
|
|
if (!m_bSizing) {
|
|
rect.right = rect.left;
|
|
rect.bottom = rect.top;
|
|
}
|
|
memcpy(pkg + 1, &rect, sizeof(CRect));
|
|
m_ContextObject->Send2Client((BYTE*)pkg, sizeof(pkg));
|
|
}
|
|
|
|
void CDrawingBoard::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
if (!m_bSizing) return;
|
|
|
|
// 发送新的窗口尺寸到客户端
|
|
int sizeData[2] = { cx, cy };
|
|
BYTE pkg[sizeof(sizeData) + 1] = { CMD_SET_SIZE };
|
|
memcpy(pkg + 1, &sizeData, sizeof(sizeData));
|
|
m_ContextObject->Send2Client((PBYTE)pkg, sizeof(pkg));
|
|
}
|
|
|
|
void CDrawingBoard::OnDrawingTopmost()
|
|
{
|
|
m_bTopMost = !m_bTopMost;
|
|
BYTE cmd[2] = { CMD_TOPMOST, m_bTopMost };
|
|
m_ContextObject->Send2Client((PBYTE)cmd, sizeof(cmd));
|
|
HMENU hMenu = ::GetMenu(this->GetSafeHwnd());
|
|
int n = m_bTopMost ? MF_CHECKED : MF_UNCHECKED;
|
|
::CheckMenuItem(hMenu, ID_DRAWING_TOPMOST, MF_BYCOMMAND | n);
|
|
}
|
|
|
|
|
|
void CDrawingBoard::OnDrawingTransport()
|
|
{
|
|
m_bTransport = !m_bTransport;
|
|
BYTE cmd[2] = { CMD_TRANSPORT, m_bTransport };
|
|
m_ContextObject->Send2Client((PBYTE)cmd, sizeof(cmd));
|
|
HMENU hMenu = ::GetMenu(this->GetSafeHwnd());
|
|
int n = m_bTransport ? MF_CHECKED : MF_UNCHECKED;
|
|
::CheckMenuItem(hMenu, ID_DRAWING_TRANSPORT, MF_BYCOMMAND | n);
|
|
}
|
|
|
|
|
|
void CDrawingBoard::OnDrawingMove()
|
|
{
|
|
m_bMoving = !m_bMoving;
|
|
HMENU hMenu = ::GetMenu(this->GetSafeHwnd());
|
|
int cmd = m_bMoving ? MF_CHECKED : MF_UNCHECKED;
|
|
::CheckMenuItem(hMenu, ID_DRAWING_MOVE, MF_BYCOMMAND | cmd);
|
|
}
|
|
|
|
|
|
void CDrawingBoard::OnDrawingSize()
|
|
{
|
|
m_bSizing = !m_bSizing;
|
|
HMENU hMenu = ::GetMenu(this->GetSafeHwnd());
|
|
int cmd = m_bSizing ? MF_CHECKED : MF_UNCHECKED;
|
|
::CheckMenuItem(hMenu, ID_DRAWING_SIZE, MF_BYCOMMAND | cmd);
|
|
}
|
|
|
|
|
|
BOOL CDrawingBoard::OnInitDialog()
|
|
{
|
|
DialogBase::OnInitDialog();
|
|
|
|
SetIcon(m_hIcon, TRUE);
|
|
SetIcon(m_hIcon, FALSE);
|
|
|
|
CString str;
|
|
str.Format("%s - 画板演示", m_IPAddress);
|
|
SetWindowText(str);
|
|
|
|
HMENU hMenu = ::GetMenu(this->GetSafeHwnd());
|
|
::CheckMenuItem(hMenu, ID_DRAWING_TOPMOST, MF_BYCOMMAND | MF_CHECKED);
|
|
::CheckMenuItem(hMenu, ID_DRAWING_TRANSPORT, MF_BYCOMMAND | MF_CHECKED);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CDrawingBoard::OnDrawingClear()
|
|
{
|
|
m_paths.clear();
|
|
m_currentPath.clear();
|
|
BYTE cmd[2] = { CMD_DRAW_CLEAR, 0 };
|
|
m_ContextObject->Send2Client((PBYTE)cmd, sizeof(cmd));
|
|
if (m_hWnd && IsWindow(m_hWnd))
|
|
::InvalidateRect(m_hWnd, NULL, TRUE); // 重绘整个窗口,清除痕迹
|
|
}
|