@rvk
Edit: O, wow, I noticed if you put components on it, it really gets slow. It works... but it crawls.
It's not so slow at my side, but things get ugly when you drop another panel to panel1. What about this(see attachment)?
I tried putting a TEdit on my panel, which really slowed it down. Just a TLabel and TButton works ok but anything more complex will slow it down a lot. (Just 1 extra TPanel on my panel wasn't actually that bad)
But your code works quite well (even with TEdits). I looked at what the difference was (because the idea is basically the same) and I noticed you called Draw (in which the panel-canvas was painted). This would essentially be the same as calling Panel.Paint (if you had the drawing in the Paint-event, which I had). But I called
Invalidate with each mouse-move. And that was a bad call. Invalidate also needs to repaint ALL sub-components. I initially thought this was necessary but it isn't. After changing my code to call Panel1.Paint instead of Panel1.Invalidate it all worked much smoother.
Your code is still a bit smoother because for me, with the canvas-drawing in the paint-event, there is a bit of an echo during dragging. Only when you slow down the dragging, the form-paint will catch up and all is well. That's probably because I draw in the Paint-event directly to the panel-canvas and you only draw to the second image on the panel when the panel is moved (which is less work). But this shows it is possible and how it looks like, so OP can mold this into a component of his/her own so the imBackGround and imParallex are not seen during design-time because they can get in the way (for example it is difficult to move your panel now).