Re[15]: Проблемы с перерисовкой, хотя OnPaint() есть
От: DimpLe Беларусь  
Дата: 05.05.05 14:38
Оценка:
Здравствуйте, Darked, Вы писали:

на счет того что у тебя закрываются вкладки
когда ты получаешь GetClientRect то левый верхний угол будет (0,0) (ЭТО ОТНОСИТЕЛЬНО КЛИЕНТСКОЙ ЧАСТИ ОКНА)
а в Create нужно вставить координаты относительно реального 0,0 положения окна
суть следующая

CRect rect;
CRect rect2;
GetWindowRect( &rect );
ScreenToClient( &rect );
GetClientRect( &rect2 );
rect2.DeflateRect( - rect.left, -rect.top, rect.left, rect.top );


после этого пульни это Create
(не уверен за минусы и плюсы в параметрах DeflateRect поиграйся посмотри что там получается. они нужна потому как к этому времени в rect верхний левый угол будет отрицательный и мы сдвигаем координаты для диалога на разницу между верхним углом клиентской области и верхним углом таба )
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[16]: Проблемы с перерисовкой, хотя OnPaint() есть
От: BuHHunyx Беларусь  
Дата: 06.05.05 07:34
Оценка:
Здравствуйте, DimpLe, Вы писали:

DL>на счет того что у тебя закрываются вкладки


По моему красивше:

RECT rc;
GetClientRect(&rc);
tab.AdjustRect(FALSE, &rc);
::SetWindowPos(m_hVisibleFrame, NULL,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
SWP_NOACTIVATE | SWP_NOZORDER);
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[17]: Проблемы с перерисовкой, хотя OnPaint() есть
От: DimpLe Беларусь  
Дата: 06.05.05 07:50
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

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


DL>>на счет того что у тебя закрываются вкладки


BHH>По моему красивше:


BHH>RECT rc;

BHH>GetClientRect(&rc);
BHH>tab.AdjustRect(FALSE, &rc);
BHH>::SetWindowPos(m_hVisibleFrame, NULL,
BHH> rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
BHH> SWP_NOACTIVATE | SWP_NOZORDER);

возможно это и "красивше" (красота понятие субъективное), но это не является более правильным.
1. Сразу создается окно, а потом передвигается, более парвильно сразу создать окно с нужными размерами. Нет лишних действий.
2. когда ты создаешь 3 закладки то и передвигать тебе нужно будет 3 диалога.
а расчитав один раз размер ты создаешь все три диалога с нужными размерами.
тобишь нет трех лишних действий .

З.Ы. не претендую на оптимальность действий, но то что размер лучше расчитать до создания закладок — это факт.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[18]: Проблемы с перерисовкой, хотя OnPaint() есть
От: BuHHunyx Беларусь  
Дата: 06.05.05 08:49
Оценка:
Здравствуйте, DimpLe, Вы писали:

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


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


DL>>>на счет того что у тебя закрываются вкладки


BHH>>По моему красивше:


BHH>>RECT rc;

BHH>>GetClientRect(&rc);
BHH>>tab.AdjustRect(FALSE, &rc);
BHH>>::SetWindowPos(m_hVisibleFrame, NULL,
BHH>> rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
BHH>> SWP_NOACTIVATE | SWP_NOZORDER);

DL>возможно это и "красивше" (красота понятие субъективное), но это не является более правильным.

DL>1. Сразу создается окно, а потом передвигается, более парвильно сразу создать окно с нужными размерами. Нет лишних действий.
DL>2. когда ты создаешь 3 закладки то и передвигать тебе нужно будет 3 диалога.
DL>а расчитав один раз размер ты создаешь все три диалога с нужными размерами.
DL>тобишь нет трех лишних действий .

DL>З.Ы. не претендую на оптимальность действий, но то что размер лучше расчитать до создания закладок — это факт.


1. если таб ресайзится то нужно видимый фрейм ресайзить по любому. На мой взгляд лучше это делать в одном месте.
2. нет, только видимый фрейм

Вот код контролки которую использую в куче проектов.
#if !defined(AFX_LICBASEVIEW_H__0E461100_6928_48FB_8459_C7294B85AB91__INCLUDED_)
#define AFX_LICBASEVIEW_H__0E461100_6928_48FB_8459_C7294B85AB91__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

typedef ATL::CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_STATICEDGE> CTabViewWinTraits;

template <class T, class TBase = CTabCtrl, class TWinTraits = CTabViewWinTraits>
class CTabViewImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>
{
public:

