Два окна с одним класом

Тема в разделе "WASM.WIN32", создана пользователем zStorm, 18 фев 2006.

  1. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    Трабл вот в чем. Подгружаетьса dllка, в ее главной функции создаетьса тред. Тред создает окно. Как сделать еще несколько таких окон? Создавать новый тред? Я подгрузил еще такую же дллку, она создала такоеже окно, но они оба начали глючить.
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    можно сделать в dll функцию, которая будет создавать окно, и вызывать её.
     
  3. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    "Глючить" это как, - убегают от мышки???



    Толи проблема слишком простая, толи ты плохо объясняешь. Переведи вопрос нормально, - по-русски, без всяких тредов, траблов...



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



    ; Функция клонирования окна

    CloneWindow proc

    ;...

    invoke CreateWindowEx,

    ;...

    CloneWindow endp

    ; Функция входа в библиотеку

    DllMain proc

    ;...

    invoke RegisterClassEx,

    ;...

    DllMain endp

    END DllMain
     
  4. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    Нет, такой способ не пройдет. То есть пройдет, но он не решит проблему. Вопрос стоит переформулировать, так как я докопался почему ети окна глючат. Причина вот в чем. В секции '.data'(пишу на fasm) хранятьса позиции и размеры некоторых контролов в окне. Когда окно получает сообщение WM_SIZE, оконная процедура и использует ети переменные. Но если создать несколько окон, то их оконные процедуры будут использовать одни и те же данные. Как создавать для каждого окна свою копию етих данных?

    Вот блин. Кажетьса придумал :). Где-то было написано, при регистрации оконного класа там можно указать количество дополнительных байт, которые будут следовать после 'window instance'. Насколько я понял, указателем на етот window instance будет значение, возвращаемое CreateWindow?



    Самый нормальный совет, который я когда-либо слышал: "если вы зашли в тупик при решении проблемы, один из лучших способов выйти из него — это объяснить проблему приятелю. Почти всегда решение возникает в вашей голове посредине объяснения"(Ален И. Голуб, "Веревка достаточной длины, чтобы... выстрелить себе в ногу")
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    CreateWindow возвращает hWnd окна, а не дополнительные байты.

    Можно собрать все переменные, относящиеся к одному окну в структуру, и каждому создаваемому окну сделать по такой структуре, чтобы они не путались. Кусочек памяти под структуру выделять динамически при помощи VirtualAlloc или HeapAlloc. А окна пусть таскают с собой указатель на свои структуры. Таскать можно в виде элемента GWL_USERDATA. Соответственно прицепить указатель на структуру к окну, и считать указатель можно SetWindowLong/GetWindowLong
     
  6. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    А не проще ли для каждого создваемого окна иметь локальные данные/переменные и не заморачиваться с выделением памяти и указателем на структуру???
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вышел из процедуры - и все локальные потерялись.

    И при входе в процедуру где брать значения, которыми инициализировать локальные переменные? Вызывать для каждого элемента GetClientRect? А если переменные не получить через апи? Т.е. какие-то негеометрические или невизуальные переменные?