Getting the start for the Flames, Jacob Markstrom made 22 stops to improve to 12-9-4.
At the other end, Spencer Martin had 27 saves. His record slipped to 11-6-1.
After a scoreless first period, Calgary surged in front 1:21 into the second when Lindholm kept the puck on a 2-on-1 rush and fired a shot past Martin.
The Flames made it 2-0 on a short-handed goal at 9:32 of the second on a sequence that was set up on a superb outlet pass by Weegar.
Weegar scored the eventual game-winner making it 3-0 at 14:17 when his point shot eluded Martin.
Dries got one back for Vancouver at 15:28 on a strange one, knocking a puck in from waist-level after it had fluttered into the air on one side of the net and came down on the other side where Dries was the first to spot it.
The resilient Canucks climbed within one at 4:06 of the third when Pettersson buried a rebound, but Vancouver could not find the tying goal although they pushed hard.
Vancouver: Host the New York Islanders on Tuesday.
Calgary: At Winnipeg Jets on Tuesday.
AP NHL: https://apnews.com/hub/nhl and https://twitter.com/AP_Sports
The Associated Press