Grafika z pliku .xpm pixeli obrazu. Praktycznie nadaje się do
Transkrypt
Grafika z pliku .xpm pixeli obrazu. Praktycznie nadaje się do
Grafika z pliku .xpm
XPM (X PixMap) jest formatem plików graficznych, używającym zestawu kodów ASCII do zapisu kolorów
pixeli obrazu. Praktycznie nadaje się do niewielkich obrazków, np. ikon.
Wyświetlić obraz.xpm w trybie graficznym można w systemie Windows przy pomocy programów:
IrfanView, ACDSee, GIMP, Corel, GreenFish Icon Editor. Zawartość „graficzną” można podglądać w trybie
tekstowym, w zwykłym edytorze tekstu, np. Notatniku.
Zapis obrazu (np. jpg, png, gif) w formacie .xpm zrobią programy: GIMP, GreenFish Icon Editor.
Plik XPM można #includować do programu, ponieważ zawiera gotowy kod w języku C: tablicę znaków:
Ikona 16 x 16 pixeli
plik buzia.xpm
otwarty w GreenFish Icon
Odpowiadający jej zapis tekstowy:
plik buzia.xpm
otwarty w Notatniku
/* XPM */
s t a t i c c h a r * b u z i a [ ] = { // nazwa zmiennej
"16 16 4 1 0 0",
// parametry: rozmiary, liczba kolorów
"
c #000000",
// znaki odpowiadające kolorom RRGGBB
"! c #FF1600",
"# c #FFFB80",
"$ c None",
// kolory pixeli w linii
"$$$$$$$$$$$$$$$$",
"$$$$$
$$$$$",
"$$$$ !!!!!! $$$$",
"$$$ !!!!!!!! $$$",
"$$ !!!!!!!!!! $$",
"$ !!!##!!##!!! $",
"$ !!!##!!##!!! $",
"$ !!!!!!!!!!!! $",
"$ !!!!!!!!!!!! $",
"$ !!!######!!! $",
"$ !!!!!##!!!!! $",
"$$ !!!!!!!!!! $$",
"$$$ !!!!!!!! $$$",
"$$$$ !!!!!! $$$$",
"$$$$$
$$$$$",
"$$$$$$$$$$$$$$$$"
};
zastosowanie w programie: aby udostępnić obraz wystarczy wywołać
nazwę tablicy znakowej z pliku xpm
#include ”buzia.xpm”
WxStaticBitmap1->SetBitmap(wxBitmap(buzia));
Można i tak: Dołaczanie zasobów graficznych programu w pliku .rc projektu
W pliku Projekt1App.rc: zdefiniuj zasób, podając jego nazwę, typ i lokalizację pliku (grafika tylko BMP)
#include <wx/msw/wx.rc>
// to już jest umieszczone w programie
buzia BITMAP "obrazy/buzia.bmp"
// dopisz tę linię: nazwa_zasobu typ ”lokalizacja pliku”
W pliku Projekt1Frm.cpp zastosuj ten zasób:
WxStaticBitmap1->SetBitmap(wxBitmap("buzia"));
// nazwa zasobu w cudzysłowach
Program – symulator bramek logicznych
W okienku umieść komponenty z grupy Containers:
• najpierw wxNotebook –może zawierać wiele paneli dostępnych poprzez zakładki u góry okienka
• następnie w tym komponencie umieść kilka paneli - obiektów klasy wxNotebookPage,
treść napisu na zakładkach paneli zmień w ich właściwościach: Label
Na każdym z paneli umieść niezbędne komponenty z grupy CommonControls: obiekt klasy wxStaticText,
dwie wxStaticBitmap-y i 3 wxCheckBox-y.
Do komponentów klasy wxStaticBitmap załadujemy przygotowane obrazki w formacie .xpm, symbol
bramki i jej tablicę prawdy, instrukcjami już po uruchomieniu programu, w trybie run-time.
wxCheckBox-om ustaw opis 0 obok znacznika w ich właściwości Caption i obsłuż im zdarzenie OnClick.
Metody wxCheckBox-a: bool IsChecked() sprawdza ustawienie, void SetValue(true/false) ustawia.
Plik Okno.h ma zawierać 2 klasy: Okno, zdefiniowaną przez automat programu wxDEV, oraz Bramka
class Bramka {
public: bool x,y,z;
Bramka() {
x=false; y=false; z=false;
}
};
// x,y – wejścia, z - wyjście
// konstruktor klasy Bramka
Okno.cpp
#include "Okno.h"
#include "obrazy/bramka_and.xpm" // tak samo zainkluduj kody obrazków .xpm dla pozostałych paneli
#include "obrazy/tabela_and.xpm" // pliki .xpm są w podkatalogu obrazy, umieszczonym w katalogu projektu
BEGIN_EVENT_TABLE(Okno,wxFrame)
EVT_CLOSE(Okno::OnClose)
EVT_CHECKBOX(ID_WXCHECKBOX1,Okno::WxCheckBox1Click) // obsługa kliknięcia wxCheckBox-a
EVT_CHECKBOX(ID_WXCHECKBOX2,Okno::WxCheckBox2Click)
END_EVENT_TABLE()
Bramka b1, b2, b3, b4, b5, b6;
// b1 to ramka na pierwszym panelu, b2 – na drugim panelu itd
Okno::Okno(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const
wxSize& size, long style) : wxFrame(parent, id, title, position, size, style) {
CreateGUIControls();
WxStaticBitmap1->SetBitmap( wxBitmap(bramka_and) );
// tak samo załaduj obrazkki .xpm
WxStaticBitmap2->SetBitmap( wxBitmap(tabela_and) );
// w pozostałych panelach
}
void Okno::WxCheckBox1Click(wxCommandEvent& event) {
if (WxCheckBox1->IsChecked()) { b1.x=true;
WxCheckBox1->SetLabel("1");
}
else { b1.x=false;
WxCheckBox1->SetLabel("0");
}
b1.z = b1.x && b1.y;
WxCheckBox3->SetValue(b1.z);
WxCheckBox3->SetLabel(wxString::Format("%i",b1.z));
}
void Okno::WxCheckBox2Click(wxCommandEvent& event) {
if (WxCheckBox2->IsChecked()) {
b1.y=true;
WxCheckBox2->SetLabel("1");
}
else { b1.y=false;
WxCheckBox2->SetLabel("0");
}
b1.z = b1.x && b1.y;
WxCheckBox3->SetValue(b1.z);
WxCheckBox3->SetLabel(wxString::Format("%i",b1.z));
}
Reguły dla pozostałych bramek:
bramka NAND
b2.z = ! (b2.x && b2.y);
bramka OR
b3.z = b3.x || b3.y;
bramka XOR
b4.z = (b4.x && ! b4.y) || (!b4.x && b4.y) ;
// przerzutnik RS
void Okno::WxCheckBox13Click(wxCommandEvent& event) {
if (WxCheckBox13->IsChecked() && WxCheckBox14->IsChecked()) {
wxMessageBox("stan zabroniony\nwejścia SET i RESET nie mogą jednocześnie przyjmować wartości 1");
WxCheckBox13->SetValue(false);
return;
}
if (WxCheckBox13->IsChecked()) {b5.x=true; WxCheckBox13->SetLabel("1");}
else {b5.x=false; WxCheckBox13->SetLabel("0");}
b5.z = b5.x || (b5.z && (!b5.y));
WxCheckBox15->SetValue(b5.z); WxCheckBox15->SetLabel(wxString::Format("%i",b5.z));
WxCheckBox16->SetValue(!b5.z); WxCheckBox16->SetLabel(wxString::Format("%i",!b5.z));
}
void Okno::WxCheckBox14Click(wxCommandEvent& event) {
if (WxCheckBox13->IsChecked() && WxCheckBox14->IsChecked()) {
wxMessageBox("stan zabroniony\nwejścia SET i RESET nie mogą jednocześnie przyjmować wartości 1");
WxCheckBox14->SetValue(false);
return;
}
if (WxCheckBox14->IsChecked()) {b5.y=true; WxCheckBox14->SetLabel("1");}
else {b5.y=false; WxCheckBox14->SetLabel("0");}
b5.z = b5.x || (b5.z && (!b5.y));
WxCheckBox15->SetValue(b5.z); WxCheckBox15->SetLabel(wxString::Format("%i",b5.z));
WxCheckBox16->SetValue(!b5.z); WxCheckBox16->SetLabel(wxString::Format("%i",!b5.z));
}
// przerzutnik JK
void Okno::WxCheckBox21Click(wxCommandEvent& event) {
if (WxCheckBox21->IsChecked()) {b6.x=true; WxCheckBox21->SetLabel("1");}
else {b6.x=false; WxCheckBox21->SetLabel("0");}
if (WxCheckBox21->IsChecked() && WxCheckBox22->IsChecked())
b6.z=!b6.z;
else
b6.z = b6.x || (b6.z && (!b6.y));
WxCheckBox23->SetValue(b6.z); WxCheckBox23->SetLabel(wxString::Format("%i",b6.z));
WxCheckBox24->SetValue(!b6.z); WxCheckBox24->SetLabel(wxString::Format("%i",!b6.z));
}
void Okno::WxCheckBox22Click(wxCommandEvent& event) {
if (WxCheckBox22->IsChecked()) {b6.y=true; WxCheckBox22->SetLabel("1");}
else {b6.y=false; WxCheckBox22->SetLabel("0");}
if (WxCheckBox21->IsChecked() && WxCheckBox22->IsChecked())
b6.z=!b6.z;
else
b6.z = b6.x || (b6.z && (!b6.y));
WxCheckBox23->SetValue(b6.z); WxCheckBox23->SetLabel(wxString::Format("%i",b6.z));
WxCheckBox24->SetValue(!b6.z); WxCheckBox24->SetLabel(wxString::Format("%i",!b6.z)); }