¦þ¹ ¼³¾Šł
¦þ¹ ¼³¾Šł
¦þ¹ ¼³¾Šł
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
SetCommState(hCom, &dcb);<br />
Ñ ðàáîòîé ïîðòîâ ðàçîáðàëèñü. Òåïåðü íàïèøåì ãðàôè÷åñêóþ îáîëî÷êó äëÿ íàøåé<br />
ïðîãðàììû.<br />
Ïèøåì GUI<br />
 ïîñëåäíåå âðåìÿ ó ìíîãèõ íà÷èíàþùèõ ïðîãðàììèñòîâ ñëîæèëîñü âïå÷àòëåíèå, ÷òî<br />
ïèñàòü ïðîãðàììû, èñïîëüçóþùèå äèàëîãè (îêîøêè), áåç VCL èëè MFC î÷åíü ñëîæíî.<br />
À âñå èç-çà ñòåðåîòèïà, áóäòî ïðèõîäèòñÿ ïðîðèñîâàòü ðó÷êàìè êàæäóþ êíîïî÷êó. Íî<br />
ýòî ñîâñåì íå òàê. Íóæíî ïðîñòî èñïîëüçîâàòü ðåñóðñû. Íàïðèìåð, ïðè ïîìîùè òîãî<br />
æå Visual Studio ìû ñîçäàäèì äèàëîã, íàáðîñàåì íà íåãî ïðÿìî êàê â Delphi èëè C++<br />
Builder âñÿêèõ êíîïî÷åê è äðóãèõ íåîáõîäèìûõ íàì êîíòðîëîâ, à çàòåì ñîçäàäèì â íàøåé<br />
ïðîãðàììå ôóíêöèþ îáðàáîòêè ñîîáùåíèé. ×òî æ, ïðèñòóïèì.<br />
Äëÿ òîãî ÷òîáû ñëåïèòü æåëàåìûé äèàëîã, íàäî çàãðóçèòü íàø ïðîåêò â VS, ïåðåéòè â çàêëàäêó<br />
Resource View, à òàì êëèêíóòü ïðàâîé êíîïêîé ìûøêè è âûáðàòü Insert (èëè Add<br />
Resource äëÿ VS .NET). Òåáå ïðåäëîæàò ðàçíûå òèïû ðåñóðñîâ. Âûáèðàé Dialog. Ïîÿâèòñÿ<br />
ðåäàêòîð, î÷åíü ïîõîæèé íà ðåäàêòîð ôîðì â äåëüôÿõ. Ïîìåñòè drug`n`drop'îì íà äèàëîã<br />
äâå êíîïî÷êè: îäíó - äëÿ îòêðûòèÿ çàäàííîãî ïîðòà, äðóãóþ - äëÿ ïîñûëêè äàííûõ,<br />
è òðè EditBox'à. Îäèí - äëÿ ââîäà íàçâàíèÿ ïîðòà, îäèí - äëÿ ïîñûëàåìûõ äàííûõ è åùå<br />
îäèí (ïîáîëüøå) - äëÿ âûâîäà ÷èòàåìûõ äàííûõ. Íà ïîñëåäíåì íóæíî êëèêíóòü, âûáðàòü<br />
ñâîéñòâà, à â ñâîéñòâàõ âêëþ÷èòü äëÿ EditBox'à ïîëîñó ïðîêðóòêè è multiline, ò.ê. äàííûå<br />
áóäóò âûâîäèòüñÿ ïîñòðî÷íî. Ó êàæäîãî ïîìåùåííîãî òîáîé íà äèàëîã êîíòðîëà áóäóò<br />
ñâîè èäåíòèôèêàòîðû. Çàïîìíè ýòè íàçâàíèÿ, ñ èõ ïîìîùüþ ìû áóäåì âçàèìîäåéñòâîâàòü<br />
ñ äèàëîãîì èç ïðîãðàììû. Ïîñëå ñîõðàíåíèÿ â ïàïêå ñ ïðîåêòîì ïîÿâèòñÿ õèäåð<br />
resource.h, åãî ìû âêëþ÷èì â íàøó ïðîãðàììó:<br />
#include "resource.h"<br />
×òîáû ïîëó÷àòü äàííûå èç ïîëåé EditBox'à, ìû âîñïîëüçóåìñÿ ôóíêöèåé<br />
GetDlgItemText. Â ïåðâîì ïàðàìåòðå åé íàäî ïåðåäàòü äåñêðèïòîð îêíà, âî âòîðîì -<br />
èäåíòèôèêàòîð edit'à, â òðåòüåì - óêàçàòåëü íà ñòðîêîâûé áóôåð, â ïîñëåäíåì - êîëè-<br />
÷åñòâî ÷èòàåìûõ èç ïîëÿ ñèìâîëîâ. Ïîñëå çàïóñêà â áóôåðå (ïîä êîòîðûé ïåðåä èñïîëüçîâàíèåì<br />
ðåêîìåíäóåòñÿ âûäåëèòü ïàìÿòü) îêàæåòñÿ òî, ÷òî áûëî ââåäåíî â ïîëå<br />
ñ çàäàííûì èäåíòèôèêàòîðîì.<br />
Ê òîìó æå âñå äàííûå ïåðåäàþòñÿ îòêðûòûì òåêñòîì, áåç êàêèõ-ëèáî ñëîæíûõ êîäîâ<br />
è ò.ï. Ïåðâîå, ÷òî ÿ ïîñëàë, áûëî AT, ìîäåì âåðíóë OK. ß ïîïðîáîâàë ïàðó<br />
ñòðîê èíèöèàëèçàöèè, âñå ïðîøëè íà óðà. Ïîòîì âñïîìíèë åùå íåñêîëüêî èíòåðåñíûõ<br />
êîìàíä, íàïðèìåð òàêèõ:<br />
ATDPíîìåð - çâîíèò ïóëüñîì ïî íîìåðó (T - òîíîâûé íàáîð)<br />
ATI3 - âûäàåò âåðñèþ ìîäåìà<br />
ATI7 - âûäàåò íàçâàíèå ìîäåìà<br />
ATH0 - âåøàåò òðóáêó<br />
ATH1 - ñíèìàåò òðóáêó è ïîäêëþ÷àåòñÿ ê ëèíèè<br />
Åñëè çàõî÷åøü óçíàòü ïîáîëüøå êîìàíä, ïîðîéñÿ<br />
â äîêóìåíòàöèè ñâîåãî ìîäåìà. Íî è ýòî<br />
åùå íå âñå. Ñåé÷àñ ïðàêòè÷åñêè ó âñåõ åñòü ìîáèëüíèêè,<br />
è ó ìíîãèõ èìååòñÿ êîìîâñêèé ïðîâîä<br />
äëÿ ñèíõðîíèçàöèè ìîáèëüíîãî òåëåôîíà<br />
ñ êîìïüþòåðîì. Òàê âîò, â êàæäîì òåëåôîíå<br />
ñóùåñòâóåò GSM-ìîäåì, à ýòî î÷åíü èíòåðåñíàÿ<br />
øòóêà. Ïîìèìî îáû÷íûõ ôóíêöèé ìîäåìà,<br />
îí ìîæåò îòïðàâëÿòü SMS. Âîò êàê ýòî ñäåëàòü<br />
ïðè ïîìîùè íàøåé ïðîãðàììû:<br />
AT+CMGS="+79033133373"<br />
Îáùàåìñÿ ñ ìîäåìîì<br />
Ìîäåì îòâåòèò. Çàòåì òû ââåäåøü òåêñò ñîîáùåíèÿ ñ ñèìâîëîì '\x1A' íà êîíöå, à ìîäåì<br />
îòïðàâèò ýòó ìåññàãó íà íîìåð +79033133373.<br />
Break<br />
Ïðîåêò äëÿ Visual Studio .NET, ïîëíûé èñõîäíûé òåêñò ïðîãðàììû c ïîäðîáíûìè êîììåíòàðèÿì<br />
è óæå ñêîìïèëèðîâàííûé exe’øíèê òû ìîæåøü âçÿòü íà äèñêå èëè ñêà÷àòü<br />
ñ ñàéòà www.xakep.ru. Íàâåðíÿêà ó íàïèñàííîé íàìè ïðîãðàììû åñòü åùå è äðóãèå<br />
ïðèìåíåíèÿ. Òàê ÷òî ýêñïåðèìåíòèðóé, à åñëè ïðèäóìàåøü ÷òî-íèáóäü îðèãèíàëüíîå,<br />
òî íàïèøè ìíå îá ýòîì.<br />
Íà ýòîì âñå. Óäà÷íîãî êîìïèëèðîâàíèÿ.<br />
Òåïåðü íàì íàäî íàó÷èòüñÿ îáðàáàòûâàòü ñîáûòèÿ, âûïîëíÿþùèåñÿ ïîñëå íàæàòèÿ íà<br />
òó èëè èíóþ êíîïêó. Äëÿ ýòîãî ñîçäàäèì ôóíêöèþ îáðàáîòêè ñîîáùåíèé. Îíà áóäåò<br />
ëîâèòü ñîîáùåíèå îêíó-ðîäèòåëþ WM_COMMAND. Ôóíêöèÿ îïèñûâàåòñÿ òàê:<br />
int Dlg_Proc(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam);<br />
ãäå hwnd - ýòî äåñêðèïòîð îêíà, êîòîðîìó ïðèøëî ñîîáùåíèå, wMsg - çàðåãèñòðèðîâàííûé<br />
íîìåð ñîîáùåíèÿ (íàïðèìåð, WM_COMMAND), à wParam è lParam - äâà ïàðàìåòðà,<br />
íàõîäÿùèõñÿ â ñîîáùåíèè. Âíóòðè ôóíêöèè ìû áóäåì ñðàâíèâàòü wMsg è<br />
WM_COMMAND. Åñëè îíè áóäóò ðàâíû, çíà÷èò, íà ýòó êíîïêó íàæàëè. Èäåíòèôèêàòîð<br />
êíîïêè íàõîäèòñÿ â íèæíåì "ñëîâå" ïðàâîãî ïàðàìåòðà (LOWORD(wParam)). Äëÿ òîãî<br />
÷òîáû ñîçäàòü ñîáûòèå íàæàòèÿ ýòîé êíîïêè, ìû äîëæíû ñðàâíèòü ïîëó÷åííûé èäåíòèôèêàòîð<br />
ñ èìåþùèìñÿ ó íàñ, è åñëè îíè ðàâíû - âûïîëíèòü íóæíûé íàì êîä. Ïîñêîëüêó<br />
êíîïîê è ïðèíèìàåìûõ ñîîáùåíèé â ïðîãðàììàõ îáû÷íî íåìàëî, ïðèíÿòî<br />
ïðîèçâîäèòü ñðàâíåíèå â áëîêå switch.<br />
Ôóíêöèþ îáðàáîòêè ñîîáùåíèé íàïèñàëè, îñòàëîñü òîëüêî âûçâàòü èç ïðîãðàììû ñàìóþ<br />
ãëàâíóþ ôóíêöèþ, êîòîðàÿ ñîçäàñò ïðè çàïóñêå îêíî èç íàøåãî ðåñóðñà è ïðèêðóòèò<br />
ê íåìó Dlg_Proc. Ôóíêöèÿ íàçûâàåòñÿ DialogBox è â ïðîãðàììå çàïóñêàåòñÿ<br />
ñëåäóþùèì îáðàçîì:<br />
DialogBox(hinst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlg_Proc);<br />
IDD_DIALOG1 - èäåíòèôèêàòîð ðåñóðñà äèàëîãà, à Dlg_Proc - ñîçäàííàÿ íàìè ôóíêöèÿ<br />
äëÿ ñîîáùåíèé. Ýòó ñòðîêó ïîñòàâèì â ãëàâíûé ïîòîê (WinMain), è âîò, GUI äëÿ íàøåé<br />
òåðìèíàëüíîé ïðîãðàììû ïîëíîñòüþ çàâåðøåí. Ñîáèðàåì âñå âìåñòå (ñì. ëèñòèíã),<br />
è íàøà ïðîãðàììà ãîòîâà. Ïîðà ïðîâåðèòü åå â äåéñòâèè.<br />
Òåñòèðóåì<br />
Îáùàåìñÿ ÷åðåç NULL-ìîäåì<br />
Ïåðâîå, ÷òî ïðèøëî ìíå â ãîëîâó, ïîïðîáîâàòü<br />
íàøó ïðîãðàììó â êà÷åñòâå<br />
÷àòà, ïðè÷åì îáû÷íîãî null-ìîäåìíîãî.<br />
ß âçÿë com2com ïðîâîä è ñîåäèíèë<br />
èì âûõîäû ïîðòîâ com1 è<br />
com2. Ïîñëå ÷åãî çàïóñòèë äâå êîïèè<br />
ïðîãðàììû, îäíîé îòêðûâ com1, à<br />
äðóãîé - com2. Âûøëî î÷åíü óäà÷íî:<br />
äàííûå, ïîñëàííûå â îäèí ïîðò, óñïåøíî<br />
÷èòàëèñü èç äðóãîãî. Íà ýòîì ÿ<br />
íå îñòàíîâèëñÿ. Ïîñêîëüêó èçíà÷àëüíî<br />
ìû ïèñàëè òåðìèíàëüíóþ ïðîãðàììó<br />
äëÿ ìîäåìà, òî è ïðîòåñòèðóåì<br />
åå íà ìîäåìå. Ýòî íåñëîæíî, ïðîòîêîë<br />
îáùåíèÿ ñ ìîäåìîì òàêîé:<br />
\r<br />
\r\r<br />
Ëèñòèíã îêîííîé ïðîöåäóðû<br />
int __stdcall Dlg_Proc(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM<br />
lParam)<br />
{<br />
switch (wMsg){<br />
case WM_CLOSE:<br />
EndDialog(hwnd,1);<br />
break;<br />
case WM_COMMAND:<br />
switch (LOWORD(wParam)) {<br />
case IDC_BUTTON1:<br />
// Íàæàëè íà êíîïêó îòïðàâêè äàííûõ<br />
// Âûäåëÿåì ïàìÿòü ïîä áóôåðû<br />
writebuffer = (char*)malloc((size_t)128);<br />
memset(writebuffer,0,128);<br />
// ïîëó÷àåì òåêñò èç ïîëÿ<br />
GetDlgItemText(hwnd,IDC_EDIT1,writebuffer,128);<br />
writebuffer[strlen(writebuffer)] = '\r';<br />
writebuffer[strlen(writebuffer)] = '\0';<br />
// îòïðàâëÿåì<br />
TerminateThread(hThread,0);<br />
WriteFile(hCom, writebuffer,<br />
strlen(writebuffer),&n1,0); // Îòïðàâëÿåì òåêñò<br />
// Çàíîâî ñîçäàåì íèòü<br />
hThread = CreateThread(0, 0, ReadThread, (LPVOID)hwnd, 0, 0);<br />
break;<br />
case IDC_BUTTON2:<br />
// Íàæàëè íà êíîïêó îòêðûòèÿ ïîðòà<br />
combuffer = (char*)malloc((size_t)16);<br />
memset(combuffer,0,16);<br />
// Ïîëó÷àåì èìÿ ïîðòà è îòêðûâàåì åãî<br />
GetDlgItemText(hwnd,IDC_EDIT2,combuffer,16);<br />
hCom = CreateFile(combuffer, GENERIC_READ | GENERIC_WRITE,<br />
0, 0, 3, 0, 0);<br />
hThread = CreateThread(0, 0, ReadThread, (LPVOID)hwnd, 0, 0);<br />
// íàñòðàèâàåì åãî<br />
GetCommState(hCom, &dcb);<br />
dcb.BaudRate = CBR_57600;<br />
dcb.ByteSize = 8;<br />
dcb.Parity = NOPARITY;<br />
dcb.StopBits = ONESTOPBIT;<br />
SetCommState(hCom, &dcb);<br />
break;<br />
}<br />
break;<br />
}<br />
return false;<br />
}<br />
87