Интерфейс типа RSDN@Home
От: Аноним  
Дата: 05.05.04 14:13
Оценка:
В общем хотелось бы нарисовать на WTL следущее:
Две панельки, у левой хотелось бы след. фич: auto hide, dockable, floating, hide, toolbar.
Правая на основе HTML page.

В общем внешний вид левой панели один в один похож на Server explorer из 7 студии.
Или что-то вроде Панели навигации в RSDN@Home + toolbar желательно.
На С# я подозреваю это можно сделать, но ведь без .Net Framework работать не будет ?

Можно ли такое сделать на WTL ? Какие классы нужно использовать ?
Re: Интерфейс типа RSDN@Home
От: avbochagov Россия  
Дата: 06.05.04 11:37
Оценка: 8 (2)
Здравствуйте, <Аноним>, Вы писали:

А>В общем хотелось бы нарисовать на WTL следущее:

А>Две панельки, у левой хотелось бы след. фич: auto hide, dockable, floating, hide, toolbar.
А>Правая на основе HTML page.

А>В общем внешний вид левой панели один в один похож на Server explorer из 7 студии.

А>Или что-то вроде Панели навигации в RSDN@Home + toolbar желательно.
А>На С# я подозреваю это можно сделать, но ведь без .Net Framework работать не будет ?

А>Можно ли такое сделать на WTL ? Какие классы нужно использовать ?


Как раз такое реализовал на WTL.

Нужно:
1). DockingWindows (описание есть на CodeProject и в статьях по WTL на этом сайте
Там же есть ссылки на закладки в стиле Dveloper Studio 7.0
2). IE вставляется очень легко с помощью CWTLAxControl, который находиться на CodeProject
3). Левую часть можно оформить так же как и в Outlook. Элемент для этого есть на сайте viksoe. Плюс там еще много чего вкусного (например меню в стиле Office XP с поддержкой тем Windows XP).

Вроде все...
... << RSDN@Home 1.1.3 stable >>
Re[2]: Интерфейс типа RSDN@Home
От: Аноним  
Дата: 06.05.04 12:22
Оценка:
Здравствуйте, avbochagov, Вы писали:

A>2). IE вставляется очень легко с помощью CWTLAxControl, который находиться на CodeProject


А что с http://www.codeproject.com/ случилось, ни одна ссылка не работает.
Re[3]: Интерфейс типа RSDN@Home
От: avbochagov Россия  
Дата: 06.05.04 17:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, avbochagov, Вы писали:


A>>2). IE вставляется очень легко с помощью CWTLAxControl, который находиться на CodeProject


А>А что с http://www.codeproject.com/ случилось, ни одна ссылка не работает.


У меня все фурычит как надо
... << RSDN@Home 1.1.3 stable >>
Re[2]: Интерфейс типа RSDN@Home
От: abacus  
Дата: 08.05.04 16:21
Оценка:
Здравствуйте, avbochagov, Вы писали:

A>Как раз такое реализовал на WTL.


A>Нужно:

