LINUX.ORG.RU

gtk+ Кнопка на рисунке в


0

0

Добрый день. Можно ли в gtk+ сделать такую штуку. Через cairo нарисовать круг заполнить его градиентом а потом в середину этого круга поместить кнопку?

Просто на окне я круг нарисовал. Пытаюсь добавить кнопку а она не появляется. Добавляю кнопку без рисования и кнопка появляется.

Я в вашей палате недавно, но ответьте мне пожалуйста: тут принято нормально воспринимать столь тупые вопросы?

Ответ на вопрос: cначала gtk_widget_set_app_paintable(window, TRUE), потом return FALSE в обработчике сигнала "expose-event".

ShprotX
()
Ответ на: комментарий от ShprotX

>тут принято нормально воспринимать столь тупые вопросы?

Не хами плиз. Вопрос нормальный и задан нормально.

Deleted
()
Ответ на: комментарий от crazymaks

> Попробовал. Эффект тотже.

Ну дай код, что ли. Причин может быть море {и все они заключаются в кривых руках}. Навскидку: обработчик присоединяется с флагом G_CONNECT_AFTER (т.е. через g_signal_connect_after).

ShprotX
()
Ответ на: комментарий от Deleted

Этот вопрос из тех, которые плавно перерастают в "Я написал программу на N тысяч строк кода, которая делает то-то и то-то, но она почему-то сегфолтится. Не могли бы вы подсказать почему?". Судя по конкретному вопросу, автор даже не пытался искать ошибку (может и пытался, но мне от этого не легче). Одно дело "я пытался использовать такой-то софт, но у меня не получилось", а другое дело "я пытался написать что-то сам, но у меня не получилось". Во втором случае абсолютно не известно, что курил автор во время написания программы (кода я до сих пор не вижу, кстати). Почему-то люди в самых элементарных ситуациях предпочитают задать вопрос на форуме, чем поискать ответ самому. Грустно.

ShprotX
()
Ответ на: комментарий от ShprotX

Код - да пожалуйста. А вот нервишки надо лечить.

#include <gtkmm.h> #include <gtkmm/button.h> #include <gtkmm/window.h> #include <gtkmm/widget.h> #include <gtkmm/drawingarea.h> #include <gtkmm/image.h> #include <cairomm/context.h> #include <stdlib.h>

class MainWindow :public Gtk::Window { private: int h,w; Gtk::Button but1; Gtk::Button but2; Gtk::Image im; Gtk::Layout layout; Gtk::Fixed fixed; bool on_expose_event(GdkEventExpose*); void drawAll(); public: MainWindow(); ~MainWindow(); };

bool MainWindow::on_expose_event(GdkEventExpose* event) { Glib::RefPtr<Gdk::Window> window = get_window(); if(window) {

Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); int lesser = MIN(width, height); int xc, yc; xc = width; yc = height; Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); Cairo::RefPtr<Cairo::ImageSurface> image= Cairo::ImageSurface::create_from_png("/home/projects/touch/touch/content_backgr ound.png"); Cairo::RefPtr<Cairo::SurfacePattern> patern=Cairo::SurfacePattern::create(image); patern->set_extend(Cairo::EXTEND_REPEAT); double x0 = 150, y0 = 150, rect_width = xc-200, rect_height = yc-170;

double x1,y1; x1=x0+rect_width; y1=y0+rect_height;

cr->set_line_width(1); cr->save(); cr->set_source_rgb(124, 159, 223/*, 0.9*/); // green cr->paint(); cr->restore();

cr->save(); x0=x0-10; y0=y0-10; x1=x1+10; y1=y1+10; cr->save(); cr->move_to ( x0, (y0 + 20)); cr->curve_to ( x0 ,y0, x0, y0, (x0 + 20), y0); cr->line_to(x1-20,y0); cr->curve_to ( x1 ,y0, x1, y0, (x1), y0+20); cr->line_to(x1,y1-20); cr->curve_to ( x1 ,y1, x1, y1, (x1-20), y1); cr->line_to(x0+20,y1); cr->curve_to (x0 ,y1, x0, y1, x0, y1-20); cr->close_path (); cr->set_source_rgb ( 0, 0, 0); cr->stroke_preserve(); cr->set_source_rgb ( 1.0, 1.0, 1.0); cr->fill(); cr->restore(); x0=x0+10; y0=y0+10; x1=x1-10; y1=y1-10;

cr->save(); cr->move_to ( x0, (y0 + 20)); cr->curve_to ( x0 ,y0, x0, y0, (x0 + 20), y0); cr->line_to(x1-20,y0); cr->curve_to ( x1 ,y0, x1, y0, (x1), y0+20); cr->line_to(x1,y1-20); cr->curve_to ( x1 ,y1, x1, y1, (x1-20), y1); cr->line_to(x0+20,y1); cr->curve_to (x0 ,y1, x0, y1, x0, y1-20); cr->close_path (); cr->set_source(patern); cr->fill_preserve(); cr->restore(); cr->save(); cr->move_to ( x0, (y0 + 20)); cr->curve_to ( x0 ,y0, x0, y0, (x0 + 20), y0); cr->line_to(x1-20,y0); cr->curve_to ( x1 ,y0, x1, y0, (x1), y0+20); cr->line_to(x1,y1-20); cr->curve_to ( x1 ,y1, x1, y1, (x1-20), y1); cr->line_to(x0+20,y1); cr->curve_to (x0 ,y1, x0, y1, x0, y1-20); cr->close_path (); cr->set_source_rgb (0, 0, 0); cr->set_line_width (1.0); cr->stroke(); cr->restore(); }

return false; }

MainWindow::MainWindow() { set_app_paintable(true); h=Gdk::screen_height(); w=Gdk::screen_width(); im.set("/home/projects/touch/touch/button_main.png"); but2.set_label("my button"); but1.set_app_paintable(true); but2.show(); fixed.put(but2,0,0); fixed.show(); add(fixed); show_all_children(); im.show(); resize(w,h); }

MainWindow::~MainWindow() {

}

int main(int argc, char **argv) { Gtk::Main kit(argc, argv);

MainWindow window; Gtk::Main::run(window);

return 0; }

crazymaks
() автор топика
Ответ на: комментарий от crazymaks

> return false;

return Window::on_expose_event(event). Это не gtk+, а gtkmm.

За форматирование - зачет, за Gtk::Fixed - зачет. Спасибо, проблевался.

ShprotX
()
Ответ на: комментарий от ShprotX

Не за что. Приятного аппетита. Обращайтесь еще. Заодно и к психиатру можешь обратится. Он тебе точно поможет. Кстати где ты так научился воздух сотрясать? Шуму много а по делу ничего не сказано. Если сам ламер нечего других напрягать.

crazymaks
() автор топика
Ответ на: комментарий от crazymaks

запости с нормальным форматированием, будет легче осозновать суть этих букоф. а то совсем не читабельно.

Deleted
()
Ответ на: комментарий от Deleted

А незачем постить, я уже решение написал. Только он умудрился его не понять.

ShprotX
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.