小白一只,请教C++用API实现画图程序的几个问题

本人小白,刚开始学C++项目,老师让用API编一个简单的绘图程序,但是遇到了几个问题
我在WM_LBUTTONDOWN和WM_LBUTTONUP中用Getcursorpos()函数获取了两个点的坐标,然后想实现画直线的功能,但是每次画直线的时候,起点和终点都会有偏差,而且画出的直线就会被下一次的直线覆盖,这是一个问题
同样我想画点,在WM_LBUTTONUP时同样用那个函数获取了一个点的坐标,然后用SetPixelV()函数画点,出现我点的位置和点出现的位置不在一起,总是有偏差。
请教大神们帮帮小白吧,以前从没用过WINMAIN函数和proc函数编过程序,查了好久也不会怎么用,所以求教大神们。主要代码如下:
//鼠标落下
case WM_LBUTTONDOWN:
{
GetCursorPos(&p1);
break;
}
//鼠标抬起
case WM_LBUTTONUP:
{
GetCursorPos(&p2);
break;
}
//画点
void Draw_Some_Point(HWND hwnd,HDC hdc,POINT p)
{
// 获得客户区域
RECT r;
GetClientRect(hwnd, &r);

// 设置映像模式
SetMapMode (hdc, MM_ISOTROPIC);

// 设置窗口坐标范围
SetWindowExtEx(hdc, 1000, 1000, NULL);

// 设置视口坐标范围
SetViewportExtEx(hdc, r.right, r.bottom, NULL);

FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

SetPixelV( hdc,p.x,p.y, RGB(255,255,255));
}
//画直线
void Draw_A_Line(HWND hwnd,HDC hdc,POINT p1,POINT p2)
{
// 获得客户区域
RECT r;
GetClientRect(hwnd, &r);

// 设置映像模式
SetMapMode(hdc, MM_ISOTROPIC);

// 设置窗口坐标范围
SetWindowExtEx(hdc, 1000, 1000, NULL);

// 设置视口坐标范围
SetViewportExtEx(hdc, r.right, r.bottom, NULL);

// 绘制直线
Point p[5000]={};
for(int j=0; j<5000; j+=2)
{
int k = j+1;
p[j]=Point(p1.x,p1.y);
p[k]=Point(p2.x,p2.y);
MoveToEx( hdc, p[j].get_x(), p[j].get_y(), NULL);
for(int i=0; i<2; i++)
{
if(i==1)
{
LineTo( hdc, p[j].get_x(), p[j].get_y() );
continue;
}
LineTo( hdc, p[i+1].get_x(), p[i+1].get_y());
}
}

}
说明一下,Point是我自己定义的一个点类,有横纵坐标

你使用函数错误了。你在响应鼠标的DOWN和UP以及MOVE事件时,请使用LPARAM参数取得XY值。具体请参考MSDN。
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);

而函数GetCursorPos取得的坐标是相对屏幕来说的,如果使用请将其转换到窗口的相对坐标。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答