A>1). DockingWindows (описание есть на CodeProject и в статьях по WTL на этом сайте

Класс, то что нужно. Единственная ложка дегтя — это мерцание TreeViewCtrl при resize.
Даже в примере SDISample мерцает. Что-то у меня не получилось избавиться от него. Как с этим бороться ?
Вот кусок кода из примера:

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{ m_images.Create(16, 16, TRUE, 3, 0);
  assert(m_images.m_hImageList);
  CBitmap bmp;
  bmp.LoadBitmap(IDB_DUMMYBMP);

  m_images.Add( bmp, RGB(255,255,255));
    
  m_tree.Create(m_hWnd,NULL,NULL, TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_EDITLABELS|                          TVS_DISABLEDRAGDROP| WS_CHILD | WS_VISIBLE);
  m_iTree.SetImageList(m_images, TVSIL_NORMAL);
  FillTree(m_tree); 
  return 0;
}

LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{ if(wParam != SIZE_MINIMIZED )
  { RECT rc;
    GetClientRect(&rc);
    ::SetWindowPos(m_tree.m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top ,SWP_NOZORDER | SWP_NOACTIVATE);
  }
  return 0;
}
Re[3]: Интерфейс типа RSDN@Home
От: Gosha Украина  
Дата: 10.05.04 21:27
Оценка:
Здравствуйте, abacus, Вы писали:

A>Класс, то что нужно. Единственная ложка дегтя — это мерцание TreeViewCtrl при resize.

A>Даже в примере SDISample мерцает. Что-то у меня не получилось избавиться от него. Как с этим бороться ?

29/04 автор проапдейтил и сорцы и демки. Проверил — теперь не мерцает (ХР).
Re[4]: Интерфейс типа RSDN@Home
От: abacus  
Дата: 11.05.04 05:44
Оценка:
Здравствуйте, Gosha, Вы писали:

A>>Класс, то что нужно. Единственная ложка дегтя — это мерцание TreeViewCtrl при resize.

A>>Даже в примере SDISample мерцает. Что-то у меня не получилось избавиться от него. Как с этим бороться ?

G>29/04 автор проапдейтил и сорцы и демки. Проверил — теперь не мерцает (ХР).


Я скачивал не ранее 5 мая, так что причина не в этом. (Win2000 sp4).
Мерцает и когда за сплиттер тянешь и при floating размеры изменяешь.
как временную меру сделал:
InitializeDockingFrame(CStyle::sIgnoreSysSettings | CStyle::sGhostDrag | CStyle::sNoAnimation);


На РСДН можно как-нибудь скриншоты постить ? А то еще один глюк обнаружился, чтобы долго не описывать
проще показать скриншот.
Re[5]: Интерфейс типа RSDN@Home
От: Gosha Украина  
Дата: 11.05.04 06:21
Оценка:
Здравствуйте, abacus, Вы писали:

A>>>Класс, то что нужно. Единственная ложка дегтя — это мерцание TreeViewCtrl при resize.

A>>>Даже в примере SDISample мерцает. Что-то у меня не получилось избавиться от него. Как с этим бороться ?

G>>29/04 автор проапдейтил и сорцы и демки. Проверил — теперь не мерцает (ХР).


A>Я скачивал не ранее 5 мая, так что причина не в этом. (Win2000 sp4).

A>Мерцает и когда за сплиттер тянешь и при floating размеры изменяешь.
странно, у меня все ОК.

A>На РСДН можно как-нибудь скриншоты постить ? А то еще один глюк обнаружился, чтобы долго не описывать

A>проще показать скриншот.
Заходишь в свой профайл и жмешь там ссылку "Файлы". Закачиваешь файл, а потом ссылаешь ся на него с помощью набора тэгов [іmg][/іmg] (в редакторе сообщений внизу, рядом со смайлами).
Re[6]: Интерфейс типа RSDN@Home
От: abacus  
Дата: 11.05.04 09:57
Оценка:
Здравствуйте, Gosha

Глюк значит такой.

Добавил экземпляр
class CMainView : public CDialogImpl<CMainView>
{
public:
  enum { IDD = IDD_MAIN_FORM };
  ...
};

таким образом

class CMainFrame: public dockwins::CDockingFrameImpl<CMainFrame>,
public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler
{
typedef dockwins::CDockingFrameImpl<CMainFrame> baseClass;

public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
CMainView m_iMainView;
...
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
m_hWndClient = m_iMainView.Create(m_hWnd);
InitializeDockingFrame(CStyle::sIgnoreSysSettings | CStyle::sGhostDrag | CStyle::sNoAnimation);
DWORD dwStyle=WS_OVERLAPPEDWINDOW | WS_POPUP| WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
CRect rcDef(0,0,100,100);
m_iServDockWnd.Create(m_hWnd,rcDef,_T("Toolbox"),dwStyle);
DockWindow(m_iServDockWnd,dockwins::CDockingSide(dockwins::CDockingSide::sLeft), 50/*nBar*/,float(0.0)/*fPctPos*/,200/*nWidth*/,100/* nHeight*/);

PostMessage(CWM_INITIALIZE);
return 0;
}
};

