raspberry pi1 중ltkmm의 3
3692 단어 gtkmmclockRaspberryPi1
raspberry pi1로 gtkmm 해봤어요.
손목시계를 만들어 보았다.
사진.
샘플 코드
#include <gtkmm/drawingarea.h>
#include <ctime>
#include <cmath>
#include <cairomm/context.h>
#include <glibmm/main.h>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
class Clock: public Gtk::DrawingArea
{
public:
Clock();
virtual ~Clock();
protected:
bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
bool on_timeout();
double m_radius;
double m_line_width;
};
Clock::Clock(): m_radius(0.42), m_line_width(0.05)
{
Glib::signal_timeout().connect( sigc::mem_fun(* this, &Clock::on_timeout), 1000);
}
Clock::~Clock()
{
}
bool Clock::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
Gtk::Allocation allocation = get_allocation();
const int width = allocation.get_width();
const int height = allocation.get_height();
cr->scale(width, height);
cr->translate(0.5, 0.5);
cr->set_line_width(m_line_width);
cr->save();
cr->set_source_rgba(0.337, 0.612, 0.117, 0.9);
cr->paint();
cr->restore();
cr->arc(0, 0, m_radius, 0, 2 * M_PI);
cr->save();
cr->set_source_rgba(1.0, 1.0, 1.0, 0.8);
cr->fill_preserve();
cr->restore();
cr->stroke_preserve();
cr->clip();
for (int i = 0; i < 12; i++)
{
double inset = 0.05;
cr->save();
cr->set_line_cap(Cairo::LINE_CAP_ROUND);
if (i % 3 != 0)
{
inset *= 0.8;
cr->set_line_width(0.03);
}
cr->move_to((m_radius - inset) * cos (i * M_PI / 6), (m_radius - inset) * sin (i * M_PI / 6));
cr->line_to (m_radius * cos (i * M_PI / 6), m_radius * sin (i * M_PI / 6));
cr->stroke();
cr->restore();
}
time_t rawtime;
time(&rawtime);
struct tm * timeinfo = localtime(&rawtime);
double minutes = timeinfo->tm_min * M_PI / 30;
double hours = timeinfo->tm_hour * M_PI / 6;
double seconds= timeinfo->tm_sec * M_PI / 30;
cr->save();
cr->set_line_cap(Cairo::LINE_CAP_ROUND);
cr->save();
cr->set_line_width(m_line_width / 3);
cr->set_source_rgba(0.7, 0.7, 0.7, 0.8);
cr->move_to(0, 0);
cr->line_to(sin(seconds) * (m_radius * 0.9), -cos(seconds) * (m_radius * 0.9));
cr->stroke();
cr->restore();
cr->set_source_rgba(0.117, 0.337, 0.612, 0.9);
cr->move_to(0, 0);
cr->line_to(sin(minutes + seconds / 60) * (m_radius * 0.8), -cos(minutes + seconds / 60) * (m_radius * 0.8));
cr->stroke();
cr->set_source_rgba(0.337, 0.612, 0.117, 0.9);
cr->move_to(0, 0);
cr->line_to(sin(hours + minutes / 12.0) * (m_radius * 0.5), -cos(hours + minutes / 12.0) * (m_radius * 0.5));
cr->stroke();
cr->restore();
cr->arc(0, 0, m_line_width / 3.0, 0, 2 * M_PI);
cr->fill();
return true;
}
bool Clock::on_timeout()
{
auto win = get_window();
if (win)
{
Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
win->invalidate_rect(r, false);
}
return true;
}
int main(int argc, char ** argv)
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
Gtk::Window win;
win.set_title("Cairomm Clock");
Clock c;
win.add(c);
c.show();
return app->run(win);
}
이상.
Reference
이 문제에 관하여(raspberry pi1 중ltkmm의 3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ohisama@github/items/f86b805d56647c1c9f88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)