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 равным нулю, или сделать отдельный трид для каждого окна? Я догадываюсь, что первое, но все же?
S_T_A_S_ Эээ... Стас, вобще-то MoveWindow само окно двигает. Мне-то надо клиентскую часть уменьшить. Не уменьшая окно. Может не совсем хорошо задан первый вопрос... Вобщем, MDI интерфейс, статья с wasm.ru. Есть видимое окно. Оно называется Frame. Есть его дочернее невидимое окно, которое является родителем всех MDI-Child-ов. Я хочу создать какое-нибудь обычное окно со стилем WS_CHILD. Кого бы я не указал этому окну в качестве родителя, что Frame, что дочернее Frame, оно ведет себя не так как с обычными родителями. Как тут быть?
Собственно с первым вопросом я немного тормознул... Парентом вроде надо указывать невидимый child фрейма. Всплыл еще один вопрос: Как сделать чтобы окно с WM_CAPTION нельзя было бы за этот caption потаскать?
И еще маленький вопросик Я сам не знаю, как это называется, поэтому попробую объяснить на примере. Скажем, WinXP. В настройках можно поставить галочку "Отображать содержимое окна при перетаскивании", а можно не ставить Если опция установлена, то соответственно когда мы тяним окно, оно и ползет за мышкой со всем своим содержимым. А если эта опция не установлена, то окно останется на месте, а за мышкой поползет рамочка, которая будет рисоваться на всех окнах, включая WS_EX_TOPMOST. Так вот вопрос: как такую рамочку самому рисовать?
_DEN_ Так вот вопрос: как такую рамочку самому рисовать? "Тоже мне, фокус" Код (Text): procedure DrawInvertedRect(hwndDest:HWND); Const NULL_BRUSH = 5; PS_INSIDEFRAME = 6; var rc:TRect; hdcDest:HDC; cr:TColor; hPen,hOldPen,hOldBrush:HGDIOBJ; begin GetWindowRect(hwndDest, rc); hdcDest:=GetWindowDC(0); cr:=clBlack; SetROP2(hdcDest,R2_XORPEN); hPen:=CreatePen(PS_INSIDEFRAME, 0, cr); hOldPen:=SelectObject(hdcDest, hPen); hOldBrush:= SelectObject(hdcDest, GetStockObject(NULL_BRUSH)); Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom)); InflateRect(rc,-1,-1); Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom)); InflateRect(rc,-1,-1); Windows.DrawFocusRect(hdcDest,Rect(rc.Left,rc.Top,rc.Right, rc.Bottom)); SelectObject(hdcDest, hOldBrush); SelectObject(hdcDest, hOldPen); ReleaseDC(hwndDest, hdcDest); DeleteObject(hPen); end;
CyberManiac Тоесть все вручную. Я-то наивный API-шку хотел Кстати, мне больше всего вот это понравилось: Прямо как в анекдоте: "Редактор газеты журналисту - Отличный заголовок! Еще бы статейку к нему..." Не принимать близко к сердцу!
_DEN_ > afaik клиентская часть окна - это часть без заголовка и рамки. Если ты её уменьшишь, то и размеры окна так же изменятся. Поэтому я полагаю ты имеешь ввиду дочернее окно, покрывающее область клиента за вычетом статусбара. Его размеры можно изменять MoveWindow без влияния на родителя.
Windows.DrawFocusRect - Какое странное API Ладно, зачем ты пэны и браши восстанавливаешь? Разве это надо?
_DEN_ Ладно, зачем ты пэны и браши восстанавливаешь? Разве это надо? MSDN сказал "восстановлять" - значит восстановлять. Мое дело рявкнуть "Яволь!" и щелкнуть каблуками. А что да зачем - пускай партия думает
Нашел кого слушать Нихрена восстанавливать не надо. GetWindowDC создает отдельный объект со своей служебной информацией. Простой тест. У одного и того же окна делается дважды GetWindowDC, в один HDC селектим один пэн, в другой HDC - другой. Каждым рисуем. Результат - оба пэна можно юзать одновременно. Следствие - HGDIOBJECT-ы восстанавливать не надо.
Ты в 95м мастдае так пробовал? Что-то я сильно сомневаюсь в верности такого вывода. Общее кол-вол объектов GDI для всех процессов ограничено. И если их не освобождать - то до завершения процесса они будут болтаться в таблице, т.е. фактически имеем утечку ресурсов.
S_T_A_S_ ReleaseDC и DeleteObject никто делать не запрещает. Все корректно освобождается. Стас, выгляни в окно. Сугробы, идет снег. Это зима 2005-го года.
_DEN_ > Ты это утверждаешь попробовав на паре объектов лишь в одной из версий виндоса? А в этом случае не забываешь делать DeleteObject для хэндлов возвращаемых SelectObject? Мои познания относительно работы GDI стремятся к нулю, но afaik в некоторых версиях виндоса ведётся подсчёт использований объектов, и соответственно они не освобождается пока ко-во ссылок не обнулится. > Утверждение не верное: снег не идёт и я не Стас А если ты ориентируешся на XP, то не забывай - там много чего "заметено под ковёр", как раз для обеспечения совместимости с прогами тех, кто не читает MSDN. Можно, например, делать ret вместо ret 10h из оконной процедуры - 2 байта экономии и потом куча времени на выяснение причин падения под ранними виндосами =)
А это-то зачем делать? Хмммммм... Ложки нет? ) А ну, признавайся, как зовут? )) Такого не знал. И как же винда узнает, выровнили ей стек или нет?
_DEN_ Ложки нет? ) сдается мне, что S_T_A_S - это бот форума, также приходят мылси о некоторых других ботах, которые безжалостно пытаются отмодерировать... Знаю я твои методы кодинга. - "Так - это на х., это на х." - "Блин, не работает на WinXX" - "Ну и х. с ними" Все верно, если пишешь, для себя, и нужно только тебе. Вот. А потом читаешь статьи, что бедные разработчики винды, дописывают новые версии так, чтобы они эмулили ошибки старых... Поэтому, если пишешь нормальный продукт, то должен играть по правилам Microsoft (в этот момент меня стошнило). "Это вам не лезгинка! Левой ногой давим окурок, правой ногой давим окурок" Иногда после раздавления всех окурков, утечки памяти все таки возникают =(((
_DEN_ > Объект, который раньше был выбран в контексте не удалён - вот и утечка. Написано же: Попробуй вызвать 20000 CreatePen. Получилось? А теперь запусти сразу 2 такие проги > Ну дык и посмотрел бы сам, как оконная проце-дура вызывается... Гм, а в SP2 уже и в TEB куда-то лезет: Код (Text): 77D386E7 >push DCBAABCD 77D386EC >push esi 77D386ED >push [dword ebp+18] 77D386F0 >push [dword ebp+14] 77D386F3 >push [dword ebp+10] 77D386F6 >push [dword ebp+C] 77D386F9 >mov eax, [fs:18] 77D386FF >or [byte eax+FB4], 1 77D38706 >call near [ebp+8] 77D38709 >mov ecx, [fs:18] 77D38710 >and [byte ecx+FB4], 0 77D38717 >cmp [dword esp+4], DCBAABCD 77D3871F >jnz USER32.77D603B0 77D38725 >add esp, 8 > Меня уже давно никуда не зовут, даже если я обещаю прийти без ложки :-((((( jekyll > Ну надо полагать, что они бедные, если их босс - "средний американец"