decornez
asked on
Dialog Box: Faster scrolling
Hi,
I have written some code to implement scrolling within my dialog box, but is is very slow because I have over 100 controls in there. My code is below. What I am looking for is for a much faster and more robust piece of code to implement scrolling.
########################## ########## ########## ########## #
void DPRMYLDHKDdlg::OnVScroll(U INT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
//##S
int mdown = -450;
int mup = 450;
#define NUM_CTRL 109
static hkdidc[NUM_CTRL]={IDC_HkdF xRateSTATI C1,
IDC_HkdCcySTATIC1,IDC_HkdV alDateSTAT IC1,IDC_Hk dFxRateEDI T1,
IDC_HkdCcyEDIT1,IDC_HkdVal DateEDIT1, IDC_HkdStD cSTATIC1,
IDC_HkdFutDcSTATIC1,IDC_Hk dLtDcSTATI C1,IDC_Hkd StDcEDIT1,
IDC_HkdFutDcEDIT1,IDC_HkdL tDcEDIT1,I DC_HkdStBa seSTATIC1,
IDC_HkdFutBaseSTATIC1,IDC_ HkdLtBaseS TATIC1,IDC _HkdStBase EDIT1,
IDC_HkdFutBaseEDIT1,IDC_Hk dLtBaseEDI T1,IDOK,
IDC_HkdNumSTATIC1,IDC_HkdT enorSTATIC 1,IDC_HkdI nstruSTATI C1,
IDC_HkdBidSTATIC1,IDC_HkdA skSTATIC1, IDC_HkdMid STATIC1,
IDC_HkdNum1STATIC1,IDC_Hkd TenorEDIT1 ,IDC_HkdIn struEDIT1,
IDC_HkdBidEDIT1,IDC_HkdAsk EDIT1,IDC_ HkdMidEDIT 1,
IDC_HkdNum2STATIC1,IDC_Hkd TenorEDIT2 ,IDC_HkdIn struEDIT2,
IDC_HkdBidEDIT2,IDC_HkdAsk EDIT2,IDC_ HkdMidEDIT 2,
IDC_HkdNum3STATIC1,IDC_Hkd TenorEDIT3 ,IDC_HkdIn struEDIT3,
IDC_HkdBidEDIT3,IDC_HkdAsk EDIT3,IDC_ HkdMidEDIT 3,
IDC_HkdNum4STATIC1,IDC_Hkd TenorEDIT4 ,IDC_HkdIn struEDIT4,
IDC_HkdBidEDIT4,IDC_HkdAsk EDIT4,IDC_ HkdMidEDIT 4,
IDC_HkdNum5STATIC1,IDC_Hkd TenorEDIT5 ,IDC_HkdIn struEDIT5,
IDC_HkdBidEDIT5,IDC_HkdAsk EDIT5,IDC_ HkdMidEDIT 5,
IDC_HkdNum6STATIC1,IDC_Hkd TenorEDIT6 ,IDC_HkdIn struEDIT6,
IDC_HkdBidEDIT6,IDC_HkdAsk EDIT6,IDC_ HkdMidEDIT 6,
IDC_HkdNum7STATIC1,IDC_Hkd TenorEDIT7 ,IDC_HkdIn struEDIT7,
IDC_HkdBidEDIT7,IDC_HkdAsk EDIT7,IDC_ HkdMidEDIT 7,
IDC_HkdNum8STATIC1,IDC_Hkd TenorEDIT8 ,IDC_HkdIn struEDIT8,
IDC_HkdBidEDIT8,IDC_HkdAsk EDIT8,IDC_ HkdMidEDIT 8,
IDC_HkdNum9STATIC1,IDC_Hkd TenorEDIT9 ,IDC_HkdIn struEDIT9,
IDC_HkdBidEDIT9,IDC_HkdAsk EDIT9,IDC_ HkdMidEDIT 9,
IDC_HkdNum10STATIC1,IDC_Hk dTenorEDIT 10,IDC_Hkd InstruEDIT 10,
IDC_HkdBidEDIT10,IDC_HkdAs kEDIT10,ID C_HkdMidED IT10,
IDC_HkdNum11STATIC1,IDC_Hk dTenorEDIT 11,IDC_Hkd InstruEDIT 11,
IDC_HkdBidEDIT11,IDC_HkdAs kEDIT11,ID C_HkdMidED IT11,
IDC_HkdNum12STATIC1,IDC_Hk dTenorEDIT 12,IDC_Hkd InstruEDIT 12,
IDC_HkdBidEDIT12,IDC_HkdAs kEDIT12,ID C_HkdMidED IT12,
IDC_HkdNum13STATIC1,IDC_Hk dTenorEDIT 13,IDC_Hkd InstruEDIT 13,
IDC_HkdBidEDIT13,IDC_HkdAs kEDIT13,ID C_HkdMidED IT13,
IDC_HkdNum14STATIC1,IDC_Hk dTenorEDIT 14,IDC_Hkd InstruEDIT 14,
IDC_HkdBidEDIT14,IDC_HkdAs kEDIT14,ID C_HkdMidED IT14};
CRect hkdrect[NUM_CTRL];
CWnd *hkdpCtrl[NUM_CTRL];
int i;
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]=GetDlgItem(hkd idc[i]);
}
switch (nSBCode)
{
case SB_BOTTOM:
break;
case SB_TOP:
break;
case SB_PAGEDOWN:
break;
case SB_PAGEUP:
break;
case SB_LINEDOWN:
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]->GetWindowRect (&hkdrect[ i]);
ScreenToClient(&hkdrect[i] );
hkdrect[i] += CPoint (0,mdown);
hkdpCtrl[i]->MoveWindow(hk drect[i]);
}
//UpdateData(FALSE);
Invalidate();
break;
case SB_LINEUP:
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]->GetWindowRect (&hkdrect[ i]);
ScreenToClient(&hkdrect[i] );
hkdrect[i] += CPoint (0,mup);
hkdpCtrl[i]->MoveWindow(hk drect[i]);
}
//UpdateData(FALSE);
Invalidate();
break;
case SB_THUMBPOSITION:
break;
}
//##E
CDialog::OnVScroll(nSBCode , nPos, pScrollBar);
}
########################## ########## ########## ########## ##
Rgds,
A.
I have written some code to implement scrolling within my dialog box, but is is very slow because I have over 100 controls in there. My code is below. What I am looking for is for a much faster and more robust piece of code to implement scrolling.
##########################
void DPRMYLDHKDdlg::OnVScroll(U
{
// TODO: Add your message handler code here and/or call default
//##S
int mdown = -450;
int mup = 450;
#define NUM_CTRL 109
static hkdidc[NUM_CTRL]={IDC_HkdF
IDC_HkdCcySTATIC1,IDC_HkdV
IDC_HkdCcyEDIT1,IDC_HkdVal
IDC_HkdFutDcSTATIC1,IDC_Hk
IDC_HkdFutDcEDIT1,IDC_HkdL
IDC_HkdFutBaseSTATIC1,IDC_
IDC_HkdFutBaseEDIT1,IDC_Hk
IDC_HkdNumSTATIC1,IDC_HkdT
IDC_HkdBidSTATIC1,IDC_HkdA
IDC_HkdNum1STATIC1,IDC_Hkd
IDC_HkdBidEDIT1,IDC_HkdAsk
IDC_HkdNum2STATIC1,IDC_Hkd
IDC_HkdBidEDIT2,IDC_HkdAsk
IDC_HkdNum3STATIC1,IDC_Hkd
IDC_HkdBidEDIT3,IDC_HkdAsk
IDC_HkdNum4STATIC1,IDC_Hkd
IDC_HkdBidEDIT4,IDC_HkdAsk
IDC_HkdNum5STATIC1,IDC_Hkd
IDC_HkdBidEDIT5,IDC_HkdAsk
IDC_HkdNum6STATIC1,IDC_Hkd
IDC_HkdBidEDIT6,IDC_HkdAsk
IDC_HkdNum7STATIC1,IDC_Hkd
IDC_HkdBidEDIT7,IDC_HkdAsk
IDC_HkdNum8STATIC1,IDC_Hkd
IDC_HkdBidEDIT8,IDC_HkdAsk
IDC_HkdNum9STATIC1,IDC_Hkd
IDC_HkdBidEDIT9,IDC_HkdAsk
IDC_HkdNum10STATIC1,IDC_Hk
IDC_HkdBidEDIT10,IDC_HkdAs
IDC_HkdNum11STATIC1,IDC_Hk
IDC_HkdBidEDIT11,IDC_HkdAs
IDC_HkdNum12STATIC1,IDC_Hk
IDC_HkdBidEDIT12,IDC_HkdAs
IDC_HkdNum13STATIC1,IDC_Hk
IDC_HkdBidEDIT13,IDC_HkdAs
IDC_HkdNum14STATIC1,IDC_Hk
IDC_HkdBidEDIT14,IDC_HkdAs
CRect hkdrect[NUM_CTRL];
CWnd *hkdpCtrl[NUM_CTRL];
int i;
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]=GetDlgItem(hkd
}
switch (nSBCode)
{
case SB_BOTTOM:
break;
case SB_TOP:
break;
case SB_PAGEDOWN:
break;
case SB_PAGEUP:
break;
case SB_LINEDOWN:
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]->GetWindowRect
ScreenToClient(&hkdrect[i]
hkdrect[i] += CPoint (0,mdown);
hkdpCtrl[i]->MoveWindow(hk
}
//UpdateData(FALSE);
Invalidate();
break;
case SB_LINEUP:
for (i = 0; i < NUM_CTRL; i++) {
hkdpCtrl[i]->GetWindowRect
ScreenToClient(&hkdrect[i]
hkdrect[i] += CPoint (0,mup);
hkdpCtrl[i]->MoveWindow(hk
}
//UpdateData(FALSE);
Invalidate();
break;
case SB_THUMBPOSITION:
break;
}
//##E
CDialog::OnVScroll(nSBCode
}
##########################
Rgds,
A.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Also associated with that, specify the flag that prevents the moved window from redrawing (I don't remember what it is called) and then scroll the window with ScrollWindow() This will update the screen much faster.
You probably mean the WM_SETREDRAW message.
No, I meant the DWP_NOTREDRAW flag to the DeferWindowPos() procedure. It is much faster for the OS to move the windows without updating the screen and then just scroll the pixels on screen and finally just paint the small area exposed.
ASKER
Going off on holiday until the 17th of dec.
I will try your suggestions when I get back and will let you know then.
Thanks,
A.
I will try your suggestions when I get back and will let you know then.
Thanks,
A.
ASKER
Stanz,
Thanks for your help.
I actually used Nietod's suggestion. I used ScrollWindow() in conjunction with UpdateWindow(). It is extremely fast, easy to implement, and there is no flickering.
Nietod,
Thanks for your suggestion.
I'll post some points for you.
Rgds,
A.
Thanks for your help.
I actually used Nietod's suggestion. I used ScrollWindow() in conjunction with UpdateWindow(). It is extremely fast, easy to implement, and there is no flickering.
Nietod,
Thanks for your suggestion.
I'll post some points for you.
Rgds,
A.