    // overridden to provide proper initialization
    BOOL SubclassWindow(HWND hWnd)
    {
#if (_MSC_VER >= 1300)
        BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd);
#else //!(_MSC_VER >= 1300)
        typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass;
        BOOL bRet = _baseClass::SubclassWindow(hWnd);
#endif //!(_MSC_VER >= 1300)
        if(bRet)
        {
            _Init();
        }
        return bRet;
    }

    BOOL InsertItem(int nItem, LPTCITEM pItem, HWND hWnd)
    {
        ATLASSERT(nItem==GetItemCount()); // Only append at this time!
        BOOL bRet = (TBase::InsertItem(nItem, pItem) != -1);

        SetItemData(nItem, hWnd);
        
        if(hWnd)
            ::ShowWindow(hWnd, SW_HIDE);

        return bRet;
    }

    void SetItemData(int iItem, HWND hWnd)
    {
        ATLASSERT((iItem >= 0) && (iItem < GetItemCount()));

        TCITEM TcItem;
        TcItem.mask = TCIF_PARAM;
        TcItem.lParam = (LPARAM)hWnd;
        SetItem(iItem, &TcItem);
    }

    HWND GetItemData(int iItem)
    {
        ATLASSERT((iItem >= 0) && (iItem < GetItemCount()));
        TCITEM TcItem;
        TcItem.mask = TCIF_PARAM;
        GetItem(iItem, &TcItem);
        return (HWND)TcItem.lParam;
    }

    void SetCurFocus(int nItem)
    {
        if(GetCurFocus() == nItem)
        {
            NMHDR nmh = { m_hWnd, GetDlgCtrlID(), TCN_SELCHANGE };
            ::SendMessage(GetParent(), WM_NOTIFY, nmh.idFrom, (LPARAM) &nmh);
        }
        else
        {
#if (_MSC_VER >= 1300)
        ATL::CWindowImpl< T, TBase, TWinTraits>::SetCurFocus(nItem);
#else //!(_MSC_VER >= 1300)
        typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass;
        _baseClass::SetCurFocus(nItem);
#endif //!(_MSC_VER >= 1300)
        }
    }

private:
    BEGIN_MSG_MAP(CTabViewImpl)
        MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        MESSAGE_HANDLER(WM_SIZE, OnSize)
        MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)

        REFLECTED_NOTIFY_CODE_HANDLER(TCN_SELCHANGE, tcnSelChange)
    END_MSG_MAP()

   LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
   {
      // Need to repaint only the outer regions of the tab control.
      // The tab's client area is filled by views, so there is no need
      // to paint that area. Also an embedded ListView control sometimes fail
      // to repaint properly if we don't do this...
      CDCHandle dc((HDC)wParam);
      RECT rc;
      GetClientRect(&rc);
      CRgn rgn1, rgn2, rgn;
      rgn1.CreateRectRgnIndirect(&rc);
      AdjustRect(FALSE, &rc);
      rgn2.CreateRectRgnIndirect(&rc);
      rgn.CreateRectRgnIndirect(&rc);
      rgn.CombineRgn(rgn1, rgn2, RGN_DIFF);
      dc.FillRgn(rgn, ::GetSysColorBrush(COLOR_BTNFACE));
      return TRUE;
   }

    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        DefWindowProc();

        SetFont((HFONT)GetStockObject(DEFAULT_GUI_FONT));
        _Init();
        return 0;
    }

    LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        ResizeFrame(GetCurSel());

        bHandled = FALSE;
        return 0;
    }

    LRESULT OnHScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        return DefWindowProc();
    }

    LRESULT tcnSelChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
    {
        ChangeSel(GetCurSel());
        return 0;
    }

private:
    void _Init()
    {
        m_hVisibleFrame = NULL;
        //ModifyStyle(TCS_SCROLLOPPOSITE, TCS_HOTTRACK | TCS_FOCUSNEVER /*| WS_CLIPCHILDREN | WS_CLIPSIBLINGS*/);
    }

    void ResizeFrame(int nIndex)
    {
        if(m_hVisibleFrame != NULL)
        {
            RECT rc;
            GetClientRect(&rc);
            AdjustRect(FALSE, &rc);
            ::SetWindowPos(m_hVisibleFrame, NULL, 
                rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 
                SWP_NOACTIVATE | SWP_NOZORDER);
        }
    }

    void ChangeSel(int nIndex)
    {
        HWND hPrevVisibleFrame = m_hVisibleFrame;
        m_hVisibleFrame = GetItemData(nIndex);

        if(m_hVisibleFrame)
        {
            ResizeFrame(nIndex);
            ::ShowWindow(m_hVisibleFrame, SW_SHOW);
        }

        if(hPrevVisibleFrame)
            ::ShowWindow(hPrevVisibleFrame, SW_HIDE);
    }

private:
    HWND m_hVisibleFrame;
};


class CTabView : public CTabViewImpl<CTabView>
{
public:
    DECLARE_WND_SUPERCLASS(_T("WTL_TabView"), GetWndClassName())
};

#endif // !defined(AFX_LICBASEVIEW_H__0E461100_6928_48FB_8459_C7294B85AB91__INCLUDED_)
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[19]: Проблемы с перерисовкой, хотя OnPaint() есть
От: DimpLe Беларусь  
Дата: 06.05.05 09:09
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

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


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


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


DL>>>>на счет того что у тебя закрываются вкладки


BHH>>>По моему красивше:


BHH>>>RECT rc;

BHH>>>GetClientRect(&rc);
BHH>>>tab.AdjustRect(FALSE, &rc);
BHH>>>::SetWindowPos(m_hVisibleFrame, NULL,
BHH>>> rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
BHH>>> SWP_NOACTIVATE | SWP_NOZORDER);

