Hi! Извиняюсь за наиглупейший вопрос (и что он не BEGINNERS), но у меня уже от него крыша едет... Такая проблема: приложение создает диалоговое окно, в нем есть конроллы =) И эти конроллы необходимо в ходе выполнения скрывать/показывать (в частности класса "Static"), т.е., если взять аналог на Builder`e, то это будет выглядеть так: SomeLabel->Visible=FALSE (TRUE) С SendDlgItemMessage, ShowWindow, GetWindowLong/SetWindowLong чёт не получается... Пробовал дизассемблировать этот код с билдера, но там Карпатский лес какой-то... Help plz!
в VS6 все статики по умолчанию имеют зарезервированный ID - IDC_STATIC контролы с таким ID нельзя скрыть, изменить текст и т.д. попробуй его измени (в смысле ID ).
Скрываем: ShowWindow(GetDlgItem(hDlg,ID),SW_HIDE); Показываем: ShowWindow(GetDlgItem(hDlg,ID),SW_SHOW);
rmn Просто, если ID не уникальный, хендл такого контрола нельзя получить через GetDlgItem, но это не значит, что такой статик нельзя скрыть, изменить текст и т.д.
readme Quantum В том-то и дело, что не скрываются они: ; получаем HWND invoke GetDlgItem,hWnd,IDC_lbl_Error invoke ShowWindow,eax,FALSE ; скрываем НЕ СКРЫВАЕТ! В ресурсах у меня CONTROL "Бла-бла-бла",IDC_lbl_Error,"Static",0x50000000,194,35,118,8,0x0000000 0
Сам контрол, ессесно, находится в шаблоне, т.е. создается с помощью CreateDialogParam. Может в этом проблема и надо их ручками создавать - CreateWindowEx?
gloomyraven Должен скрывать. Раз не скрывает, ищите ошибку: 1. Проверьте, что IDC_lbl_Error в ресурсе равен IDC_lbl_Error в коде. 2. Убедитесь, что нет больше контролов в этом диалоге с одинаковым ID. 3. Убедитесь, что hWnd действительно является хендлом диалога со статиком. Проще, конечно, пройтись отладчиком и сразу увидеть причину ошибки. Без разницы. ЗЫ: А Вы случайно не обрабатываете сообщения WM_PAINT и/или WM_ERASEBKGND в этом диалоге?
1. GetDlgItem возвращает: ERROR_CONTROL_ID_NOT_FOUND 2. IDC_lbl_Error в ресурсе равен IDC_lbl_Error в коде 3. этот конрол уникальный 4. WM_PAINT и/или WM_ERASEBKGND не обрабатываю И ещё: lblClass db "Static",0 ... invoke FindWindowEx,hWnd,0,offset lblClass,0 invoke ShowWindow,eax,FALSE Находит и прячет 1-й статик,а lblClass db "Static",0 lbl db "Bla-bla",0 ... invoke FindWindowEx,hWnd,0,offset lblClass,offset lbl invoke ShowWindow,eax,FALSE Выдает туже ошибку (ERROR_CONTROL_ID_NOT_FOUND)
rmn Кто сказал, что нельзя? Просто может так получиться, что спрятанное окно всё равно будет видно, если фон не стирается. gloomyraven Сейчас гляну.
gloomyraven 1. Зачем регистрировать класс DLGCLASS? 2. В CreateDialogParam нужно передавать адрес обработчика сообщений. Я удивляюсь вообще, что винда разрулила такой изврат с классами. А контрол не находится, т.к. его просто нет. Диалог не заполняется контролами из-за ошибки в п1-2.
Quantum DLDCLASS регистрировал, чтобы создать диалоговый шаблон как класс окна и создать "окно" из этого класса. Так проще - не надо вручную создавать контролы. - а зачем, если мы создаем новый класс и указываем ему WndProc?
Quantum А у тебя вообще окно создалось? Если да, то посмотри: ProgressBar работает нормально... (нажми File->Open и выбери файл)