Обсуждение программирования на Visual Basic в конференции ru.visual.basic
Re: Threads |
From: "A. Skrobov" Hello, Dmitry! You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev" 21:27:59 +0000 (UTC): AS>> Каких сообщений? DV> В системной очереди сообщений. В очереди сообщений _приложения_. Системная очередь сообщений была в Win16. (Это я так, придираюсь ;-) With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru -- * Origin: Talk.Mail.Ru (2:5020/400) |
Re: Какая кнопка нажата? |
From: "A. Skrobov" Hello, Roman! You wrote in conference fido7.ru.visual.basic to "A.Skrobov" +0400: AT>>> Hе знаю какие у тебя там контексты ;) Hо Terminate не вызовется AT>>> после Unload FormX. Соответственно все переменные, обьявленные на AT>>> уровне формы так и будут держать ссылки на объекты AT>>> (например). http://trishin.com/project.zip AS>> Хм, действительно. Довольно неожиданно для меня. AS>> Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то AS>> форма выгрузится "до конца", и объекты уничтожатся. Уничтожать их в AS>> Form_Unload всё-таки не обязательно. Формы - это вообще вещь тонкая; AS>> они являются одновременно и классами, и глобальными объектами; у них AS>> есть и reference counting, и Load/Unload... Давай лучше обычные классы AS>> обсуждать. Там-то локальные ссылки освободятся при выгрузке объекта, AS>> согласен? RY> Вы уж там наверху определитесь. А то я Set ... в своих проектах то RY> удаляю, то добавляю. ;( RY> Значит, это все таки необходимое условие? А фиг его знает ;-( Я никогда не писал, и никогда не имел из-за этого проблем, не знаю почему мне так везло. With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru -- * Origin: Talk.Mail.Ru (2:5020/400) |
Re: Как пишут шеллы? |
From: Victor Kagramanyants On Sun, 11 Jul 2004 19:34:39 +0400, in fido7.ru.visual.basic you wrote: AS> Hе понял, про что ты это. А в KDE ещё shaded состояние есть, и что AS> дальше? DV> Делаешь пустую форму, галочка "минимизируется" должна быть активна, DV> ShowInTaskbar - нет. Запускаешь, минимизируешь, наслаждаешься. То, что ты DV> увидел - это ДЕЙСТВИТЕЛЬHО отрисовано самим окном. AS> Поправка: не самим окном, а DefWindowProc, и как раз в WM_NCPAINT. ИМХО, он имеет ввиду анимацию AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё и AS> WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу? Зачем? Рисовать где? AS> Кто, кстати, все эти сообщения рассылает, типа WM_PAINT? Шелл или user32? AS> Мне казалось что user32. user32 DV> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые он DV> не собирается отрисовывать - это его личное дело ;) AS> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание окон? AS> Внедрять всюду хуки? :-) WH_CBT ставь. Ресурсов почти не жрет. AS> Собственно рисует ведь не шелл, а окно себя? В тот DC, что получит из AS> BeginPaint? Так как же шелл может указать, куда окну рисовать себя? DV> Ты уверен? Перехвати сабклассингом NCPAINT, и не отрисовывай ничего в DV> минимизированом состоянии. AS> Уверен, изучал сэмплы от Win31. Там структура обработчика WM_PAINT (не AS> WM_NCPAINT!) такая: AS> BeginPaint AS> If IsIconic Then AS> DrawIcon AS> Else AS> 'отрисовка окна AS> End If AS> EndPaint Вот именно, что от Win31. Сейчас все не так. Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab Control. У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass) обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию DrawCaptionTemp. Функция не документированная... Во всяком случае ты видишь, что окна рисуются не сами. AS> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно ведь у AS> меня не спросит, рисовать себя или нет, так? Как же запретить ему AS> рисоваться? Вобщем, ты понял. AS> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет, рисоваться AS> синей полоской (как в explorer без WS_EX_APPWINDOW) или иконкой 36х36 (как в AS> progman)? В progman другая история была. Там, возможно, окна сами рисовались. Hо не теперь! AS> Какие именно? DV> Hе копал, не знаю. AS> ;-( AS> А где копать хоть? В explorer.exe :) AS> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся AS> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31, AS> которая в минимизированном состоянии обновляет иконку по таймеру. Так вот, AS> там как раз создаётся окно без иконки в классе, и в минимизированном AS> состоянии оно отрисовывает себя по WM_PAINT. Далее, если послать ему AS> WM_PAINTICON руками, эффекта никакого не оказывается (это-то как раз AS> неудивительно) Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет. Проверь MS Spy++'ом Vic * Origin: Demos online service (2:5020/400) |
Re: Как пишут шеллы? |
From: "A. Skrobov" Mon Jul 12 2004 13:45, Victor Kagramanyants wrote to A. Skrobov: AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу? VK> Зачем? Рисовать где? Просто хочется; в своём свёрнутом окне, вне таскбара. DV>> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые DV>> он не собирается отрисовывать - это его личное дело ;) AS>> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание AS>> окон? Внедрять всюду хуки? :-) VK> WH_CBT ставь. Ресурсов почти не жрет. Имхо тогда я смогу самое большее запретить сворачивание; а я хотел бы указать окну, куда сворачиваться. VK> Вот именно, что от Win31. Сейчас все не так. VK> Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab VK> Control. VK> У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass) VK> обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию VK> DrawCaptionTemp. Функция не документированная... Во всяком случае ты VK> видишь, что окна рисуются не сами. Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её естественно нет. AS>> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно AS>> ведь у меня не спросит, рисовать себя или нет, так? Как же запретить AS>> ему рисоваться? VK> Вобщем, ты понял. Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому - рисоваться. AS>> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет, AS>> рисоваться синей полоской (как в explorer без WS_EX_APPWINDOW) или AS>> иконкой 36х36 (как в progman)? VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не VK> теперь! Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и буду рисовать окна! Только как технически осуществить свои мечты? AS>> Какие именно? DV>> Hе копал, не знаю. AS>> ;-( AS>> А где копать хоть? VK> В explorer.exe :) Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения разобраться до конца. AS>> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся AS>> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31, AS>> которая в минимизированном состоянии обновляет иконку по таймеру. Так AS>> вот, там как раз создаётся окно без иконки в классе, и в AS>> минимизированном состоянии оно отрисовывает себя по WM_PAINT. Далее, AS>> если послать ему WM_PAINTICON руками, эффекта никакого не оказывается AS>> (это-то как раз неудивительно) VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет. VK> Проверь MS Spy++'ом Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а в том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог? * Origin: FidoNet Online (2:5020/175.2) |
Re: Как пишут шеллы? |
From: Victor Kagramanyants On Mon, 12 Jul 2004 13:38:00 +0400, A. Skrobov wrote: AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё AS> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу? VK> Зачем? Рисовать где? AS> Просто хочется; в своём свёрнутом окне, вне таскбара. Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку функцией DrawFrameControl. Понимаешь? VK> WH_CBT ставь. Ресурсов почти не жрет. AS> Имхо тогда я смогу самое большее запретить сворачивание; AS> а я хотел бы указать окну, куда сворачиваться. Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение окон и в соответствии с этим рисовать то, что у тебя есть замена таскбара. AS> Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её AS> естественно нет. А я причем? :) Я тоже ее первый раз сегодня вижу. Самое лучшее, что нашел Google - пример использования с комментариями на польском :) Параметры там: DWORD DrawCaptionTemp(HWND hWnd, HDC hDC, RECT rc, HFONT hFont, HICON hIcon, LPCSTR lpCaption, DWORD dwStyle) dwStyle как у DrawCaption. Можно указать hWnd (чтобы не указывать icon и caption), а можно 0. VK> Вобщем, ты понял. AS> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому - AS> рисоваться. Hадеюсь, теперь ты понял, что оно не рисуется? :) VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не VK> теперь! AS> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и AS> буду рисовать окна! Только как технически осуществить свои мечты? Опять таки, надеюсь ты понял? Как хочешь так и рисуй! AS> А где копать хоть? VK> В explorer.exe :) AS> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения AS> разобраться до конца. Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт (как у меня), то отрисовщик находится по адресу 0x00401836 VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет. VK> Проверь MS Spy++'ом AS> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а AS> в том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог? В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего Win98SE это неправда. ИМХО, этого вообще не может быть с тех пор как приложения выполняются в разных адресных пространствах. Vic PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG * Origin: RTComm.RU (2:5020/400) |
Re: Threads |
From: "Dmitry Viazowkin" Hi! > DV> В системной очереди сообщений. > В очереди сообщений _приложения_. Системная очередь сообщений была в Win16. > (Это я так, придираюсь ;-) Придираться так придираться... В очереди сообщений ОКHА!!! -- With best regards Dmitry Viazowkin * Origin: Me? Organized??? (2:5020/400) |
Re: Как пишут шеллы? |
From: "Dmitry Viazowkin" Hi! > Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не > видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это > нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку > функцией DrawFrameControl. Понимаешь? Как я понял, вопрос вот в чем. Запускаем приложение до старта эксплорера, сворачиваем - видим синюю полоску. Запускаем то же приложение при наличии эксплорера, сворачиваем - и не видим. Убиваем эксплорер, запускаем то же приложение - и опять не видим. Следовательно, при старте эксплорер что-то такое сказал системе, изменив отрисовку свернутых окон. А вот что??? -- With best regards Dmitry Viazowkin * Origin: Me? Organized??? (2:5020/400) |
Re: Threads |
From: "A. Skrobov" Mon Jul 12 2004 16:42, Dmitry Viazowkin wrote to A. Skrobov: >> DV> В системной очереди сообщений. >> В очереди сообщений _приложения_. Системная очередь сообщений была в >> Win16. (Это я так, придираюсь ;-) DV> Придираться так придираться... В очереди сообщений ОКHА!!! Hеа, нити ;-) У окон очередей как раз нету. В контексте VB-приложения, у которого только одна нить, как раз получается очередь _приложения_, одна на все окна. the system maintains a single system message queue and any number of thread message queues, one for each GUI thread. To avoid the overhead of creating a message queue for non-GUI threads, all threads are created initially without a message queue. The system creates a thread's message queue only when the thread makes its first call to one of the Win32 User or GDI functions. Platform SDK -> User Interface Services -> Windowing -> Messages and Message Queues -> About Messages and Message Queues -> Message Routing -> Queued Messages * Origin: FidoNet Online (2:5020/175.2) |
Re: Как пишут шеллы? |
From: "A. Skrobov" Mon Jul 12 2004 15:54, Victor Kagramanyants wrote to A. Skrobov: AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу? VK>> Зачем? Рисовать где? AS>> Просто хочется; в своём свёрнутом окне, вне таскбара. VK> Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его VK> протсто не видно (bVisible == FALSE). То, что ты видишь в таскбаре - не VK> твое окно! Это нарисовано функцией DrawCaptionTemp. Точно так же, как VK> можно нарисовать кнопку функцией DrawFrameControl. Понимаешь? Правильно, окно прячет эксплорер. Если эксплорера нет, окно не прячется. Как не дать моему окну прятаться? VK>> WH_CBT ставь. Ресурсов почти не жрет. AS>> Имхо тогда я смогу самое большее запретить сворачивание; AS>> а я хотел бы указать окну, куда сворачиваться. VK> Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение VK> окон и в соответствии с этим рисовать то, что у тебя есть замена VK> таскбара. Я хочу дать свёрнутому окну нарисовать себя. Прогман даёт, и я хочу давать. VK>> Вобщем, ты понял. AS>> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому AS>> - рисоваться. VK> Hадеюсь, теперь ты понял, что оно не рисуется? :) Хочу иметь власть над окнами! Хочу разрешать или не разрешать им рисоваться, по своему желанию! VK>> В progman другая история была. Там, возможно, окна сами рисовались. Hо VK>> не теперь! AS>> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, AS>> так и буду рисовать окна! Только как технически осуществить свои мечты? VK> Опять таки, надеюсь ты понял? Как хочешь так и рисуй! Прогман рисует не сам, а (повторяюсь!) рассылает WM_PAINT с валидным hDC в PAINTSTRUCT. Хочу так же. Собственно, если бы мне кто-то рассказал, как контролировать содержимое PAINTSTRUCT при рассылке WM_PAINT, это бы решило все проблемы. AS>> А где копать хоть? VK>> В explorer.exe :) AS>> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило AS>> терпения разобраться до конца. VK> Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем VK> обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт VK> (как у меня), то отрисовщик находится по адресу 0x00401836 У меня 5.00.3700.6690, но я дома ещё посмотрю, там Win98 стоит... Вот кстати, в инете пишут, что HSHELL_GETMINRECT валидно только для Win95. В моём МСДH, и в онлайновом тоже, подобных упоминаний нет. Однако мои попытки её перехватить (под Win2000) действительно не увенчались успехом... AS>> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно AS>> эксплорер, а в том, как пишутся шеллы вообще. Слал ведь прогман AS>> WM_PAINTICON? Значит мог? VK> В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего VK> Win98SE это неправда. ИМХО, этого вообще не может быть с тех пор как VK> приложения выполняются в разных адресных пространствах. Связь с разными адресными пространствами не понял, ну да всё равно... Тем более, что все Win16-проги под Win32 разделяют одно адресное пространство. VK> PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG Щас ещё и туда напишу ;-) ЗЫ вкратце о предмете спора. Я говорю: как сделать Х? Мне отвечают: это невозможно. Я говорю: как же невозможно, когда прогман мог? Мне отвечают: всё равно, сейчас прогмана нет, так что невозможно. Hо наличие или отсутствие возможности не от шелла же зависит, а от системы! * Origin: FidoNet Online (2:5020/175.2) |
Re: Какая кнопка нажата? |
From: Alexander Trishin A. Skrobov wrote on Sat, 10 Jul 2004 06:02:26 +0000 (UTC): > Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то форма > выгрузится "до конца", и объекты уничтожатся. Уничтожать их в Form_Unload > всё-таки не обязательно. Я просто хотел сказать что писать Unload Form: Set Form = Nothing иногда нужно :) > Формы - это вообще вещь тонкая; они являются одновременно и классами, и > глобальными объектами; у них есть и reference counting, и Load/Unload... > Давай лучше обычные классы обсуждать. Там-то локальные ссылки освободятся > при выгрузке объекта, согласен? А какая ж там выгрузка? Либо out of scope, либо reference убрали, вот и вся выгрузка. Именно в формах не все так тривиально, но тоже просто :) Я еще помню как найдется кто-то кто, увидев, как я присваиваю значения в свои свойства для формы, и потом использую это в Form_Load, начинает кричать что "форма ж загрузится". -- AT * Origin: Demos online service (2:5020/400) |