BHH>1. если таб ресайзится то нужно видимый фрейм ресайзить по любому. На мой взгляд лучше это делать в одном месте.

BHH>2. нет, только видимый фрейм

1. без спорно. Но делать это лучше в On_Size а не как он делает в
bool Cw32View::createTabs(void)
2. твоя мысль мне недоступна расшарь. почему при Create не нужно изменять размеры остальных диалогов?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[20]: Проблемы с перерисовкой, хотя OnPaint() есть
От: BuHHunyx Беларусь  
Дата: 06.05.05 09:25
Оценка:
Здравствуйте, DimpLe, Вы писали:

DL>1. без спорно. Но делать это лучше в On_Size а не как он делает в

DL>bool Cw32View::createTabs(void)

в моем примере так и делается

DL>2. твоя мысль мне недоступна расшарь. почему при Create не нужно изменять размеры остальных диалогов?


тк. размер будет менятся в ОнСайз, размер при добавлении указывать не надо. Еще необходимо менять размер при переключении таба.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[21]: Проблемы с перерисовкой, хотя OnPaint() есть
От: DimpLe Беларусь  
Дата: 06.05.05 09:52
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

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


DL>>1. без спорно. Но делать это лучше в On_Size а не как он делает в

DL>>bool Cw32View::createTabs(void)

BHH>в моем примере так и делается


Пример не смотрел.
я лично совет давал на реализацию конкретного метода
из сообщения
Re[14]: Проблемы с перерисовкой, хотя OnPaint() есть
Автор: Darked
Дата: 28.04.05


Я лично предпочитаю менять размеры всех окон при WM_WINDOWPOSCHANGED
и не менять при переключении таба. Дело вкуса.

DL>>2. твоя мысль мне недоступна расшарь. почему при Create не нужно изменять размеры остальных диалогов?


BHH>тк. размер будет менятся в ОнСайз, размер при добавлении указывать не надо. Еще необходимо менять размер при переключении таба.


Это ты исходишь из того что после WM_CREATE ОБЯЗАТЕЛЬНО вызывается WM_SIZE (дабы изменить начальный размер окна) и вот тут вот начинаются нюансы. Нужна ссылочка на MSDN где об этом сказано, иначе это остается догадкой.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[22]: Проблемы с перерисовкой, хотя OnPaint() есть
От: BuHHunyx Беларусь  
Дата: 06.05.05 10:11
Оценка:
Здравствуйте, DimpLe, Вы писали:

DL>>>2. твоя мысль мне недоступна расшарь. почему при Create не нужно изменять размеры остальных диалогов?


BHH>>тк. размер будет менятся в ОнСайз, размер при добавлении указывать не надо. Еще необходимо менять размер при переключении таба.


DL>Это ты исходишь из того что после WM_CREATE ОБЯЗАТЕЛЬНО вызывается WM_SIZE (дабы изменить начальный размер окна) и вот тут вот начинаются нюансы. Нужна ссылочка на MSDN где об этом сказано, иначе это остается догадкой.


табы добавляются гдето так
TCITEM tci = { 0 };
tci.mask = TCIF_TEXT;
tci.pszText = _T("четотам1");
m_WorkTab1Dlg1.Create(*this);
tab.InsertItem(0, &tci, m_WorkTab1Dlg1);
//...
tab.SetCurFocus(0); // здесь собственно и происходит ресайз

проблема в том что после создания таба сфокусирован таб с индексом 0, поэтому контрол не шлет нотификацию. в моей реализации я делаю это сам
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[13]: Проблемы с перерисовкой, хотя OnPaint() есть
От: Аноним  
Дата: 07.01.07 23:33
Оценка:
Здравствуйте, Darked, Вы писали:

D> //создаем объект диалога маски пальцев

D> m_Mashtab = new CMashtab(pParent);
D> m_Mashtab->Create(m_hWnd);
D> m_Mashtab->MoveWindow(&rc);
D> m_Mashtab->ShowWindow(SW_HIDE);

Возможно привести код класса CMashtab (например)?
Или любого таба.
Re[15]: Проблемы с перерисовкой, хотя OnPaint() есть
От: RoloTomasi Смерть хохлопидарам.
Дата: 08.01.07 01:43
Оценка:
Здравствуйте, Darked, Вы писали:


D> //создаем объект диалога настройки цветов фильтра

D> m_ColorSet = new CColourSet(pParent);
D> m_ColorSet->Create(m_TabType.m_hWnd);
D> m_ColorSet->MoveWindow(&rc);
D> m_ColorSet->ShowWindow(SW_HIDE);

У меня отрисовывается нормально только так

    m_TabEnv = new CEnvTab();
    m_TabEnv->Create(m_wndTabCtrMain.m_hWnd);//, rc, NULL);
    m_TabEnv->SetParent(m_wndTabCtrMain.m_hWnd);
    m_TabEnv->MoveWindow(&rc);
    m_TabEnv->ShowWindow(SW_SHOWNORMAL);


Почему светофор зеленый пока не пойму...
Смерть хохлопидарам!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.