При манипуляциях с кнопкой auto_hide, которая возле крестика, получаем следущее:


Re[7]: Интерфейс типа RSDN@Home
От: Юнусов Булат Россия  
Дата: 11.05.04 10:10
Оценка:
Здравствуйте, abacus, Вы писали:

A> LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

A> {
A> m_hWndClient = m_iMainView.Create(m_hWnd);
A> InitializeDockingFrame(CStyle::sIgnoreSysSettings | CStyle::sGhostDrag | CStyle::sNoAnimation);
A> DWORD dwStyle=WS_OVERLAPPEDWINDOW | WS_POPUP| WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
A> CRect rcDef(0,0,100,100);
A> m_iServDockWnd.Create(m_hWnd,rcDef,_T("Toolbox"),dwStyle);
A> DockWindow(m_iServDockWnd,dockwins::CDockingSide(dockwins::CDockingSide::sLeft), 50/*nBar*/,float(0.0)/*fPctPos*/,200/*nWidth*/,100/* nHeight*/);



UpdateLayout();
может в этом дело

A> PostMessage(CWM_INITIALIZE);

а может в этом, в обработчике что делается? если восстанавливается положение окошек то прошлогодняя версия библиотеки что то глючила на этом со страшной силой, как текущяя себя ведет не пробовал.

A> return 0;

A> }
A>};
Re[3]: Интерфейс типа RSDN@Home
От: avbochagov Россия  
Дата: 11.05.04 13:01
Оценка: 1 (1)
Здравствуйте, abacus, Вы писали:

A>Здравствуйте, avbochagov, Вы писали:


A>>Как раз такое реализовал на WTL.


A>>Нужно:

A>>1). DockingWindows (описание есть на CodeProject и в статьях по WTL на этом сайте

A>Класс, то что нужно. Единственная ложка дегтя — это мерцание TreeViewCtrl при resize.

A>Даже в примере SDISample мерцает. Что-то у меня не получилось избавиться от него. Как с этим бороться ?

Да есть такое... и не только
Я общался с автором насчет исправлений — он сказал, что сейчас занят, а ближе к лету вроде у него будет время на библиотеку.
Я спросил у него разрешения (все таки проект бесплатный) можно ли слать ему багрепорты — он сказал что можно.

ТО с чем я столкнулся: в SDI приложениях на WTL используют технику подмены клиентского окна (m_hWndClient) — при этом надо вызвать UpdateLayout, но с использоваием DockWins не происходит обновления окон (надо мышью тянуть за рамку).
Времени на длительное изучения не было, поставил такую заплатку (ох нехорошо, надо бы найти правильное решение и отослать автору):

Файл WndFrmPkg.h, строка 970, функция bool UpdateLayout(const CRect& rc)
было
    bool UpdateLayout(const CRect& rc)
    {
         bool bRes=EqualRect(&rc)!=FALSE;
        if(!bRes)


стало

    bool UpdateLayout(const CRect& rc)
    {
        //[22.04.2004] AVB отключение оптимизации для корректной работы
        // при смене клиента в SDI приложении
         //bool bRes=EqualRect(&rc)!=FALSE;
         bool bRes = false; //теперь всегда будет производиться перерисовка окон
        if(!bRes)
... << RSDN@Home 1.1.3 stable >>
Re[8]: Интерфейс типа RSDN@Home
От: abacus  
Дата: 11.05.04 14:58
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ> UpdateLayout();

ЮБ>может в этом дело
Да, скорее всего. Может не учитывается ширина бордюра (или как он там называется) при перерисовке и имеем такой глюк.
Сейчас пока некогда этим заниматься, думал мож кто с этим столкнулся и может точно ткнуть носом, как это поправить.
Если найду решение раньше, чем кно-нибудь другой — запостю. Правда только недели через 2 наверное время появиться.

A>> PostMessage(CWM_INITIALIZE);

ЮБ>а может в этом, в обработчике что делается? если восстанавливается положение окошек то прошлогодняя версия библиотеки что то глючила на этом со страшной силой, как текущяя себя ведет не пробовал.
Он у меня пока пустой, так что проблема не в этом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.