IFiZR Laboratorium 5 Info File->New->Project->Windows Application (DevC++) Kurs WinAPI: http://cpp0x.pl/kursy/kurs-winapi-c++/167 #include <windows.h> #include <iostream> #include <stdlib.h> #include <math.h> Przykład 2 LPSTR NazwaKlasy = "Klasa Okienka"; MSG Komunikat; // definicja nazw kontrolek HWND hprzycisk1, hedit1, hedit2, hedit3, hedit4, hedit5, htekst1, htekst2; // definicja funkcji double CharToDouble(HWND okno); LRESULT CALLBACK Panel( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ); // WinMain zamiast main int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) { WNDCLASSEX wc; wc.cbsize = sizeof( WNDCLASSEX ); wc.style = 0; wc.lpfnwndproc = Panel; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = LoadIcon( NULL, IDI_APPLICATION ); wc.hcursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrbackground =( HBRUSH )( COLOR_WINDOW+8); // kolor formatki poprzez zmiane liczby wc.lpszmenuname = NULL; wc.lpszclassname = NazwaKlasy; wc.hiconsm = LoadIcon( NULL, IDI_APPLICATION ); // rejestrowanie okna if(!registerclassex( & wc ) ) { MessageBox( NULL, "Blad rejestracji okna!", "Error.", MB_ICONEXCLAMATION MB_OK ); return 1;
//tworzenie panelu (okna) HWND hwnd=createwindowex( WS_EX_CLIENTEDGE, NazwaKlasy, "Panel obliczen", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hinstance, NULL ); if( hwnd == NULL ) { MessageBox( NULL, "Nie udalo sie utworzyc okna", "Error", MB_ICONEXCLAMATION ); return 1; ShowWindow( hwnd, ncmdshow ); UpdateWindow( hwnd ); // tworzenie kontrolek tj editow, buttonów itp htekst1=createwindowex( 0, "STATIC", "Podaj dane punktów P1(x1,y1) oraz P2 (x2,y2)", WS_CHILD WS_VISIBLE SS_CENTER, 90, 30, 200, 40, hwnd, NULL, hinstance, NULL ); htekst2=createwindowex( 0, "STATIC", "Wynik obliczen", WS_CHILD WS_VISIBLE, 110, 200, 120, 20, hwnd, NULL, hinstance, NULL ); hedit1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_BORDER, 50, 80, 60, 30, hwnd, NULL, hinstance, NULL ); hedit2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_BORDER, 110, 80, 60, 30, hwnd, NULL, hinstance, NULL ); hedit3 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_VISIBLE, 200, 80, 60, 30, hwnd, NULL, hinstance, NULL ); hedit4 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_VISIBLE, 260, 80, 60, 30, hwnd, NULL, hinstance, NULL ); hedit5 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_DISABLED WS_VISIBLE, 100, 250, 150, 30, hwnd, NULL, hinstance, NULL ); hprzycisk1 = CreateWindowEx( 0, "BUTTON", " Licz dlugosc odcinka ", WS_CHILD WS_VISIBLE, 90, 150, 180, 30, hwnd, NULL, hinstance, NULL ); // UWAGA! Pętla komunikatów - przechwytyje wszelkie komunikaty while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); return Komunikat.wParam; // obsluga zdarzen - czyli co ma wydarzyc sie po uzyciu danej kontrolki - nacisnieciu, wpisaniu, wybraniu itp LRESULT CALLBACK Panel( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch( msg ) { // obsługa zdarzenia zamykania okna case WM_CLOSE: DestroyWindow( hwnd ); case WM_DESTROY: PostQuitMessage( 0 );
// obsluga zdarzen "nacisniecia" jednego z przycieskow case WM_COMMAND: double liczba1, liczba2, liczba3, liczba4, wynik; char wynikchar[20]; // kontrolki rozroznia sie po nazwie - uchwycie // kiedy zostanie nacisniety jeden z przyciskow if( (HWND)lParam == hprzycisk1 ) { int textlength1 = GetWindowTextLength(hEdit1) + 1; int textlength2 = GetWindowTextLength(hEdit2) + 1; int textlength3 = GetWindowTextLength(hEdit3) + 1; int textlength4 = GetWindowTextLength(hEdit4) + 1; if(textlength1==1 textlength2==1 textlength3==1 textlength4==1) { int odp=messagebox( NULL, "Wpisz dane", "Brak wszystkich danych", MB_OK MB_ICONWARNING); return 0; liczba1=chartodouble(hedit1); liczba2=chartodouble(hedit2); liczba3=chartodouble(hedit3); liczba4=chartodouble(hedit4); wynik=sqrt(pow(liczba3-liczba1, 2) + pow(liczba4-liczba2, 2)); sprintf(wynikchar,"%0.8f",wynik); SetWindowText( hedit5, wynikchar); default: return DefWindowProc( hwnd, msg, wparam, lparam ); return 0; // przykladowa funkcja - konwersja double CharToDouble(HWND okno) { int textlength= GetWindowTextLength(okno) + 1; char *textbuffer = new char[textlength]; GetWindowText(okno, textbuffer, textlength); double liczba=atof(textbuffer); delete []textbuffer; return liczba;
#include <windows.h> #include <iostream> #include <stdlib.h> #include "interval.h" Przykład 1 #define ID_RB1 101 #define ID_RB2 102 #define ID_CB1 103 #define ID_P6 104 #define ID_T3 105 LPSTR NazwaKlasy = "Klasa Okienka"; MSG Komunikat; // definicja nazw kontrolek HWND hprzycisk1, hprzycisk2, hprzycisk3, hprzycisk4, hprzycisk5, hprzycisk6, hedit1, hedit2, hedit3, hedit4, hedit5, htekst1, htekst2, htekst3, hrb1, hrb2, hcb1; // deklaracja własnej funkcji double CharToDouble(HWND okno); LRESULT CALLBACK Panel( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ); // WinMain zamiast main int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) { WNDCLASSEX wc; wc.cbsize = sizeof( WNDCLASSEX ); wc.style = 0; wc.lpfnwndproc = Panel; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = LoadIcon( NULL, IDI_APPLICATION ); wc.hcursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrbackground =( HBRUSH )( COLOR_WINDOW+23); // kolor formatki poprzez zmiane liczby wc.lpszmenuname = NULL; wc.lpszclassname = NazwaKlasy; wc.hiconsm = LoadIcon( NULL, IDI_APPLICATION ); // rejestrowanie okna if(!registerclassex( & wc ) ) { MessageBox( NULL, "Blad rejestracji okna!", "Error.", MB_ICONEXCLAMATION MB_OK ); return 1; //tworzenie panelu (okna) HWND hwnd=createwindowex( WS_EX_CLIENTEDGE, NazwaKlasy, "Panel obliczen", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 450, NULL, NULL, hinstance, NULL ); if( hwnd == NULL ) { MessageBox( NULL, "Nie udalo sie utworzyc okna", "Error", MB_ICONEXCLAMATION ); return 1;
ShowWindow( hwnd, ncmdshow ); UpdateWindow( hwnd ); // tworzenie kontrolek tj editow, buttonów itp htekst1=createwindowex( 0, "STATIC", "Podaj dane", WS_CHILD WS_VISIBLE SS_CENTER, 100, 50, 120, 20, hwnd, NULL, hinstance, NULL ); htekst2=createwindowex( 0, "STATIC", "Wynik obliczen", WS_CHILD WS_VISIBLE, 100, 200, 120, 20, hwnd, NULL, hinstance, NULL ); htekst3=createwindowex( 0, "STATIC", "", WS_CHILD WS_VISIBLE, 570, 100, 130, 20, hwnd, (HMENU) ID_T3, hinstance, NULL ); hedit1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_BORDER, 100, 100, 80, 30, hwnd, NULL, hinstance, NULL ); hedit2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_VISIBLE WS_BORDER, 200, 100, 80, 30, hwnd, NULL, hinstance, NULL ); hedit3 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_DISABLED WS_VISIBLE, 100, 250, 150, 30, hwnd, NULL, hinstance, NULL ); hedit4 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_DISABLED WS_BORDER, 100, 280, 60, 30, hwnd, NULL, hinstance, NULL ); hedit5 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD WS_DISABLED WS_BORDER, 170, 280, 60, 30, hwnd, NULL, hinstance, NULL ); hprzycisk1 = CreateWindowEx( 0, "BUTTON", "+", WS_CHILD WS_VISIBLE, 100, 150, 30, 30, hwnd, NULL, hinstance, NULL ); hprzycisk2 = CreateWindowEx( 0, "BUTTON", "-", WS_CHILD WS_VISIBLE, 140, 150, 30, 30, hwnd, NULL, hinstance, NULL ); hprzycisk3 = CreateWindowEx( 0, "BUTTON", "*", WS_CHILD WS_VISIBLE, 180, 150, 30, 30, hwnd, NULL, hinstance, NULL ); hprzycisk4 = CreateWindowEx( 0, "BUTTON", "/", WS_CHILD WS_VISIBLE, 220, 150, 30, 30, hwnd, NULL, hinstance, NULL ); hprzycisk5 = CreateWindowEx( 0, "BUTTON", "p^2", WS_CHILD WS_VISIBLE, 260, 150, 40, 30, hwnd, NULL, hinstance, NULL ); hprzycisk6 = CreateWindowEx( 0, "BUTTON", "Analizuj", WS_CHILD WS_VISIBLE, 420, 220, 120, 30, hwnd, (HMENU) ID_P6, hinstance, NULL ); hrb1 = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "Opcja 1", WS_CHILD WS_VISIBLE BS_AUTORADIOBUTTON, 400, 100, 150, 20, hwnd, (HMENU) ID_RB1, hinstance, NULL ); hrb2 = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "Opcja 2", WS_CHILD WS_VISIBLE BS_AUTORADIOBUTTON, 400, 135, 150, 20, hwnd, (HMENU) ID_RB2, hinstance, NULL ); hcb1 = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "Checkbox", WS_CHILD WS_VISIBLE BS_AUTOCHECKBOX, 400, 180, 150, 20, hwnd, (HMENU) ID_CB1, hinstance, NULL ); // UWAGA! Pętla komunikatów - przechwytyje wszelkie komunikaty while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); return Komunikat.wParam; // obsluga zdarzen - czyli co ma wydarzyc sie po uzyciu danej kontrolki - nacisnieciu, wpisaniu, wybraniu itp LRESULT CALLBACK Panel( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch( msg ) { // obsługa zdarzenia zamykania okna case WM_CLOSE: DestroyWindow( hwnd ); case WM_DESTROY: PostQuitMessage( 0 ); // obsluga zdarzen "nacisniecia" jednego z przycieskow case WM_COMMAND: double liczba1, liczba2, wynik; char *wynikchar;
// kontrolki rozroznia sie po nazwie - uchwycie // kiedy zostanie nacisniety jeden z przyciskow if( (HWND)lParam == hprzycisk1 (HWND)lParam == hprzycisk2 (HWND)lParam == hprzycisk3 (HWND)lParam == hprzycisk4 (HWND)lParam == hprzycisk5) { int textlength1 = GetWindowTextLength(hEdit1) + 1; int textlength2 = GetWindowTextLength(hEdit2) + 1; if(textlength1==1 textlength2==1) { int odp=messagebox( NULL, "Wpisz dane", "Brak wszystkich danych", MB_YESNOCANCEL MB_ICONWARNING); if(odp==6) // 1-OK 2-Anuluj(Cancel) 3-Przerwij(Abort) 4-Ponów próbę(retry) 5-Ignoruj(Ignore) 6-Tak(Yes) 7-Nie(No) MessageBox(HWND_DESKTOP,"Nacisnąłeś przycisk TAK","Informacja",MB_OK); return 0; liczba1=chartodouble(hedit1); liczba2=chartodouble(hedit2); wynikchar=new char[textlength1+textlength2+10]; // ukrywanie i odkrywanie Editow 3->wynik + - * / 4 i 5 wynik operacji na przedziale if(( HWND ) lparam == hprzycisk5) { ShowWindow(hEdit4, SW_SHOW); ShowWindow(hEdit5, SW_SHOW); ShowWindow(hEdit3, SW_HIDE); else { ShowWindow(hEdit4, SW_HIDE); ShowWindow(hEdit5, SW_HIDE); ShowWindow(hEdit3, SW_SHOW); //realizacja obliczen if(( HWND ) lparam == hprzycisk1 ) wynik=liczba1+liczba2; if(( HWND ) lparam == hprzycisk2 ) wynik=liczba1-liczba2; if(( HWND ) lparam == hprzycisk3 ) wynik=liczba1*liczba2; if(( HWND ) lparam == hprzycisk4 ) wynik=liczba1/liczba2; // potegowanie przedzialu if(( HWND ) lparam == hprzycisk5 ) { SetWindowText( hedit4, szer_inter(liczba1, liczba2, 1) ); SetWindowText( hedit5, szer_inter(liczba1, liczba2, 2) ); delete []wynikchar; if( (HWND)lParam == hprzycisk1 (HWND)lParam == hprzycisk2 (HWND)lParam == hprzycisk3 (HWND)lParam == hprzycisk4 ) { sprintf(wynikchar,"%0.8f",wynik); SetWindowText( hedit3, wynikchar); delete []wynikchar;
// troszke inaczej - uwzgledninie identyfikatorów kontrolek zdefiniowanych poprzez #define if(( HWND ) lparam == hrb1 ( HWND ) lparam == hrb2 ( HWND ) lparam == hcb1 ( HWND ) lparam == hprzycisk6) { switch( wparam ) { case ID_RB1: SetWindowText( htekst3, "Aktywna opcja 1" ); case ID_RB2: SetWindowText( htekst3, "Aktywna opcja 2" ); case ID_CB1: if(isdlgbuttonchecked(hwnd, ID_CB1 ) == BST_CHECKED) { SetWindowText( htekst3, "Zaznaczono CB"); else SetWindowText( htekst3, "Odznaczono CB"); case ID_P6: if(isdlgbuttonchecked(hwnd, ID_RB1 ) == BST_CHECKED) MessageBox( hwnd, "Wybrano opcję 1", "Info", MB_ICONINFORMATION ); if(isdlgbuttonchecked(hwnd, ID_RB2 ) == BST_CHECKED) MessageBox( hwnd, "Wybrano opcję 2", "Info", MB_ICONINFORMATION ); default: MessageBox( hwnd, "Obiekt widmo;)", "Info", MB_ICONINFORMATION); //CheckDlgButton( hwnd, ID_CB1, BST_CHECKED ); //ustaw "fajeczkę" //CheckDlgButton( hwnd, ID_CB1, BST_UNCHECKED ); //usuń "fajeczkę" default: return DefWindowProc( hwnd, msg, wparam, lparam ); return 0;
// przykladowa funkcja - konwersja double CharToDouble(HWND okno) { int textlength= GetWindowTextLength(okno) + 1; char *textbuffer = new char[textlength]; GetWindowText(okno, textbuffer, textlength); double liczba=atof(textbuffer); delete []textbuffer; return liczba; ********************** plik nagłówkowy interval.h ******************* #ifndef INTERVAL_H #define INTERVAL_H #include<math.h> using namespace std; class interval { private: double pocz, kon; public: interval() {pocz=0; kon=0; interval(double x, double y) {pocz=x; kon=y; void ustal_pocz(double x) {pocz=x; void ustal_kon(double x) { kon=x; double zwroc_pocz() {return pocz; double zwroc_kon() {return kon; void wyswietl() { cout<<endl<<" ["<<pocz<<","<<kon<<"]"<<endl; ; interval operator+(interval A, interval B) { interval W; W.ustal_pocz(A.zwroc_pocz()+B.zwroc_pocz()); W.ustal_kon(A.zwroc_kon()+B.zwroc_kon()); return W;
interval operator*(interval A, interval B) { interval W; double Ap, Ak, Bp, Bk; Ap=A.zwroc_pocz(); Ak=A.zwroc_kon(); Bp=B.zwroc_pocz(); Bk=B.zwroc_kon(); W.ustal_pocz(min(Ap*Bp, min(ap*bk, min(ak*bp, Ak*Bk)))); W.ustal_kon(max(Ap*Bp, max(ap*bk, max(ak*bp, Ak*Bk)))); return W; char* szer_inter(double x, double y, int z) { interval A(x,y); A=A*A; char *W; W=new char[20]; if(z==1) { sprintf(w,"%0.3f",a.zwroc_pocz()); else sprintf(w,"%0.3f",a.zwroc_kon()); return W; delete []W; #endif