第22课 在视频会议中加入共享白板

33 篇文章 2 订阅
31 篇文章 3 订阅

共享白板是视频会议中的常见功能,利用共享白板,参加会议的用户可以将己端绘制的图形分享给其他用户,这种功能可以作为桌面共享的有益补充存在,后期也可以用拓展成共享文档或共享画板。

一、共享白板实现的效果

共享白板

二、共享白板实现的原理

以画自由线为例,要将己端绘制的图形在对端同样绘制出来,就需要将己端所绘制图形的坐标等相关信息发送给对端,对端根据获取到的坐标依次将图形绘制出来即可。

通常将鼠标左键按下时鼠标所在的位置定为起点,鼠标左键松开时鼠标所在的位置定为终点,按住鼠标左键不松开时鼠标移动经过的坐标为中间绘制点。将这些坐标存入数组,然后依次连线即为所绘制的自由线图形。在己端可以边移动鼠标边连线,将数据传给对端时,对端可依据相关坐标信息依次将各点连线即可得到与己端相同的图形。

三、共享白板实现的主要代码

1.鼠标左键按下时记录起点

void whiteBoard::OnLButtonDown(UINT nFlags, CPoint point)

{

CDialogEx::OnLButtonDown(nFlags, point);

CPoint mousePos;

GetCursorPos(&mousePos);

CRect rect;

::GetClientRect(picContainer.GetSafeHwnd(), &rect);

::ScreenToClient(picContainer.GetSafeHwnd(), &mousePos);

if (rect.PtInRect(mousePos))

{

          TRACE("point.x:%d\n", mousePos.x);

          TRACE("point.y:%d\n", mousePos.y);

          originPoint.x = mousePos.x;

          originPoint.y = mousePos.y;

          isDrawing = true;

          msg="";             

}

}

2.鼠标左键松开时记录终点

void whiteBoard::OnLButtonUp(UINT nFlags, CPoint point)

{

CDialogEx::OnLButtonUp(nFlags, point);

isDrawing = false;

mainDlg->sendFreeLineMsg(msg);

msg = "";

}

3.鼠标移动时绘制并记录坐标

void whiteBoard::OnMouseMove(UINT nFlags, CPoint point)

{       

CDialogEx::OnMouseMove(nFlags, point);

CWnd *pwnd = GetDlgItem(IDC_PIC);

CDC *pDC = pwnd->GetWindowDC();

CPen myPen(PS_SOLID, 1, RGB(255, 0, 0));

pDC->SelectObject(&myPen);

CPoint mousePos;

GetCursorPos(&mousePos);

CRect rect;

::GetClientRect(picContainer.GetSafeHwnd(), &rect);

::ScreenToClient(picContainer.GetSafeHwnd(), &mousePos);

if (rect.PtInRect(mousePos))

{

          if (isDrawing)

          {

                  pDC->MoveTo(originPoint);

                  pDC->LineTo(mousePos);

                  CString tmpStr;

                  tmpStr.Format(_T("%ld"), originPoint.x);            

                  msg += tmpStr;

                  msg += ",";

                  tmpStr.Format(_T("%ld"), originPoint.y);

                  msg += tmpStr;

                  msg += ",";

                  tmpStr.Format(_T("%ld"), mousePos.x);

                  msg += tmpStr;

                  msg += ",";

                  tmpStr.Format(_T("%ld"), mousePos.y);

                  msg += tmpStr;

                  msg += ";";                         

                  originPoint = mousePos;

          }

}

}

4.对端接收到数据时依次绘制

void whiteBoard::drawFreeline(CString msg)

