GTK динамическое создание виджетов

Модератор: Модераторы разделов

evgeniypaygusov
Сообщения: 3

GTK динамическое создание виджетов

Сообщение evgeniypaygusov »

Здравствуйте!

Проблема следующего характер. Приведу на простом примере:
- на форму помещается виджет контейнер;
- в него помещается кнопка;
- запускается приложение, т.е. выполняется Application.Run ();
- при этом в отдельном потоке через некоторое время запускается другой метод, добавляющий в этот контейнер, как мне кажется, поверх него, другой виджет-контейнер, тоже с кнопкой, но маленько со смещением

В итоге:
- первая кнопка работает нормально, реагирует на все события
- второй можно передать фокус клавишей "Tab" и даже нажать её клавишей "Enter", но вот на нажатие мыши она не реагирует. Обработчики не срабатывают.

Может надо перенести её как-то на передний план, если конечно это возможно?
Или всё таки проблема в чем-то другом?
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: GTK динамическое создание виджетов

Сообщение sciko »

Код в студию. Версии библиотек и выхлоп в консоль тоже.
Спасибо сказали:
evgeniypaygusov
Сообщения: 3

Re: GTK динамическое создание виджетов

Сообщение evgeniypaygusov »

Main.cs

Код: Выделить всё

using System;
using System.Threading;
using Gtk;

namespace newProject
{
    class MainClass
    {
        public static MainWindow win;
        public static void Main (string[] args)
        {
            Application.Init ();
            win = new MainWindow ();
            win.Show ();

                        Thread thread = new Thread(
                delegate() {
                                                   Draw();
                                                 });
                         thread.Start();
            Application.Run ();
        }

        public static void Draw()
        {
            System.Threading.Thread.Sleep(1500);
            Fixed fixed2 = new Fixed();
            Button btn2 = new Button();
            btn2.HeightRequest = 50;
            btn2.WidthRequest = 50;
            btn2.Label = "panel2";
            fixed2.HeightRequest = 200;
            fixed2.WidthRequest = 200;

            fixed2.Add(btn2);
            ((Fixed.FixedChild) fixed2[btn2]).X = 50;
            ((Fixed.FixedChild) fixed2[btn2]).Y = 0;
            (win.Child as Fixed).Add(fixed2);
            ((Fixed.FixedChild) (win.Child as Fixed)[fixed2]).X = 0;
            ((Fixed.FixedChild) (win.Child as Fixed)[fixed2]).Y = 0;
            fixed2.ShowAll();
            win.ShowAll();
        }
    }
}



MainWindow.cs

using System;
using Gtk;

public partial class MainWindow : Gtk.Window
{
    public MainWindow () : base(Gtk.WindowType.Toplevel)
    {
        Build ();
        fixed1.HeightRequest = 100;
        fixed1.WidthRequest = 100;

        Button btn1 = new Button();
        btn1.HeightRequest = 50;
        btn1.WidthRequest = 50;
        btn1.Label = "panel1";
        fixed1.Add(btn1);

        ((Fixed.FixedChild) fixed1[btn1]).X = 0;
        ((Fixed.FixedChild) fixed1[btn1]).Y = 0;
        fixed1.ShowAll();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}


Библиотеки:
Gtk# for .Net 2.12.10
GTK+ Runtime 2.12.1 rev b

Консоль:

Код: Выделить всё

Loaded Module 'C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'
Started Thread 5948
Loaded Module 'C:\Documents and Settings\paygusov\Мои документы\Projects\newProject\newProject\bin\Debug\newProject.exe'
Loaded Module 'C:\WINDOWS\assembly\GAC\gtk-sharp\2.12.0.0__35e10195dab3c99f\gtk-sharp.dll'
Loaded Module 'C:\WINDOWS\assembly\GAC\glib-sharp\2.12.0.0__35e10195dab3c99f\glib-sharp.dll'
Loaded Module 'C:\WINDOWS\assembly\GAC\atk-sharp\2.12.0.0__35e10195dab3c99f\atk-sharp.dll'
Loaded Module 'C:\WINDOWS\assembly\GAC\gdk-sharp\2.12.0.0__35e10195dab3c99f\gdk-sharp.dll'
Loaded Module 'C:\WINDOWS\assembly\GAC_MSIL\Mono.Posix\2.0.0.0__0738eb9f132ed756\Mono.Posix.dll'
Started Thread 2024
Спасибо сказали:
Аватара пользователя
xterro
Сообщения: 18
ОС: openSUSE 11.4

Re: GTK динамическое создание виджетов

Сообщение xterro »

хмм... а зачем делать win.ShowAll(); в новом потоке, ведь основную форму ты уже показал?
Спасибо сказали:
evgeniypaygusov
Сообщения: 3

Re: GTK динамическое создание виджетов

Сообщение evgeniypaygusov »

разницы не почуствовал между просто показом отдельного элемента и всей формы... делаю для того чтобы показать вложенные элементы.
Спасибо сказали: