[MFC] 리본 메뉴 UI Getpos 함수 버그
리본 메뉴에 슬라이드 값을 이용하여 어떤 설정 값을 바꾸는 함수를 구현하였는데
이놈의 리본 메뉴가 고정되지 않고 숨김으로 되있는 경우
슬라이드나 값을 입력을 해도 아무런 변화가 없는 버그가 있었다 ㅠㅠ
같은 상황의 어느 개발자가 올린 질문
https://social.msdn.microsoft.com/Forums/en-US/9fdee956-56a5-4ae5-8081-4e6962a2a961/cmfcribbonslider-bug?forum=vcmfcatl
이 곳에 달린 코드를 이용하여 일단 값은 바뀌긴 하는데
문제는 리본 메뉴가 숨김 되었다가 다시 나타나야 값이 적용된다는 점이 아직 남아있다.
일단 이 곳에 나타난 해결책은 CMFCRibbonSlider 를 상속한 클래스를 생성하여
아래와 같은 함수를 추가하여 마우스가 눌렸다가 떼어졌을 때 마우스 위치를 이용하여
값을 셋 해주는 방식이다.
코드는 아래와 같다. (출처 : msdn)
void CMFCRibbonSliderUG::OnLButtonUp(CPoint point)
{
ASSERT_VALID(this);
CMFCRibbonBaseElement::OnLButtonUp(point);
if (m_nPressed == m_nHighlighted && !IsDisabled())
{
switch(m_nPressed)
{
case nZoomInIndex:
SetPos(m_nPos + m_nZoomIncrement);
break;
case nZoomOutIndex:
SetPos(m_nPos - m_nZoomIncrement);
break;
default:
SetPos(GetPosFromPoint(point.x));
break;
}
//Sunyear: Find out all buttons has same ID in the top level ribbon bar
CMFCRibbonBar* pRibbonBar = GetTopLevelRibbonBar();
if (pRibbonBar != NULL)
{
ASSERT_VALID(pRibbonBar);
CArray<CMFCRibbonBaseElement*, CMFCRibbonBaseElement*> arButtons;
pRibbonBar->GetElementsByID(m_nID, arButtons);
for (int i = 0; i < arButtons.GetSize(); i++)
{
CMFCRibbonSliderUG* pOther = DYNAMIC_DOWNCAST(CMFCRibbonSliderUG, arButtons [i]);
if (pOther != NULL && pOther != this)
{
ASSERT_VALID(pOther);
pOther->SetPos(GetPos());
}
}
}
NotifyCommand();
}
}
점 더 찾아봐서 값의 변경이 바로 반영되도록 수정을 했으면...ㅠ.ㅠ
이놈의 리본 메뉴가 고정되지 않고 숨김으로 되있는 경우
슬라이드나 값을 입력을 해도 아무런 변화가 없는 버그가 있었다 ㅠㅠ
[ 슬라이더 값에 따라 아래 숫자가 바뀌어야하는데..] |
같은 상황의 어느 개발자가 올린 질문
https://social.msdn.microsoft.com/Forums/en-US/9fdee956-56a5-4ae5-8081-4e6962a2a961/cmfcribbonslider-bug?forum=vcmfcatl
이 곳에 달린 코드를 이용하여 일단 값은 바뀌긴 하는데
문제는 리본 메뉴가 숨김 되었다가 다시 나타나야 값이 적용된다는 점이 아직 남아있다.
일단 이 곳에 나타난 해결책은 CMFCRibbonSlider 를 상속한 클래스를 생성하여
아래와 같은 함수를 추가하여 마우스가 눌렸다가 떼어졌을 때 마우스 위치를 이용하여
값을 셋 해주는 방식이다.
코드는 아래와 같다. (출처 : msdn)
void CMFCRibbonSliderUG::OnLButtonUp(CPoint point)
{
ASSERT_VALID(this);
CMFCRibbonBaseElement::OnLButtonUp(point);
if (m_nPressed == m_nHighlighted && !IsDisabled())
{
switch(m_nPressed)
{
case nZoomInIndex:
SetPos(m_nPos + m_nZoomIncrement);
break;
case nZoomOutIndex:
SetPos(m_nPos - m_nZoomIncrement);
break;
default:
SetPos(GetPosFromPoint(point.x));
break;
}
//Sunyear: Find out all buttons has same ID in the top level ribbon bar
CMFCRibbonBar* pRibbonBar = GetTopLevelRibbonBar();
if (pRibbonBar != NULL)
{
ASSERT_VALID(pRibbonBar);
CArray<CMFCRibbonBaseElement*, CMFCRibbonBaseElement*> arButtons;
pRibbonBar->GetElementsByID(m_nID, arButtons);
for (int i = 0; i < arButtons.GetSize(); i++)
{
CMFCRibbonSliderUG* pOther = DYNAMIC_DOWNCAST(CMFCRibbonSliderUG, arButtons [i]);
if (pOther != NULL && pOther != this)
{
ASSERT_VALID(pOther);
pOther->SetPos(GetPos());
}
}
}
NotifyCommand();
}
}
점 더 찾아봐서 값의 변경이 바로 반영되도록 수정을 했으면...ㅠ.ㅠ
댓글
댓글 쓰기