Почему моя полоса прокрутки прокручивается только в одном направлении?

Я пытаюсь прокрутить дочерние окна Edit Field, которые создаются в динамическом цикле, как это:

 for(int x = 0; x<//Some Predefined Number of Windows decided by the user; x ++)
{
int m = //Some Predefined spacing determined by the Programmer
EditBoxes = CreateWindow("Edit","Witness ",
WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP ,0,
m,250,16,hwndx,NULL,GetModuleHandle(NULL),NULL);
}

Вот как я пытаюсь использовать ScrollWindowEx:

 case WM_VSCROLL:

{
xNewPos = si.nPos;
si.cbSize = sizeof(&si);
si.fMask = SIF_ALL;
GetScrollInfo(hwnd,SB_VERT,&si);
switch (LOWORD(wParam))
{
case SB_TOP:
si.nPos = si.nMin;
break;

// User clicked the END keyboard key.
case SB_BOTTOM:
si.nPos = si.nMax;
break;

// User clicked the top arrow.
case SB_LINEUP:

if(si.nPos>si.nMin)
si.nPos = si.nPos-1;
break;

// User clicked the bottom arrow.
case SB_LINEDOWN:
if(si.nPos<si.nMax)
si.nPos -= 1;
break;

// User clicked the scroll bar shaft above the scroll box.
case SB_PAGEUP:
si.nPos -= si.nPage;
break;

// User clicked the scroll bar shaft below the scroll box.
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;

// User dragged the scroll box.
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
cout << si.nTrackPos;
break;

default:

break;
}
si.fMask = SIF_POS;SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
SetScrollPos(hwnd,SB_VERT,si.nPos,TRUE);

if(si.nPos != xNewPos)
{

ScrollWindowEx(hwnd,0,si.nPos,(RECT*)NULL,NULL,NULL,NULL, SW_SCROLLCHILDREN| SW_INVALIDATE| SW_ERASE );

}

Я в состоянии заставить полосу прокрутки прокручивать вниз или вверх, в зависимости от того, делает ли Ii значение si.nPos отрицательным или положительным в функции ScrollWindowEx, но я не могу сделать прокрутку окна вверх или вниз.

-1

Решение

// User clicked the top arrow.
case SB_LINEUP:

if(si.nPos>si.nMin)
si.nPos = si.nPos-1;
break;

// User clicked the bottom arrow.
case SB_LINEDOWN:
if(si.nPos<si.nMax)
si.nPos -= 1;
break;

Обратите внимание, что вы используете одно и то же выражение для строки вверх и вниз. В обоих случаях вы уменьшаете позицию. Для линии вниз вам нужно увеличивать, а не уменьшать.

Я бы написал это так:

// User clicked the top arrow.
case SB_LINEUP:

if(si.nPos>si.nMin)
si.nPos--;
break;

// User clicked the bottom arrow.
case SB_LINEDOWN:
if(si.nPos<si.nMax)
si.nPos++;
break;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]