Main Photo Album Fair Tail Programming GuestBook RussianRussian

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 диалогах.

Маленький пример использования библиотеки для реализации ресайзинга в диалоге. Пусть у нас имеется диалог:
IDC_S1 and IDC_LIST1 ID_APP_ABOUT IDCANCEL IDOK
и хочется чтобы при изменении размеров ListBox и GroupBox расползались вместе с окном, кнопка OK оставалась в левом углу, Cancel в центре, а About в правом углу. Примерно вот так:
IDC_S1 and IDC_LIST1 ID_APP_ABOUT IDCANCEL IDOK

Чтобы получить такой результат нужно сделать следующее:

#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");

Усе, теперь диалог при изменении размеров будет вести так как нам того хотелось.


Top of Page
Programming


ICQ UIN:my icq63179813 (Add to contact list, Message for Me)

e-mail:  Alexander D. Alexeev

© 2002-2006 Alexander D. Alexeev
Hosted by uCoz