Yo tampoco entiendo muy bien eso del mensaje WM_PAINT, pero bueno, te envío el codigo qeu utilizo para dibujar, con las funciones LineTo y MoveTo, la primera dibuja y la otra desplaza el cursor sin dibujar.
CRect area;
m_areaXY.GetWindowRect(&area);
m_vistaxy.HLenght = area.Width() - 2;
m_vistaxy.VLenght = area.Height() - 2;
m_vistaxy.HScale = (float)(CFGDlg.m_maxX- CFGDlg.m_minX)/m_vistaxy.HLenght;
m_vistaxy.VScale = (float)(CFGDlg.m_maxY-CFGDlg.m_minY)/m_vistaxy.VLenght;
Y luego para dibujar utilizo lo siguiente:
m_vistaxy.pDC = m_areaXY.GetDC();
m_vistaxy.pDC->MoveTo((int)((float)evt.x/m_vistaxy.HScale),(int)(m_vistaxy.VLenght-(float)evt.y/m_vistaxy.VScale));
m_vistaxy.pDC->LineTo((int)((float)evt.x/m_vistaxy.HScale),(int)(m_vistaxy.VLenght-(float)evt.y/m_vistaxy.VScale));
Espero q te sirva, los valores de CFGDlg son los pixels de la pantalla, pero no la de la aplicación (que ahí es donde esta mi problema), yo captura la CWnd* wnd= GetForegroundWindow(); y son esas dimensiones las que cojo, y claro son las de todo el escritorio y el dibujo sale la mar de enano en mi pantalla. Por cierto, q la pantalla a la q me refiero es un CEdit dentro de un DialogBox, yo lo he hecho con el ClassWizard y todo eso, m_areaxy y m_vistaxy, hacen referencia al área en la que dibujo.