hamradioshop.ro
Articole > Software pentru radioamatori Litere mici Litere medii Litere mari     Comentati acest articol    Tipariti

Primii pasi in programarea Windows sau cum scriu un program de log

Bernardt Huth YO2CMI

Articolul prezinta in linii mari structura unui program sub Windows API ( application programming interface ) precum si facilitatile mai simple puse la dispozitia programatorului de catre sistemul de operare.
Programul este scris in limbajul C++.
Pentru simplificare am incercat sa folosesc cat mai putin pointeri ( acces direct la memorie ) si sa evit teme mai complexe din C++ ( clase, iteratori, MDI e.t.c. ).
Pentru editare, compilare s.a.m.d . folosesc programul Code::Blocks, care la randul sau apeleaza la Microsoft Visual C++.

Cel mai bine vom putea intelege cum este realizat programul daca printam listingul ( .cpp ) si acest text, respectiv pornim programul de log (.exe ).
Formatul .cpp poate fi redat si de un editor de text obisnuit.
Listingul programului contine multe comentarii pe baza carora se poate urmari structura lui.
Un comentariu in C++ arata in felul urmator:
// comentariu

Un program sub Windows consta de obicei din trei parti:
  1. Initializarea variabilelor, a constantelor, declararea functiilor, respectiv al structurilor
  2. Apelarea functiei WinMain ( inceputul programului )
    Deschiderea ferestrei ( cu sau fara meniu ) prin apelarea functiei CreateWindow
    Daca dorim o fereastra fara meniu inlocuim in functia CreateWindow parametrul hMenu cu NULL.
    Bucla principala ( de mesaje ), care este executata pana la primirea comenzii de iesire din program WM_QUIT
  3. Functia fereastra ( WndProc )
Toate operatiile pe care le executam in fereastra, inclusiv deplasarea si redimensionarea ferestrei constituie evenimente pe care sistemul Windows le transforma in mesaje. Acestea sunt preluate de programul nostru. In functie de mesajul primit se executa diferite parti din program.

Un program de log simplu este construit din urmatoarele parti:
  1. O baza de date in care memoram datele qso-urilor ( structura de date QSO )
  2. O secventa de program care deseneaza fereastra ( WM_CREATE, WM_PAINT )
  3. O secventa de program care analizeaza comenzile utilizatorului si in functie de aceasta seteaza anumite variabile sau executa anumite functii ( WM_COMMAND, GetAsyncKeyState )
  4. O parte de program care listeaza log-ul ( ListDB )
  5. O parte de program care salveaza / incarca datele de pe harddisk ( meniu - SAVE / OPEN )
  6. O subrutina de cautare indicativ
O structura de date este foarte folositoare in cazul in care avem mai multe date care sunt legate unele de altele cum este in cazul unui program de log. Pentru un QSO trebuie sa memoram data, ora, indicativul, banda, modul de lucru, raportul RST si eventual un comentariu.
Toate aceste date le legam impreuna declarand structura QSO.
In acest caz daca vrem sa apelam o anumita componenta adresarea ei va arata in felul urmator:
QSO[iNr].szCall
unde iNr este numarul QSO-ului, szCall variabila in care e memorat indicativul.
Apelarea la functii este folositoare spre exemplu in cazul in care avem in program secvente (mai multe linii de program) care se repeta.
In cazul programului de log avem doua asemenea functii:
Prima este RestoreDB. Aceasta functie scrie datele din variabilele folosite pentru stocarea temporara a datelor QSO-ului in structura QSO si incrementeaza variabila iNr ( se trece la urmatorul QSO ).
A doua functie ListDB listeaza in partea stanga a ferestrei ultimele 10 QSO-uri.

