Giao tieáp quang baùo vôùi maùy tính ñöôïc thieát keá döïa treân cô sôû laäp trình WINDOWS. Chöông trình giao tieáp quang baùo ñöôïc vieát döïa treân öùng duïng thö vieän cuûa MFC. Ñaây laø kyõ thuaät laäp trình phaùt trieån phaàn meàn döïa vaøo thö vieän coù saün cuûa MFC. Laäp trình WINDOWS laø xöû lyù haøng loaït caùc söï kieän phaùt sinh trong khi chaïy öùng duïng. Vì vaäy maø chöông trình luoân luoân chaïy trong moät voøng laëp chôø söï kieän. Caùc söï kieän lieän quan ñeán phaàn meàm giao tieáp quang baùo
Trang 1SVTH: Đặng Tiến Dũng Trang 145
I GIỚI THIỆU
Giao tiếp quang báo với máy tính được thiết kế dựa trên cơ sở lập trình WINDOWS Chương trình giao tiếp quang báo được viết dựa trên ứng dụng thư viện của MFC Đây là kỹ thuật lập trình phát triển phần mền dựa vào thư viện có sẵn của MFC
Lập trình WINDOWS là xử lý hàng loạt các sự kiện phát sinh trong khi chạy ứng dụng Vì vậy mà chương trình luôn luôn chạy trong một vòng lặp chờ sự kiện
Các sự kiện liện quan đến phần mềm giao tiếp quang báo:
1.1 Sự kiện tạo một file hình ảnh
Để tạo một file hình ảnh thì liên quan đến hàng loạt các sự kiện:
Sự kiện di chuyển chuột trong vùng làm việc thì chương trình sẽ báo cho biết chuột đang di chuyển ở tọa độ điểm ảnh nào Nếu ngoài vùng làm việc thì không có báo gì hết
Sự kiện nhấn chuột trái nếu đang trong vùng làm việc thì thay đổi điểm ảnh đó tuỳ thuộc vào thuộc tính của việc chọn màu Nếu ngoài vùng làm việu thì không có xử lý gì hết
Sự kiện nhấn chuột phải tạo một menu để chọn thuộc tính
1.2 Sự kiện quang báo gửi dữ liệu về
Tuỳ thuộc vào dữ liệu mà phần giao tiếp tiếp tục xử lý
Trang 2SVTH: Đặng Tiến Dũng Trang 146
II NGUYÊN LÝ HOẠT ĐỘNG
Khi mở giao diện thì chương trình tự động chọn new file Lúc này chương trình cho phép người soạn thảo tác động vào để soạn thảo file hình ảnh cho quang báo Soạn thảo bằng cách sử dụng chuột Nhấn chuột trái trên vùng làm việc để vẽ điểm ảnh đó Để thay đổi màu sắc, kích thước chọn thuộc tính trên thanh công cụ Sau khi soạn thảo xong thì save lại với file có đuôi là (.HBA)
Do file văn bản trên WINDOWS có sẵn nên chỉ cần soạn file text bình thường sau đó save file có đuôi là (.VBA)
Gửi quang báo là truyền file đã biên soạn sẵn trên máy tính cho quang báo Khi mở giao diện gửi quang báo, đầu tiên máy tính sẽ gửi một mã lệnh thông báo cho quang báo biết là có sự tồn tại của máy tính đối với quang báo Khi quang báo nhận được mã lệnh này thì quang báo gửi dữ liệu trả lời Và nếu như máy tính nhận được thì việc bắt tay giữa máy tính và quang báo coi như thành công
Tiếp theo máy tính gửi tiếp một mã lệnh yêu cầu bên quang báo cho biết thuộc tính dung lượng Nếu máy tính nhận được dữ liệu thuộc tính này thì chương trình sẽ chuyển đổi thành dữ liệu hiển thị gúp cho người sử dụng biết đồng thời cho phép chọn file để gửi đi
Nếu không có vấn đề về dung lượng , tên file thì việc truyền file được bắt đầu Khi thanh tiến độ báo 100% thì việc truyền file là kết thúc
Trang 3SVTH: Đặng Tiến Dũng Trang 147
III LƯU ĐỒ GIẢI THUẬT
3.1 Sự kiện di chuyển chuột
3.2 Sự kiện nhấn chuột trái
START
Vùng làm việc
?
Không hiển thị
Thoát.
N
Y Hiển thị tọa độ điểm ảnh
? Vẽ điểm ảnh tại toạ độ hiển thị
Trang 4SVTH: Đặng Tiến Dũng Trang 148
3.3 Lưu đồ gửi quang báo
Biên dịch dữ liệu Truyền dữ liệu
START Lặp = 0
Cho phép chọn file
Thoát.
N
Y Bắt tay ?
N
Y
Lặp +1, Lặp =10 ?
Y
N
Đủ điều kiện ?
Trang 5SVTH: Đặng Tiến Dũng Trang 149
IV PHẦN MỀM:
// hinhanhView.cpp : implementation of the CHinhanhView class
Trang 6SVTH: Đặng Tiến Dũng Trang 150
// TODO: add construction code here
for (long i=0;i<2048;i++)
Trang 7SVTH: Đặng Tiến Dũng Trang 151
void CHinhanhView::OnDraw(CDC* pDC)
{
CHinhanhDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBrush choito, *choitocu;
if (m_array[i*16+j]=='c') choito.CreateSolidBrush(RGB(0, 255, 0));//mau xanh else
if (m_array[i*16+j]=='d') choito.CreateSolidBrush(RGB(255, 255, 0));//mau vang choitocu = pDC->SelectObject(&choito);
pDC->Rectangle (i*m_Size, j*m_Size, (i+1)*m_Size, (j+1)*m_Size);
pDC->SelectObject(choitocu);
choito.DeleteObject();
} }
Trang 8SVTH: Đặng Tiến Dũng Trang 152
}
#endif //_DEBUG
// CHinhanhView message handlers
void CHinhanhView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
Trang 9SVTH: Đặng Tiến Dũng Trang 153
Trang 10SVTH: Đặng Tiến Dũng Trang 154
Trang 11SVTH: Đặng Tiến Dũng Trang 155
Trang 12SVTH: Đặng Tiến Dũng Trang 156
// TODO: Add your command handler code here
// TODO: Add your command handler code here
char szFilters[] ="Quang bao files (*.hba)";
CFileDialog dlg(true, _T("hba"), _T("*.hba"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilters);
if (dlg.DoModal () == IDOK)
{
m_Fname =dlg.GetPathName (); // L.y tên file open CStdioFile f2(m_Fname, CFile::modeRead | CFile ::typeBinary); f2.Read(m_array,2048);
SetScrollPos(SB_HORZ,0,true);
CClientDC dc (this);
OnDraw(&dc);
Trang 13SVTH: Đặng Tiến Dũng Trang 157
}
}
void CHinhanhView::OnFileSaveAs()
{
// TODO: Add your command handler code here
char szFilters[] ="Quang bao files (*.hba)";
CFileDialog dlg(false, _T("hba"), _T("*.hba"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilters);
if (dlg.DoModal () == IDOK)
{
m_Fname =dlg.GetPathName (); // L.y tên file open CStdioFile f2(m_Fname, CFile::modeCreate |CFile::modeWrite | CFile ::typeBinary);
Trang 14SVTH: Đặng Tiến Dũng Trang 158
Trang 15SVTH: Đặng Tiến Dũng Trang 159
DDX_Control(pDX, IDC_PROGRESS1, m_SB);
DDX_Radio(pDX, IDC_RADIO3, m_Kieufile);
DDX_Control(pDX, IDC_MSCOMM1, m_Com);
DDX_Radio(pDX, IDC_KHOIDONG, m_khoidong);
Trang 16SVTH: Đặng Tiến Dũng Trang 160
// EXCEPTION: OCX Property Pages should return FALSE
else GetDlgItem(IDC_TEN)->SetWindowText("");
m_Delay++;
if(m_Delay==20)
{ GetDlgItem(IDC_TEN)->SetWindowText("");
AfxMessageBox("Co loi truy cap cong com 1
!\nBan co gang kiem tra lai.");
Trang 17SVTH: Đặng Tiến Dũng Trang 161
str.Format("Dung lượng: 20480 byte\nSử dụng: %ld
byte\nCòn trống: %ld byte",t1,t2);
GetDlgItem(IDC_TEN)->SetWindowText(str); GetDlgItem(IDC_SENTO)->ShowWindow(true); GetDlgItem(IDC_PHONG)->ShowWindow(false); GetDlgItem(IDC_PHONG)->ShowWindow(true);
} break;
m_Com.SetOutput(COleVariant(array));
if(i%6==0) {
m_SB.SetPos(i/6);
CString str;
str.Format("%d",i/6);
GetDlgItem(IDC_TYLE1) ->SetWindowText(str+" %"); }
} }
else {
if(t==0)t=1;
for(long
i=0;i<m_Chuoivanban.GetSize();i++)
Trang 18SVTH: Đặng Tiến Dũng Trang 162
{ array[0]=m_Chuoivanban[i];
m_Com.SetOutput(COleVariant(array));
if(i%t==0) {
m_SB.SetPos(i/t);
CString str;
str.Format("%d",i/t);
GetDlgItem(IDC_TYLE1) ->SetWindowText(str+" %"); }
} array[0]=255;
m_Com.SetOutput(COleVariant(array)); array[0]=252;
{ array[0]=254;
m_Com.SetOutput(COleVariant(array));
} array[0]=255;
}
Trang 19SVTH: Đặng Tiến Dũng Trang 163
else {
// TODO: Add your control notification handler code here
CString fname, tenfile;
UpdateData(true);
if(m_Kieufile == 1)
{
char szFilters[] ="Quang bao files (*.hba)";
CFileDialog dlg(true, _T("hba"), _T("*hba"),
OFN_OVERWRITEPROMPT, szFilters);
if (dlg.DoModal () == IDOK) {
Trang 20SVTH: Đặng Tiến Dũng Trang 164
if(m_Dungluong<2)AfxMessageBox("Bo nho bi day!
");
else {
} }
else
{
char szFilters[] ="Quang bao files (*.vba)";
CFileDialog dlg(true, _T("vba"), _T("*vba"),
OFN_OVERWRITEPROMPT, szFilters);
if (dlg.DoModal () == IDOK) {
else {
Trang 21SVTH: Đặng Tiến Dũng Trang 165
} }
SafeArrayGetUBound(varInput.parray,1,&u);
for(ix=l;ix<=u;ix++)
{ SafeArrayGetElement(varInput.parray,&ix,&bit); ByteBuf.Add(bit);
Trang 22SVTH: Đặng Tiến Dũng Trang 166
} }
Trang 23SVTH: Đặng Tiến Dũng Trang 167
array.Add(53);
} break;
{ array.Add(243);
array.Add(53);
} break;
{ array.Add(244);
Trang 24SVTH: Đặng Tiến Dũng Trang 168
array.Add(53);
} break;
{ array.Add(240);
array.Add(53);
} break;
Trang 25SVTH: Đặng Tiến Dũng Trang 169
array.Add(139);
} break;
{ array.Add(238);
array.Add(139);
} break;
{ array.Add(239);
array.Add(139);
} break;
Trang 26SVTH: Đặng Tiến Dũng Trang 170
{ array.Add(240);
array.Add(139);
} break;
Trang 27SVTH: Đặng Tiến Dũng Trang 171
Trang 28SVTH: Đặng Tiến Dũng Trang 172
if((str.GetAt(i)=='^')&&(i+1<str.GetLength()))
{ switch (str.GetAt(i+1))
Trang 29SVTH: Đặng Tiến Dũng Trang 173
} break;
case 'È':
{ array.SetAt(array.GetSize()-1,matam-3); array.InsertAt(array.GetSize()-1,247);
}
Trang 30SVTH: Đặng Tiến Dũng Trang 174
break;
case 'Ú':
{ array.SetAt(array.GetSize()-1,matam-3); array.InsertAt(array.GetSize()-1,249);
} break;
case 'Ü':
{ array.SetAt(array.GetSize()-1,matam-3); array.InsertAt(array.GetSize()-1,251);
} break;
case 'Ë':
{ array.SetAt(array.GetSize()-1,matam-3); array.InsertAt(array.GetSize()-1,234);
} break;
case 'Á':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,245);
} break;
case 'À':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,247);
} break;
case 'Å':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,249);
} break;
case 'Ã':
{
Trang 31SVTH: Đặng Tiến Dũng Trang 175
array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,251);
} break;
case 'Ä':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,234);
} break;
} }
{
matam=152;
array.Add(150);
} if(str.GetAt(i)=='ơ')array.Add(154);
if(str.GetAt(i)=='u')array.Add(166);
if(str.GetAt(i)=='ư')array.Add(168);
if(str.GetAt(i)=='y')array.Add(177);
if(i+1<str.GetLength())
Trang 32SVTH: Đặng Tiến Dũng Trang 176
switch (str.GetAt(i+1))
{ case 'ê':array.SetAt(array.GetSize()-1,matam-2);
} break;
case 'è':
{ array.SetAt(array.GetSize()-1,matam-2); array.InsertAt(array.GetSize()-1,220);
} break;
case 'ú':
{ array.SetAt(array.GetSize()-1,matam-2); array.InsertAt(array.GetSize()-1,222);
} break;
case 'ü':
{ array.SetAt(array.GetSize()-1,matam-2); array.InsertAt(array.GetSize()-1,224);
}
Trang 33SVTH: Đặng Tiến Dũng Trang 177
break;
case 'ë':
{ array.SetAt(array.GetSize()-1,matam-2); array.InsertAt(array.GetSize()-1,234);
} break;
case 'á':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,218);
} break;
case 'à':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,220);
} break;
case 'å':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,222);
} break;
case 'ã':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,224);
} break;
case 'ä':
{ array.SetAt(array.GetSize()-1,matam); array.InsertAt(array.GetSize()-1,234);
} break;
} }
Trang 34SVTH: Đặng Tiến Dũng Trang 178
t+=pow(2,7-(j-k));
if(j==7)
{ ma.Add(t);
t=0;
k=8;
} }
t+=pow(2,7-(j-k));
if(j==7)
{ ma.Add(t);
t=0;
k=8;
} }
ma.Add(t);
Trang 35SVTH: Đặng Tiến Dũng Trang 179
V HƯỚNG DẪN SỬ DỤNG
Khi mở giao diện soạn file cho quang báo chương trình tự động chọn một file mới như sau:
Trang 36SVTH: Đặng Tiến Dũng Trang 180
Để vễ hình bằng cách nhấn chuột trái vào điểm ảnh đó Để thay đổi màu sắc, kích thước chọn trên thanh công cụ Một ví dụ cho việc tạo ứng dụng file hình ảnh
Quá trình truyền một file sang quang báo
Đầu tiên chọn menu gửi quang báo
Nếu việc kết nối đúng thì sẽ cho phép chọn file để truyền
Trang 37SVTH: Ñaịng Tieân Duõng Trang 181
Coøn neâu bò loêi thì chöông trình seõ cháy lieđn túc voøng laịp trong 10 laăn ñeơ coẫ gaĩng tìm quang baùo
Neâu khođng coù quang baùo hoaịc coù loêi xạy ra thì chöông trình seõ thođng baùo loêi vaø keât thuùc chöông trình
Trang 38SVTH: Đặng Tiến Dũng Trang 182
Việc cài đặt khởi động quang báo hoặc không sẽ giúp cho quang báo khởi động lại hay không sau khi truyền file xong
Khi chọn file xong thì chương trình kiểm tra bộ nhớ nếu đủ điều kiện thì chương trình sẽ biên dịch và bắt đầu truyền Khi kết thúc truyền, thanh tiến độ báo 100%