Использование WTL (часть 2)
От: Александр Шаргин Россия RSDN.ru
Дата: 09.11.01 16:54
Оценка: 530 (21)
Статья :
Использование WTL (часть 2)
Автор(ы): Александр Шаргин
Дата: 03.11.2001

Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы:
CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>,
CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.


Авторы :
Александр Шаргин

Аннотация :
Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы:
CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>,
CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Версия для печати (админам)
От: Res Россия  
Дата: 14.02.02 21:12
Оценка:
в сабже что-то перепуталось см. 2 абзац
best regards
Res
CDialogResize
От: AlexanderK Россия  
Дата: 25.01.02 07:16
Оценка:
К сожалению, реализованный механизм ресайзирования приводит к неприятному эффекту мигания ресайзируемых элементов управления. Особенно хорошо проявляется на 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

http://files.rsdn.org/5763/cppprogrammer.gif
Глюки при построении Release
От: Владислав Россия  
Дата: 30.11.01 01:53
Оценка:
WTL конечно хорошо (раньше я писал приложения с помощью ATL), однако если использовать некоторые стандартные библиотеки С/С++ (например класс string STL, библиотеку stdlib и т.д. т.е. те библиотеки которые используют LIBCMT.lib) при формировании Release возникает ошибка 'линкёра':

LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Release/Speech.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Это общая проблема как ATL, так и WTL (очевидно передалось по наследству).
Я могу ошибаться, но дело здесь в методах оптимизации при построении Release и было бы интересно узнать способы решения этой проблемы (один из методов, это постепенно превращать Setting'и Debug'а в Setting'и Release'а пока не возникнет глюк, но это долго и грустно).
Suum cuique (лат.)
Pазбиение карты DDX на подкарты
От: Аноним  
Дата: 10.11.01 16:54
Оценка:
Действительно бывает очень нужно когда в диалоге довольно много контролов и обновление происходит группами. Для этого я определил вот такой #define

#define BEGIN_DDX_MAP_EX(thisClass, suffix) \
    BOOL DoDataExchange##suffix(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) \
    { \
Re: Глюки при построении Release
От: Satrap  
Дата: 06.03.02 04:45
Оценка:
Не мудрствуя лукаво вставляю после
_tWinMain(...)
{...}
main(){}
и пока не жалуюсь
Re: Глюки при построении Release
От: DSoft  
Дата: 18.02.02 13:05
Оценка:
Отключи в Project/Settings/C/C++ Preprocessor definitions флаг ATL_MIN_CRT
Re: Глюки при построении Release
От: _ivan  
Дата: 21.12.01 02:09
Оценка:
Можно попробовать в свойствах проекта из директив препроцессора убрать _ATL_MIN_CRT (как для ATL, так и для WTL) и пересобрать проект. По крайней мере класс string у меня нормально работает, остального пока не проверял. Конечно, exe от этого разбухает, но что делать.
Re: Глюки при построении Release
От: ooooo  
Дата: 30.11.01 08:37
Оценка:
в свойствах проекта убери макрос _ATL_MIN_CRT
Re: Глюки при построении Release
От: null  
Дата: 09.01.03 15:54
Оценка:
Да, до последнего я не додумался =)))
Re: DDX и CString
От: Слава Израиль  
Дата: 01.02.04 08:12
Оценка:
Здравствуйте, Александр Шаргин, Вы писали статью, а я читал и пытался использовать, в частности:

DDX_TEXT(nID, var) Связывает строковую переменную var с контролом nID (здесь и далее nID — это идентификатор контрола). Переменная var может иметь тип TCHAR*, BSTR, CComBSTR или CString. Обмен данными осуществляется при помощи функций SetWindowText и GetWindowText. Чаще всего макрос используется для статических контролов и полей ввода, хотя может применяться и с другими окнами.

Так и пишу:

BEGIN_DDX_MAP(CMainDlg)
    DDX_TEXT(IDC_EDIT1,m_strFile)
END_DDX_MAP()
/*........
.........
.......*/
private:
     CString m_strFile;


Компилирую и получаю:

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 Разве что-то поменялось?
Как же так
Спасибо за внимание
Re[2]: DDX и CString
От: _nn_ www.nemerleweb.com
Дата: 01.02.04 09:44
Оценка: 2 (1)
Здравствуйте, Слава, Вы писали:

<skip>

С>Так и пишу:


С>
С>BEGIN_DDX_MAP(CMainDlg)
С>    DDX_TEXT(IDC_EDIT1,m_strFile)
С>END_DDX_MAP()
С>/*........
С>.........
С>.......*/
С>private:
С>     CString m_strFile;
С>


С>Компилирую и получаю:


С>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 7.1 .

Попробуй подключить файлы в следущем порядке :
#define _WTL_USE_CSTRING

#include <atlbase.h>
#include <atlapp.h>

extern CAppModule _Module;

#include <atlmisc.h>
// и т.д.
#include <atlddx.h>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: DDX и CString
От: Слава Израиль  
Дата: 01.02.04 10:09
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Очень страно , у меня все компилит на WTL 7.1 .


__>Попробуй подключить файлы в следущем порядке :

__>
__>#define _WTL_USE_CSTRING

__>#include <atlbase.h>
__>#include <atlapp.h>

__>extern CAppModule _Module;

__>#include <atlmisc.h>
__>// и т.д.
__>#include <atlddx.h>
__>


Ура, заработало, спасибо.
Спасибо за внимание
Re[4]: DDX и CString
От: _nn_ www.nemerleweb.com
Дата: 01.02.04 10:12
Оценка:
Здравствуйте, Слава, Вы писали:

<skip>

С>Ура, заработало, спасибо.


Пожалуйста
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Использование WTL (часть 2)
От: Аноним  
Дата: 02.02.04 11:15
Оценка:
Здравствуйте, Александр Шаргин, Вы писали:

АШ>Статья :



АШ>Авторы :

АШ>Александр Шаргин

АШ>Аннотация :

АШ>Вторая часть статьи содержит подробное описание классов WTL, предназначенных для работы с диалоговыми окнами и элементами управления. Рассмотрены классы:
АШ>CDialogImplBaseT<>, CDialogImpl<>, CAxDialogImpl<>, CSimpleDialog<>, CWinDataExchange<>, CUpdateUI<>, CDialogResize<>, COwnerDraw<>, CCustomDraw<>,
АШ>CBitmapButton, CCheckListViewCtrl, CHyperLink, CMultiPaneStatusBarCtrlImpl, CWaitCursor.

Жаль что ничего не написано про "приятный" баг WTL: http://support.microsoft.com/default.aspx?scid=kb;en-us;202110
Сам наткнулся на него и сам решил проблему, но затем обнаружил, что это известный баг.

Неужели никто не удаляет немодальные окошки с помощью "delete this" в OnFinalMessage()?
Re[2]: Использование WTL (часть 2)
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.02.04 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Жаль что ничего не написано про "приятный" баг WTL: http://support.microsoft.com/default.aspx?scid=kb;en-us;202110

А>Сам наткнулся на него и сам решил проблему, но затем обнаружил, что это известный баг.

The information in this article applies to:
The Microsoft Active Template Library (ATL) 3.0 ...


А>Неужели никто не удаляет немодальные окошки с помощью "delete this" в OnFinalMessage()?


у меня в 7,0 и 7,1 не проявляется
Re: Использование DDX_TEXT
От: Василий Зверев Россия  
Дата: 29.10.05 23:35
Оценка:
Размер буфера в WTL 7.0 в случае UNICODE должен считаться правильно:
BOOL DDX_Text(UINT nID, LPTSTR lpstrText, int nSize, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)
{
  // ...
  int nRetLen = ::GetWindowText(hWndCtrl, lpstrText, cbSize / sizeof(TCHAR));
  // ...
}

А ещё было бы неплохо чётче упомянуть в статье, что при использовании CString проблемы с определением размера буфера отпадают:
BEGIN_DDX_MAP(CMyDlg)
  DDX_TEXT(IDC_EDIT1, m_mystring)
END_DDX_MAP()

CString m_mystring;
Re: Использование WTL (часть 2)
От: Аноним  
Дата: 03.05.06 19:59
Оценка: +1 :))
Если этот кошмар — это простой и понятный код, то даже не берусь представить, как он выгляди при использовании MFC.

--
Дельфиец.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.