Pentru a construi grafic o fereastra, sistemul Windows API pune la dispozitia programatorului foarte multe facilitati:
  1. Butoane
    Acestea sunt de mai multe tipuri si sunt folosite in programul de log pentru
    alegerea benzilor prin butonul de optiune ( AUTORADIOBUTTON ),
    alegerea modului de lucru prin casuta de optiune (AUTOCHECKBOX), respectiv butonul de comanda "LOG IT ?" ( PUSHBUTTON )
    Butonul de tip "GROUPBOX" nu foloseste la altceva decat la incadrarea mai multor componente sub acelasi titlu.
    Spre ex. BAND ( butoanele 160m - 70cm )
  2. Zone de editare
    In program se folosesc pentru introducerea indicativului respectiv al unui comentariu.
    Info. Aceste ferestre nu reactioneaza la tasta TAB. Exista mai multe solutii pentru a rezolva aceasta problema:
    a. Folosim functia GetAsyncKeyState() cu care putem afla in timp real starea unei anumite taste. Aceasta facilitate am introdus-o in bucla principala a programului, unde la intervale regulate se testeaza atat tasta TAB cat si tasta RETURN.
    Partea de timing din bucla principala foloseste pentru accesarea periodica a tastelor.
    b. Prin definirea unei subclase fereastra
    folosind functia CALLBACK.
  3. Clasa Static
    Aici pot fi listate texte, grafice sau se foloseste pentru a eticheta un alt control.
    Deasemenea poate fi folosita pentru a desena un dreptunghi.
    Spre ex. eticheta CALLSIGN
  4. Zone de listare "listbox"
    Aici utilizatorul poate alege una sau mai multe valori dintr-o lista data
    Felul cum se introduc diferitele date - vezi listingul .cpp ( CAT Speed )
  5. Bare de defilare "scrollbar"
    Sunt utile cand vrem sa schimbam continuu valoarea unei variabile
    Ex. Viteza CW ( WPM ), volum etc
    Aceste ferestre pot fi desenate vertical sau orizontal

Pentru a scrie un text pe ecran se foloseste deobicei functia TextOut.
Alta modalitate sunt ferestrele tip Edit sau Static
Formatul pentru TextOut in C++ este:
TextOut (hdc, x, y, buffer, marime buffer)
Exemplu: TextOut ( hdc, 100, 200, "exemplu", 7 )
In cazul in care dorim sa scriem pe ecran folosind un anumit format atunci functia se complica putin:
TextOut ( hdc, x, y, buffer, wsprintf ( buffer, TEXT("%3d %2d"), variabila1, variabila 2))
Functia wsprintf scrie in buffer cum trebuie formatate datele
spre ex. 2d - 2 digiti, 3s - 3 caractere, X -hexa
Inainte de a folosi functia TextOut trebuie aflat contextul dispozitiv ( device context ) prin apelarea functiei GetDC. Functia returneaza parametrul hdc.
Contextul dispozitiv este o structura asociata unui dispozitiv de afisare (display e.t.c. ).
Pentru a alege culoarea textului respectiv a fundalului putem utiliza functiile
SetTextColor respectiv SetBkColor.

