У меня есть класс представления для моего приложения MFC, который наследует класс CSrollView для предположительно простой поддержки полосы прокрутки. Я могу заставить полосы прокрутки появляться в определенной точке, например, когда я увеличиваю изображение, отображаемое в виде, но когда я пытаюсь прокрутить влево, ничего не происходит. Я исследовал это онлайн в течение нескольких часов, и я не могу точно определить, что я делаю неправильно. Вот мои методы OnDraw () и OnInitialUpdate () в классе представления:
void CWaveEditView::OnDraw(CDC* pDC)
{
CWaveEditDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
WaveFile * wave = &pDoc->wave;
if (wave->hdr==NULL) {
return;
}
// Get dimensions of the window.
CRect rect;
GetClientRect(rect);// Set color in pen and brush for wave
COLORREF color = RGB( 0, 255, 0 );
CPen pen2( PS_SOLID, 0, color );
pDC->SelectObject( &pen2 );
CBrush brush2(color);
pDC->SelectObject( &brush2 );
// Draw selection if any
if (selectionStart != selectionEnd) {
pDC->Rectangle(selectionStart, 0, selectionEnd, rect.Height());
}
// Draw the wave
pDC->MoveTo(0,0);
int x;
for (x=0; x < zoomAmount*wave->lastSample/scaling; x++) {
// Assuming the whole file will be fit in the window, for every x value in the window
// we need to find the equivalent sample in the wave file.
float val = wave->get_sample((int) (x*scaling/zoomAmount) );
// We need to fit the sound also in the y axis. The y axis goes from 0 in the
// top of the window to rect.Height at the bottom. The sound goes from -32768 to 32767
// we scale it in that way.
int y = (int) ((val+32768) * (rect.Height()-1) / (32767+32768));
pDC->LineTo(x,rect.Height() - y);
}
CSize totalSize;
totalSize.cx = x;
SetScrollSizes(MM_TEXT,totalSize);
}
void CWaveEditView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// Initial scroll sizes
CSize sizeTotal;
CRect rect;
CWaveEditDoc *doc = GetDocument();
WaveFile * wave = &doc->wave;
GetClientRect(rect);
scaling = wave->lastSample/rect.Width();
sizeTotal.cx = 700;
sizeTotal.cy = 700;
SetScrollSizes(MM_TEXT, sizeTotal);
}
Задача ещё не решена.
Других решений пока нет …