MDI, окна и контролы

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 24 янв 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    1. Почему child-окна (не MDIChild!) фрейма криво (странно) ведут себя, если им дать WS_CHILD? Как по-нормальному вешать child-окна с WS_CHILD на фрейм?



    2. Можно ли как-нибудь уменьший клиентскую часть окна, не меняя размеры самого окна? Например, берем окно и лепим на него status window. Этот статус виндоу будет перекрывать часть клиентской части окна, а я хочу, чтобы клиентская часть стала меньше на этот status window. Это можно сделать? Или если чайлд-окно перекрывает половину парента. Хотелось бы уменьшить клиентскую часть на этого чайлда.



    3. TabControl: Можно ли без сабклассинга и owner-дрова сделать так, чтобы закладки не скролились, а сокращаясь полностью вмещались по ширине таб-контрола? Например как это сделано в VisualStudio на TabControl-e где Solution Explorer, Class View, Toolbox и т.д.



    4. Как более грамотно делать GetMessage для нескольких окон? Указать HWND равным нулю, или сделать отдельный трид для каждого окна? Я догадываюсь, что первое, но все же?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    2. MoveWindow



    4. Одного GetMessage достаточно, т.к. всё равно потом делать DispatchMessage.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_



    Эээ... Стас, вобще-то MoveWindow само окно двигает. Мне-то надо клиентскую часть уменьшить. Не уменьшая окно.



    Может не совсем хорошо задан первый вопрос...



    Вобщем, MDI интерфейс, статья с wasm.ru. Есть видимое окно. Оно называется Frame. Есть его дочернее невидимое окно, которое является родителем всех MDI-Child-ов. Я хочу создать какое-нибудь обычное окно со стилем WS_CHILD. Кого бы я не указал этому окну в качестве родителя, что Frame, что дочернее Frame, оно ведет себя не так как с обычными родителями. Как тут быть?
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Собственно с первым вопросом я немного тормознул... Парентом вроде надо указывать невидимый child фрейма. Всплыл еще один вопрос: Как сделать чтобы окно с WM_CAPTION нельзя было бы за этот caption потаскать?
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    И еще маленький вопросик :)

    Я сам не знаю, как это называется, поэтому попробую объяснить на примере. Скажем, WinXP. В настройках можно поставить галочку "Отображать содержимое окна при перетаскивании", а можно не ставить :) Если опция установлена, то соответственно когда мы тяним окно, оно и ползет за мышкой со всем своим содержимым. А если эта опция не установлена, то окно останется на месте, а за мышкой поползет рамочка, которая будет рисоваться на всех окнах, включая WS_EX_TOPMOST. Так вот вопрос: как такую рамочку самому рисовать?
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    _DEN_

    Так вот вопрос: как такую рамочку самому рисовать?



    "Тоже мне, фокус" :)
    Код (Text):
    1.  
    2. procedure DrawInvertedRect(hwndDest:HWND);
    3. Const NULL_BRUSH = 5;
    4.       PS_INSIDEFRAME = 6;
    5. var rc:TRect;
    6.     hdcDest:HDC;
    7.     cr:TColor;
    8.     hPen,hOldPen,hOldBrush:HGDIOBJ;
    9. begin
    10.   GetWindowRect(hwndDest, rc);
    11.   hdcDest:=GetWindowDC(0);
    12.   cr:=clBlack;
    13.   SetROP2(hdcDest,R2_XORPEN);
    14.   hPen:=CreatePen(PS_INSIDEFRAME, 0, cr);
    15.  
    16.   hOldPen:=SelectObject(hdcDest, hPen);
    17.   hOldBrush:= SelectObject(hdcDest, GetStockObject(NULL_BRUSH));
    18.  
    19.   Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom));
    20.   InflateRect(rc,-1,-1);
    21.   Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom));
    22.   InflateRect(rc,-1,-1);
    23.   Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom));
    24.  
    25.   SelectObject(hdcDest, hOldBrush);
    26.   SelectObject(hdcDest, hOldPen);
    27.  
    28.   ReleaseDC(hwndDest, hdcDest);
    29.   DeleteObject(hPen);
    30. end;
    31.  
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    CyberManiac

    Тоесть все вручную. Я-то наивный API-шку хотел :)



    Кстати, мне больше всего вот это понравилось:





    Прямо как в анекдоте: "Редактор газеты журналисту - Отличный заголовок! Еще бы статейку к нему..." :derisive:

    Не принимать близко к сердцу! :)
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Так это и есть одно сплошное API, кроме begin-end :)
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _DEN_ >




    afaik клиентская часть окна - это часть без заголовка и рамки. Если ты её уменьшишь, то и размеры окна так же изменятся. Поэтому я полагаю ты имеешь ввиду дочернее окно, покрывающее область клиента за вычетом статусбара. Его размеры можно изменять MoveWindow без влияния на родителя.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Windows.DrawFocusRect - Какое странное API :derisive:



    Ладно, зачем ты пэны и браши восстанавливаешь? Разве это надо?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_

    Так... кажется мысль ясна, остается теперь проверить как это все себя поведет с MDI...
     
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    _DEN_

    Ладно, зачем ты пэны и браши восстанавливаешь? Разве это надо?



    MSDN сказал "восстановлять" - значит восстановлять. Мое дело рявкнуть "Яволь!" и щелкнуть каблуками. А что да зачем - пускай партия думает :)
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан




    Нашел кого слушать :) Нихрена восстанавливать не надо. GetWindowDC создает отдельный объект со своей служебной информацией. Простой тест. У одного и того же окна делается дважды GetWindowDC, в один HDC селектим один пэн, в другой HDC - другой. Каждым рисуем. Результат - оба пэна можно юзать одновременно. Следствие - HGDIOBJECT-ы восстанавливать не надо.
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ты в 95м мастдае так пробовал?

    Что-то я сильно сомневаюсь в верности такого вывода.

    Общее кол-вол объектов GDI для всех процессов ограничено.

    И если их не освобождать - то до завершения процесса они будут болтаться в таблице, т.е. фактически имеем утечку ресурсов.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_





    ReleaseDC и DeleteObject никто делать не запрещает. Все корректно освобождается.







    Стас, выгляни в окно. Сугробы, идет снег. Это зима 2005-го года.
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _DEN_ >




    Ты это утверждаешь попробовав на паре объектов лишь в одной из версий виндоса?

    А в этом случае не забываешь делать DeleteObject для хэндлов возвращаемых SelectObject?

    Мои познания относительно работы GDI стремятся к нулю, но afaik в некоторых версиях виндоса ведётся подсчёт использований объектов, и соответственно они не освобождается пока ко-во ссылок не обнулится.



    >




    Утверждение не верное: снег не идёт и я не Стас :)

    А если ты ориентируешся на XP, то не забывай - там много чего "заметено под ковёр", как раз для обеспечения совместимости с прогами тех, кто не читает MSDN.

    Можно, например, делать ret вместо ret 10h из оконной процедуры - 2 байта экономии и потом куча времени на выяснение причин падения под ранними виндосами =)
     
  17. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан


    А это-то зачем делать?







    Хмммммм... Ложки нет? :)) А ну, признавайся, как зовут? :)))







    Такого не знал. И как же винда узнает, выровнили ей стек или нет?
     
  18. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    _DEN_

    Ложки нет? :))

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

    Знаю я твои методы кодинга.

    - "Так - это на х., это на х."

    - "Блин, не работает на WinXX"

    - "Ну и х. с ними"



    Все верно, если пишешь, для себя, и нужно только тебе.

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



    Поэтому, если пишешь нормальный продукт, то должен играть по правилам Microsoft (в этот момент меня стошнило).

    "Это вам не лезгинка! Левой ногой давим окурок, правой ногой давим окурок"



    Иногда после раздавления всех окурков, утечки памяти все таки возникают =(((
     
  19. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _DEN_ >




    Объект, который раньше был выбран в контексте не удалён - вот и утечка.

    Написано же:







    Попробуй вызвать 20000 CreatePen. Получилось?

    А теперь запусти сразу 2 такие проги ;)





    >




    Ну дык и посмотрел бы сам, как оконная проце-дура вызывается...

    Гм, а в SP2 уже и в TEB куда-то лезет:
    Код (Text):
    1. 77D386E7    >push    DCBAABCD
    2. 77D386EC    >push    esi
    3. 77D386ED    >push    [dword ebp+18]
    4. 77D386F0    >push    [dword ebp+14]
    5. 77D386F3    >push    [dword ebp+10]
    6. 77D386F6    >push    [dword ebp+C]
    7. 77D386F9    >mov     eax, [fs:18]
    8. 77D386FF    >or      [byte eax+FB4], 1
    9. 77D38706    >call    near [ebp+8]
    10. 77D38709    >mov     ecx, [fs:18]
    11. 77D38710    >and     [byte ecx+FB4], 0
    12. 77D38717    >cmp     [dword esp+4], DCBAABCD
    13. 77D3871F    >jnz     USER32.77D603B0
    14. 77D38725    >add     esp, 8




    >




    Меня уже давно никуда не зовут, даже если я обещаю прийти без ложки :-(((((





    jekyll >




    Ну надо полагать, что они бедные, если их босс - "средний американец" ;)
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_

    А почему именно DCBAABCD ?



    Меня уже давно никуда не зовут



    А может ты AI wasm-а? :)))))))))