Аннотация :
Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы:
CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>,
CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
К сожалению, реализованный механизм ресайзирования приводит к неприятному эффекту мигания ресайзируемых элементов управления. Особенно хорошо проявляется на listbox'е с установленными в карте DLGRESIZE_MAP флагами DLSZ_SIZE_X и DLSZ_SIZE_Y. Во избежание этого достаточно закомментировать в функции DlgResize_UpdateLayout строки pT->SetRedraw(FALSE);pT->SetRedraw(TRUE) и pT->RedrawWindow(NULL, NULL, RDW_ERASE|RDW_INVALIDATE| RDW_UPDATENOW|RDW_ALLCHILDREN).
Еще есть небольшой бажок в обработчике сообщения WM_SIZE: параметру bHandled не присваивается значение FALSE, что приводит к завершению просмотра всей карты сообщений, а это, в принципе, неверно.
Чтобы хорошо работать, надо получать от этого удовольствие! (c) Michael Schumacher
WTL конечно хорошо (раньше я писал приложения с помощью ATL), однако если использовать некоторые стандартные библиотеки С/С++ (например класс string STL, библиотеку stdlib и т.д. т.е. те библиотеки которые используют LIBCMT.lib) при формировании Release возникает ошибка 'линкёра':
Это общая проблема как ATL, так и WTL (очевидно передалось по наследству).
Я могу ошибаться, но дело здесь в методах оптимизации при построении Release и было бы интересно узнать способы решения этой проблемы (один из методов, это постепенно превращать Setting'и Debug'а в Setting'и Release'а пока не возникнет глюк, но это долго и грустно).
Suum cuique (лат.)
Pазбиение карты DDX на подкарты
От:
Аноним
Дата:
10.11.01 16:54
Оценка:
Действительно бывает очень нужно когда в диалоге довольно много контролов и обновление происходит группами. Для этого я определил вот такой #define
Можно попробовать в свойствах проекта из директив препроцессора убрать _ATL_MIN_CRT (как для ATL, так и для WTL) и пересобрать проект. По крайней мере класс string у меня нормально работает, остального пока не проверял. Конечно, exe от этого разбухает, но что делать.
Здравствуйте, Александр Шаргин, Вы писали статью, а я читал и пытался использовать, в частности:
DDX_TEXT(nID, var) Связывает строковую переменную var с контролом nID (здесь и далее nID — это идентификатор контрола). Переменная var может иметь тип TCHAR*, BSTR, CComBSTR или CString. Обмен данными осуществляется при помощи функций SetWindowText и GetWindowText. Чаще всего макрос используется для статических контролов и полей ввода, хотя может применяться и с другими окнами.
С>Компилирую и получаю:
С>error C2664: 'BOOL WTL::CWinDataExchange<T>::DDX_Text(UINT,LPTSTR,int,BOOL,BOOL,int)' : cannot convert parameter 2 from 'WTL::CString' to 'LPTSTR'
С>Это в WTL7.1 Разве что-то поменялось? С>Как же так
Здравствуйте, Александр Шаргин, Вы писали:
АШ>Статья :
АШ>Авторы : АШ>Александр Шаргин
АШ>Аннотация : АШ>Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы: АШ>CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>, АШ>CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.