In functie de ce actiuni intreprindem in fereasta programului ( mouse, tastatura ) sistemul ne va transmite anumite mesaje.
La actionarea unui buton sistemul Windows va genera mesajul WM_COMMAND.
Pentru a identifica care buton a fost actionat ne sta la dispozitie ID-ul butonului (identificatorul se alege la crearea butonului) care se compara cu variabila wParam.
In functie de ce buton a fost actionat vom intreprinde actiunile corespunzatoare.
Spre ex. daca sa activat butonul 80M atunci vom da variabilei iB valoarea 80.
La butonul tip AUTOCHECKBOX vom folosi functia
SendMessage (denumire_buton, BM_GETSTATE, 0, 0L)
care ne va returna starea butonului.
La fereastra tip LISTBOX se foloseste functia
SendMessage ( denumire_fereastra, LB_GETCURSEL, 0, 0L)
care ne va returna pozitia selectata.
La actionarea unei ferestre tip scrollbar sistemul va trimite mesajul WM_VSCROLL
VSCROLL in cazul cand cursorul este desenat vertical.
In functie de valoarea lui ID ( variabila wParam ) vom sti ce comanda sa dat ( spre ex. scroll in jos -> 1 ).
Mesajul WM_CREATE:
Functia CreateWindow este apelata la inceputul programului. Aceasta functie genereaza mesajul WM_CREATE cu care apeleaza direct functia fereastra.
Deci la deschiderea ferestrei vor fi executate si liniile de program aflate in functia fereastra la WM_CREATE.
Mesajul WM_PAINT este generat de functia UpdateWindow. Acest mesaj se va genera si cand se redimensioneaza fereastra.
Mesajul WM_SIZE - acest mesaj este generat la redimensionarea ferestrei
Mesajul SET_FOCUS
Pentru a activa o anumita fereastra ( spre ex. cea de introducere indicativ ), sistemul pune la dispozitie comanda:
SetFocus ( denumire_fereastra )
La alegerea ID-urilor trebuie avut grija ca unui ID sa-i fie atribuit un numar unic.
Salvarea / incarcarea de pe harddisk se face utilizand functii specifice din setul <iostream> si se face in format binar. Fisierul se salveaza in acelasi director cu programul.
Lungimea programului poate fi redusa prin preluarea tuturor datelor de creare a butoanelor intr-o structura si folosind ulterior o bucla for() pentru crearea lor, dar am ales aceasta cale pentru intelegerea mai usoara a programului.
Modul de lucru, banda, raportul RST se memoreaza temporar in mai multe variabile care se definesc la inceputul programului ( szM, iB, iR). Raportul RST nu poate fi schimbat de utilizator.
Datele pentru un QSO se memoreaza definitiv abia dupa ce apasam butonul "LOG IT ?" sau actionam tasta ENTER.
In fereastra CALLSIGN se verifica numarul de caractere introduse. Daca indicativul introdus are mai putin de 3 caractere QSO-ul nu se memoreaza.
Pentru a afisa ce qso-uri sau efectuat cu un anumit indicativ se introduce indicativul in fereastra CALLSIGN si se apasa butonul de comanda SEARCH. Rezultatele vor fi afisate in partea de jos a ferestrei.
Cu comanda CLEAR se sterg aceste rezultate.
Facilitatile CAT, WPM nu sunt implementate. Sunt date doar ca exemple pentru tipurile respective de ferestre.
Pentru programatorii care vor sa acceseze porturile seriale, Windows pune la dispozitie mai multe functii, portul COM1 fiind spre ex. deschis prin comanda
hCom = CreateFile ( TEXT("COM1"),...)
Setarea parametrilor pentru comunicatia seriala se face cu comanda
SetCommState (hCom, lista cu parametrii - exista o structura predefinita: DCB )

Programul este limitat la 1000 de qso-uri, dar programatorul poate schimba usor limita maxima prin schimbarea marimii constantei MaxQso.

Pentru cei care vor sa aprofundeze programarea sub Windows le recomand bibliografia existenta precum si internetul unde se gasesc multe pagini cu tutoriale despre Windows si limbajul de programare C++.
Spre ex.:
http://msdn2.microsoft.com/en-us/library/aa383723.aspx

Descarcati listingul .cpp si fisierul .exe.

Folosind termeni in limba romana,

descarcati listingul .cpp si fisierul .exe.

Bernardt Huth YO2CMI

Articol aparut la 11-10-2007

19328

Inapoi la inceputul articolului

