Image smoothing rolling effect VC implementation Zheng Liqun
Preface:
In the programming of the image, this is often encountered, and a large picture is displayed in a limited area.
At this time, you want to browse the various parts of the image, which requires the scrolling of the image. Regarding its implementation, many books have
It is mentioned, but the key points and difficulties, that is, the refresh and flicker problems in the drag, but there is not much, this is also
I am in writing this article, and I will analyze the implementation method in detail.
Implementation and implementation methods:
Press the left mouse button in the image area to drag the image arbitrarily rolled in a limited area.
The method is: Calculate the offset of the last time, then change the starting point of the image display and brush
New image area.
Implementation part:
The first step: respond to the WM_LBUTTONDOWN message, the record is pressed to start dragging the starting position.
Void cwingimgdlg :: ONLBUTTONDOWN (uint nflags, cpoint point)
{
// Todo: add your message handler code here and / or call default
M_LPicoldLeft = Point.x;
m_lpicoldtop = point.y;
CDIALOG :: ONLBUTTONDOWN (NFLAGS, POINT);
}
Step 2: Respond to the WM_MOUSEMOVE message to implement scrolling.
Void CwingImgdlg :: OnMousemove (uint nflags, cpoint point)
{
// Todo: add your message handler code here and / or call default
If the mouse is pressed
IF ((NFLAGS & MK_LBUTTON) == mk_lbutton)
{
M_LPICNEWLEFT = POINT.X;
M_LPICNEWTOP = POINT.Y;
DWORD DWLRSHIFT = M_LPICNEWLEFT - M_LPICOLDLEFT;
DWORD DWTBSHIFT = M_LPICNEWTOP - M_LPICOLDTOP;
Change the starting point of the image display
M_LPicleft = m_lpicleft - dwlrshift;
M_LPictop = M_LPictop - DWTBSHIFT;
Judgment the statement of the boundary, save.
M_LPicoldLeft = M_LPICNEWLEFT;
M_LPicoldTop = M_LPICNEWTOP;
See the fourth step.
}
CDIALOG :: OnMousemove (NFLAGS, POINT);
}
Step 3: Displayed in onpain, other parts of the display, such as the image of the image, etc., save.
Void cwingimgdlg :: onpaint ()
{
CPAINTDC DC (this); // Device Context for Painting
Other display content, province.
IF (M_Pimginfo! = NULL)
DC.Bitblt (m_wshowadjleft, m_wshowadjtop, m_lwidth, m_lheight, & m_adjdc,
M_LPicleFT, M_LPictop, Srccopy;
CDIALOG :: onpaint ();
}
Step 4: Refresh the process.
The most often thought of, of course, INVALIDATE (TRUE); // Refresh the entire invalid area
UpdateWindow ();
At this time, the invalid zone of the entire program area will be refreshed, the flashes are very serious, and the following: InvalIdateRect (& M_RTPIC, TRUE); only refreshed image display area
UpdateWindow ();
At this time, only the area where the image is refreshed, the flash is alleviated, and then further, can be used
INVALIDATERECT (& M_RTPIC, TRUE); use fast redraw
RedrawWindow (& M_RTPIC, NULL, RDW_INTERNALPAINT |
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
Performance, the flashing is further reduced, taken into account, other parts may affect the refresh area, simply
Onpaint () directly here, that is, to:
OnPaint ();
But if there is a lot of drawing statement in OnPaint (), this method is still not feasible, considering can't stimulate
ONPAINT () This factor and control refresh range, I use the following non-standard method to solve, the code is as follows:
CDC * PDC;
PDC = GetDC ();
IF (M_Pimginfo! = NULL)
PDC-> Bitblt (m_wshowleft, m_wshowtop, m_lwidth, m_lheight, & m_adjdc, m_lpicleft, m_
LPictop, Srccopy;
ReleaseDC (PDC);
This approach solves the problem of refreshing and flicker, and the image is very smooth and no flashes.
This is a question I have encountered in practice, written, and share it with you. If there is a problem, or there is more
Good suggestions and practices, welcome to contact me, if you need the source file of the entire program, please contact Mail (
Davidzheng@acercm.com.cn).