兩個獨立程式:發送端 透過 UDP 發送結構體資料(圓心座標、半徑、顏色)→ 接收端 解析資料並在視圖類別中繪製圓形。
struct CircleData {
int x, y, r, color; // 固定長度,不可含 CString 等變長型別
};
void CFasonDlg::OnSend() {
UpdateData(TRUE);
CircleData data;
data.x = m_x; data.y = m_y; data.r = m_r;
// 顏色下拉選單對應
CString str; m_Cob.GetLBText(m_Cob.GetCurSel(), str);
if (str == L"Red") data.color = 1;
else if (str == L"Green") data.color = 2;
else if (str == L"Blue") data.color = 3;
CAsyncSocket sock;
sock.Create(2330, SOCK_DGRAM);
sock.SendTo(&data, sizeof(data), 3550, L"127.0.0.1");
sock.Close();
UpdateData(FALSE);
}
// CDASocket 繼承自 CAsyncSocket
void CDASocket::OnReceive(int nErrorCode) {
char buf[256];
int ret = Receive(buf, 256);
if (ret != SOCKET_ERROR)
m_pDoc->ProcessData(buf); // 轉交文檔處理
CAsyncSocket::OnReceive(nErrorCode);
}
void CJieshouDoc::ProcessData(char* pBuf) {
CircleData* pData = (CircleData*)pBuf;
m_circle = *pData; // 複製到文檔成員
UpdateAllViews(nullptr); // 觸發視圖重繪
}
void CJieshouView::OnDraw(CDC* pDC) {
CJieshouDoc* pDoc = GetDocument();
CBrush brush;
switch (pDoc->m_circle.color) {
case 1: brush.CreateSolidBrush(RGB(255,0,0)); break;
case 2: brush.CreateSolidBrush(RGB(0,255,0)); break;
case 3: brush.CreateSolidBrush(RGB(0,0,255)); break;
}
CBrush* pOld = pDC->SelectObject(&brush);
pDC->Ellipse(pDoc->m_circle.x - pDoc->m_circle.r,
pDoc->m_circle.y - pDoc->m_circle.r,
pDoc->m_circle.x + pDoc->m_circle.r,
pDoc->m_circle.y + pDoc->m_circle.r);
pDC->SelectObject(pOld);
}
SendTo 傳輸完整資料,避免封包碎片