Shots on goal were 7-7 in the opening frame.
Markstrom put his stamp on the game at the start of the second period, with Vancouver on a 61-second 5-on-3.
The Flames goaltender denied Andrei Kuzmenko from in tight at the tail end of the two-man disadvantage, then made a quick pad stop off Conor Garland shortly after the locals returned to even strength.
Finally, with Calgary short-handed late in the period, Markstrom lunged from left to right to deny Filip Hornet’s one-timer from the circle to keep the score at 2-1
The Canucks extended their lead off a broken play with 27 seconds left in the middle stanza, Ilya Mikheyev banked a puck past Markstrom after Hronek broke his stick on a low-mileage point blast.
Vancouver held a 16-15 edge in shots on goal through 40 minutes.
The Flames pushed to start the third, with Dillon Dube coming closest to halving the deficit after dancing his way from the right wing to the low slot. His wrist shot was parried away, however, by Demko.
At the other end, Markstrom continued to stand tall, thwarting Mikheyev on a clear-cut breakaway just shy of the eight-minute mark.
Two minutes later, the Calgary netminder stuck his right pad out to prevent Nils Hoglander from jamming home a rebound.
Lindholm brought the hosts back to within a goal with 4:21 remaining in the third, accepting a slap-pass from Sharangovich at the bottom of the left circle.
He froze Demko, then slid a puck past the Canucks goaltender’s left leg for his sixth goal of the season.