Comentarii (7)  

  • Postat de George - YO9HSW la 2007-10-11 14:55:28 (ora Romaniei)
  • Cred ca era mai indicat sa prezentati in amanunt functionarea programelului dpdv. al utilizatorului final. Pentru cei care se pricep, programul este banal, in schimb un necunoscator cu mare greutate va intelege ceva. Si daca tot avem un cod sursa scris d e la zero, de ce nu avem meniul si etichetele butoanelor in libmba romana ? :)
    In rest, initiativa este laudabila, jos palaria!

  • Postat de Dan - YO9CWY la 2007-10-12 18:34:16 (ora Romaniei)
  • Deocamdata este o versiune demo, iar modul de operare este simplu si intuitiv. Nu e neaparat un criteriu, dar remarcam si marimea fisierului de numai 44 kB. Pentru ca meniurile in limba romana sa fie explicite, ar trebui sa fie lungi si ar ocupa inutil o parte din ecran. Eu sunt pentru meniuri in limba romana, dar e oarecum dificil sa gasesti un cuvant scurt care sa spuna tot atat de mult ca si un termen englezesc deja consacrat. Atasarea fisierului sursa o consider stimulativa pentru alti colegi cu cunostinte de programare, dar care nu au abordat inca programe utile radioamatorilor. Stilul este direct, profesionist, ca intr-un manual de programare. Dl Huth, va rog sa primiti felicitari pentru realizarea tehnica, dar si pentru initiativa! Eu zic ca ne prinde bine, atat programul cat si sursa. Asteptam si versiunea finala, cu atat mai mult cu cat domeniul "Evidenta log" este un pic defavorizat comparativ cu cel al concursurilor. Cu respect,

  • Postat de jupinul007 - la 2007-10-26 06:14:32 (ora Romaniei)
  • cum deschid yo programul asta C++ k nu il gasesc k s tare curios sa vad cu arata pliz ajutatima

  • Postat de Marius - YO2LOJ la 2007-10-26 18:04:44 (ora Romaniei)
  • Felicitari pentru initiativa de a publica sursele.
    Pentru cei nemultumiti: Dupa cum zice titlul, scopul este sa invatam sa sciem un program de tip log sub windows, nu sa explicam ceva vreunui utilizator final. Cei ce nu sunt curiosi de programare in C sub windows nu au de ce citi articolul... Este ca si cand ai publica schema unui transceiver iar in articol se explica doar cum se invarte de buton si cum ii arata fata.
    73 de Marius, YO2LOJ

  • Postat de Liviu - YO5QCD la 2007-11-04 16:18:22 (ora Romaniei)
  • Buna ideea! Pacat ca e pe windoz... Nu e nici un pinguin prin apropiere??

  • Postat de georgica - 1314 la 2007-11-16 22:27:55 (ora Romaniei)
  • Nemaipomenita idee pentru toti amatorii.Meritati multe felicitarti.Georgica

  • Postat de Florin - YO9GJX la 2007-11-20 13:01:36 (ora Romaniei)
  • Excelent dar cam degeaba. Liviule (yo5qcd) am portat sursa pe librariile QT si merge fain dar nu face nimic concret. Pentru Unix-like vezi TLF. E excelent configurabil cum doresti si are pe la altii o gramada de GUI-uri(poti sa-ti creezi propriul concurs daca nu te scarbesc modificarile periodice de regulamente).Pentru incepatori scrie in Py, uite si un BOA Constructor- http://boa-constructor.sourceforge.net/
    Cred ca problema nu e lipsa programelor, ci seriozitatea organizatorilor de concursuri si stabilitatea regulamentelor.(windoz like-Hi)
    Ideea e buna si ar merge un ,,serial" pentru cei interesati dar si cu altceva inafara de log-uri
    PS: pentru autor, se pot gasi meniuri in romana similare cu altele din alte limbi, problema e sa cunosti limba. Exemplu de stupizenie: la multe programe traduse de grupul mSoft din ro au pus in loc de ,,View"- ,,Vizualizare" ca daca scriau simplu ,,Vezi" era ceva defect. Vezi diferenta la traducerea in romana a librariilor GTK Hi
    In rest felicitari pentru initiativa si astept continuarea
    Bafta si 73

    Scrieti un mic comentariu la acest articol!  

    Opinia dumneavoastra va aparea dupa postare sub articolul "Primii pasi in programarea Windows sau cum scriu un program de log"
    Comentariul trebuie sa se refere la continutul articolului. Mesajele anonime, cele scrise sub falsa identitate, precum si cele care contin (fara a se limita la) atac la persoana, injurii, jigniri, expresii obscene vor fi sterse.
    Comentariu *
     
    Trebuie sa va autentificati pentru a putea adauga un comentariu.


    Opiniile exprimate în articole pe acest site aparţin autorilor şi nu reflectă neapărat punctul de vedere al redacţiei.

    Copyright © Radioamator.ro. Toate drepturile rezervate. All rights reserved
    Articole | Concursuri | Mica Publicitate | Forum YO | Pagini YO | Call Book | Diverse | Despre Radioamator.ro | Contact