I have a C#/GDI+ paint application (winform) in which I draw different shapes with different colors and pen sizes. Now, the shape drawing I have handled, but using a 'free pen' as you would in MS Paint, I have also had it done but it is rather ugly (see pic).
debljina = float.Parse(debljina_box.Text);
Graphics gr = Graphics.FromImage(bit);
gr.SmoothingMode = SmoothingMode.HighQuality;
olovka = new Pen(boja, debljina);
gr.DrawLine(olovka, new Point(prethodnoX ?? e.X, prethodnoY ?? e.Y), new Point(e.X, e.Y));
panel1.CreateGraphics().DrawImageUnscaled(bit, new Point(0, 0));
prethodnoX = e.X;
prethodnoY = e.Y;
(Meaning of most variables can be deduced but I can explain if necessary.)
My app works that firstly I draw images on a bitmap (called 'bit' in this case), which are then created on a panel and then the panel paint event shows what I have drawn. But in this case, the pen is quite ugly, I assume because of the procedure: create graphics-draw line-draw on panel takes some time in between steps.
It is difficult to tell from the information you provided, but it sounds like your main UI thread is too busy updating the bitmap to capture mouse movement points (it can only do one thing at a time). If the problem is as you say - that the line-draw takes time, I would create a multi-thread environment:
1) Main thread captures mouse movement, stores point values in a queue
2) off-thread watcher method checks queue every X milliseconds
3) if watcher has points to process, it does the math, creates the updated bitmap, and send it to the main thread for updating
4) Main UI thread then only has to be "paused" every X milliseconds as it is directly updating the bitmap, freeing it to capture more mouse movement points
If you want to post your project, I can help you with that.