Главная Фотки Сказка Программизмы Гостевая | English |
ResizableLib для WTL.Изначальный вариант библиотеки создан Paolo Messina для MFC. На мой взгляд, это самая простая в использовании и наиболее качественная библиотека для реализации ресайзинга диалогов. Умеет делать Flicker-free ресайзинг, пропорциональный ресайзинг. Реализована поддержка всех типов диалоговых окон, от простых Dialog до PropertySheet и Wizards. Исходный вариант библиотеки можно посмотреть на CodeProject Последние исходные тексты доступны из под CVS на SorceForge.net Описание библиотеки теперь можно найти и на английском в уже отредактированном виде на CodeProject Есть в программировании под Win32 достаточно хлопотная задача, изменять расположение контролов в окне диалога, в зависимости от изменения размеров диалога. Все бы ничего, если диалог в программе один, садимся на WM_SIZE и понеслась, двигаем каждый контрол в соответсвенно посчитаннцю позицию. А вот если диалогов много, и контролов на них не по одному-два, а тоже много, то тут нада изобретать как нибудь универсальный механизм. Наилучшее, на мой взгляд, из того что попадалось в инете это ResizableLib. В силу ряда причин, я в своей работе пользуюсть библиотекой WTL поэтому пришлость сотворить порт ResizableLib для WTL. На сегодняшний день существует порт библиотеки весии 1.4. Исходная версия пререлиз, поэтому там возможны всевозможны ошибки и глюки, но в целом, для несложных случаев все работает на ура. Так что пользуйтесь. (скачать библиотеку ResizableLib.zip(32k)) (скачать пример использования ResizeTest.zip(11k)) Как использовать в WTL диалогах.Маленький пример использования библиотеки для реализации ресайзинга в диалоге. Пусть у нас имеется диалог:и хочется чтобы при изменении размеров ListBox и GroupBox расползались вместе с окном, кнопка OK оставалась в левом углу, Cancel в центре, а About в правом углу. Примерно вот так: Чтобы получить такой результат нужно сделать следующее: #pragma once #include <ResizableLib.h> class CMainDlg : public CResizableDialogImpl<CMainDlg>, // Всяческие ваши предки, в моем варианте: public CUpdateUI<CMainDlg>, public CMessageFilter, public CIdleHandler { typedefCResizableDialogImpl<CMainDlg>; public: enum { IDD = IDD_MAINDLG }; virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL OnIdle(); BEGIN_UPDATE_UI_MAP(CMainDlg) END_UPDATE_UI_MAP() BEGIN_MSG_MAP(CMainDlg) CHAIN_MSG_MAP(baseClass) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) COMMAND_ID_HANDLER(IDOK, OnOK) COMMAND_ID_HANDLER(IDCANCEL, OnCancel) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); void CloseDialog(int nVal); }; В OnInitDialog добавляем следующие сроки: AddAnchor(IDC_S1, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_LIST1, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_LEFT); AddAnchor(IDCANCEL, BOTTOM_CENTER); AddAnchor(ID_APP_ABOUT, BOTTOM_RIGHT);Если хотим чтобы размеры диалога сохранялись в реестре добавляем: CComPtr<IRegistryManager> spRegMng; EnableSaveRestore(HKEY_CURRENT_USER, "Software\\AlexTheBoss\\Settings", PLACEMENT_ENT, "MainDlg"); Усе, теперь диалог при изменении размеров будет вести так как нам того хотелось. Наверх Программизмы |
ICQ UIN:63179813
(Добавить меня,
Сообщение для меня) e-mail: Александр Алексеев |
© 2002-2006 Александр Алексеев |