MoveToEx和LineTo不使用存储在顶点中的MAKEPOINTS绘制(push_back)Win32 C ++

除非我设置了LineTo(hdc,50,50),否则它将从point(50,50)绘制,但是无论我做什么,我都无法使用MAKEPOINTS使其工作并将其存储在Vertex类中(上课是正确的

请帮助

case WM_LBUTTONDOWN:
        {
            HDC hdc = GetDC(hWnd);
            POINTS clickPoint = MAKEPOINTS(lParam); 
            connectLines.push_back(Vertex(clickPoint.x,clickPoint.y));                 
            MoveToEx(hdc,clickPoint.x,clickPoint.y,NULL);            
            LineTo(hdc,LOWORD(lParam),HIWORD(lParam));
            ReleaseDC(hWnd,hdc);
        }
        break;

编辑:我正在添加WM_PAINT以及Vertex类和Vertex头

case WM_PAINT:
        {
            PAINTSTRUCT ps;         
            HDC hdc = BeginPaint(hWnd,&ps);
            // TODO: Add any drawing code that uses hdc here...

            for (Vertex points : connectLines) {
                HPEN pen = CreatePen(PS_SOLID,7,RGB(255,0));
                HGDIOBJ oldPen = SelectObject(hdc,pen);
                SelectObject(hdc,oldPen);
                DeleteObject(pen);
            }
            EndPaint(hWnd,&ps);
        }
        break;

顶点标题

#pragma once
class Vertex
{
public:
    Vertex();
    Vertex(int x,int y);
    Vertex(const Vertex& other);

    // accessors
    int GetX() const;
    void SetX(const int x);
    int GetY() const;
    void SetY(const int y);

    // Assigment operator
    Vertex& operator= (const Vertex& rhs);

    bool operator== (const Vertex& rhs) const;

    const Vertex operator+ (const Vertex& rhs) const;

private:
    int _x;
    int _y;
};

顶点标题

#include "Vertex.h"

Vertex::Vertex()
{
    _x = 0.0f;
    _y = 0.0f;
}

Vertex::Vertex(int x,int y)
{
    _x = x;
    _y = y;
}

Vertex::Vertex(const Vertex& other)
{
    _x = other.GetX();
    _y = other.GetY();
}

int Vertex::GetX() const
{
    return _x;
}

void Vertex::SetX(const int x)
{
    _x = x;
}

int Vertex::GetY() const
{
    return _y;
}

void Vertex::SetY(const int y)
{
    _y = y;
}

Vertex& Vertex::operator=(const Vertex& rhs)
{
    // Only do the assignment if we are not assigning
    // to ourselves
    if (this != &rhs)
    {
        _x = rhs.GetX();
        _x = rhs.GetY();
    }
    return *this;
}

// The const at the end of the declaration for '==' indicates that this operation does not change
// any of the member variables in this class

bool Vertex::operator==(const Vertex& rhs) const
{
    return (_x == rhs.GetX() && _y == rhs.GetY());
}

// You can see three different uses of 'const' here:
//
// The first const indicates that the method changes the return value,but it is not moved in memory
// The second const indicates that the parameter is passed by reference,but it is not modified
// The third const indicates that the operator does not change any of the memory variables in the class

const Vertex Vertex::operator+(const Vertex& rhs) const
{
    return Vertex(_x + rhs.GetX(),_y + rhs.GetY());
}

由于某种我不知道的原因,它不希望使用“ x”和“ y”,但是我只在使用此程序进行计算时才遇到这个问题。

谢谢您的帮助

a349158555 回答:MoveToEx和LineTo不使用存储在顶点中的MAKEPOINTS绘制(push_back)Win32 C ++

在您的代码中,该行的起点和终点均在同一点。因此您无法画线。 如果您的Vertex类函数是这样的:

void Vertex::SetX(const int x)
{
    _x = x;
}

void Vertex::SetY(const int y)
{
    _y = y;
}

基于单击鼠标绘制连续线段,您可以这样编码:

static POINT ptPrevious = { 0,0 };
static bool flag = false;
Vertex temp;
...
case WM_LBUTTONDOWN:
        HDC hdc = GetDC(hWnd);
        POINTS clickPoint = MAKEPOINTS(lParam);
        if (flag == false) {
            ptPrevious.x = clickPoint.x;
            ptPrevious.y = clickPoint.y;
            flag = true;
        }
        //store the point in connectLines
        temp.SetX(clickPoint.x);
        temp.SetY(clickPoint.y);
        connectLines.push_back(temp);

        MoveToEx(hdc,ptPrevious.x,ptPrevious.y,NULL);
        LineTo(hdc,LOWORD(lParam),HIWORD(lParam));

        //record previous point
        ptPrevious.x = clickPoint.x;
        ptPrevious.y = clickPoint.y;

        ReleaseDC(hWnd,hdc);
        break;

如果需要保存鼠标单击的位置,则需要自己添加它。 并且here提供了带有鼠标的示例绘图,但变量应为static变量。

,

请尝试以下类似操作:

http://127.0.0.1:4100
本文链接:https://www.f2er.com/3113073.html

大家都在问