{

isDrawing = false;

CWnd *pwnd = GetDlgItem(IDC_PIC);

CDC *pDC = pwnd->GetWindowDC();

CPen myPen(PS_SOLID, 1, RGB(0, 0, 255));

pDC->SelectObject(&myPen);

CPoint originPoint;

CPoint mousePos;     

char s = { ';'};

CStringArray *pointArr = SplitString(msg, s);

int   size = pointArr->GetSize();       for (int i = 0; i < size; i++)

{   //的数据

          CString strTmp = pointArr->GetAt(i);

          char ss = { ',' };

          CStringArray *tmpArr = SplitString(strTmp, ss);

          if (tmpArr->GetSize() == 4){

         

                  CString x0 = tmpArr->GetAt(0);

                  CString y0 = tmpArr->GetAt(1);

                  CString x1 = tmpArr->GetAt(2);

                  CString y1 = tmpArr->GetAt(3);

                  //TRACE("******************\n");

                  //TRACE(x0);

                  //TRACE("******************\n");

                  originPoint.x = _ttol(x0);

                  originPoint.y = _ttol(y0);

                  pDC->MoveTo(originPoint);

                  mousePos.x = _ttol(x1);

                  mousePos.y = _ttol(y1);                      

                  pDC->LineTo(mousePos);

                  originPoint = mousePos;                     

          }

}      

}

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
以下是一个简单的Java共享白板的代码示例,实现了多客户端之间的共享绘图: 服务器端代码: ```java import java.io.*; import java.net.*; import java.util.*; public class Server { private List<Socket> clients = new ArrayList<>(); private ServerSocket server; public Server(int port) { try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } public void start() { System.out.println("Server started."); while (true) { try { Socket client = server.accept(); clients.add(client); System.out.println("New client connected from " + client.getInetAddress().getHostAddress()); new Thread(new ClientHandler(client)).start(); } catch (IOException e) { e.printStackTrace(); } } } private class ClientHandler implements Runnable { private Socket client; private ObjectInputStream in; private ObjectOutputStream out; public ClientHandler(Socket client) { this.client = client; try { in = new ObjectInputStream(client.getInputStream()); out = new ObjectOutputStream(client.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { Object data; while (true) { try { data = in.readObject(); for (Socket c : clients) { if (c != client) { ObjectOutputStream cOut = new ObjectOutputStream(c.getOutputStream()); cOut.writeObject(data); cOut.flush(); } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); clients.remove(client); break; } } } } public static void main(String[] args) { Server server = new Server(8888); server.start(); } } ``` 客户端代码: ```java import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; public class Client { private Socket socket; private ObjectOutputStream out; private ObjectInputStream in; private WhiteBoard board; public Client(String host, int port) { try { socket = new Socket(host, port); out = new ObjectOutputStream(socket.getOutputStream()); in = new ObjectInputStream(socket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } public void start() { SwingUtilities.invokeLater(() -> { board = new WhiteBoard(); board.setVisible(true); board.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } }); }); Object data; while (true) { try { data = in.readObject(); if (data instanceof WhiteBoardData) { SwingUtilities.invokeLater(() -> { board.draw((WhiteBoardData) data); }); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); break; } } } private class WhiteBoard extends JFrame { private JPanel canvas; public WhiteBoard() { setTitle("White Board"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); canvas = new JPanel(); canvas.setBackground(Color.WHITE); canvas.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { try { out.writeObject(new WhiteBoardData(e.getX(), e.getY(), true)); out.flush(); } catch (IOException ex) { ex.printStackTrace(); } } @Override public void mouseReleased(MouseEvent e) { try { out.writeObject(new WhiteBoardData(e.getX(), e.getY(), false)); out.flush(); } catch (IOException ex) { ex.printStackTrace(); } } }); add(canvas); } public void draw(WhiteBoardData data) { Graphics g = canvas.getGraphics(); g.setColor(Color.BLACK); if (data.isStart()) { g.fillOval(data.getX() - 5, data.getY() - 5, 10, 10); } else { g.drawLine(data.getX(), data.getY(), data.getLastX(), data.getLastY()); } } } private static class WhiteBoardData implements Serializable { private int x, y; private int lastX, lastY; private boolean start; public WhiteBoardData(int x, int y, boolean start) { this.x = x; this.y = y; this.start = start; } public int getX() { return x; } public int getY() { return y; } public int getLastX() { return lastX; } public int getLastY() { return lastY; } public boolean isStart() { return start; } public void setLastX(int lastX) { this.lastX = lastX; } public void setLastY(int lastY) { this.lastY = lastY; } } public static void main(String[] args) { Client client = new Client("localhost", 8888); client.start(); } } ``` 以上代码实现了一个简单的Java共享白板,可以同时有多个客户端进行绘图,并实时共享绘图数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西部秋虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值