ScreenToClient将点值设置为整个屏幕分辨率

时间:2016-06-04 03:11:22

标签: c++ winforms

我做了一些功能,这样当你点击一个窗口时它会拖动窗口(就像你在常规窗口上拖动标题栏一样)。 但是,每当我尝试拖动它时,它都会继续在我的屏幕上找到坐标0,0。 (一旦你看到代码,你就会理解标题。)我尝试了IF语句,但是当我拖动它时窗口仍然是0,0(我无法正常工作)。在我尝试从那里再次拖动它之后,它完美地工作(仅适用于那个时间)。然后它会回到屏幕上的坐标0,0如果我再次尝试拖动它并继续这样做。

标题将事件分配给函数的条形码:

this->menuStrip1->MouseMove += gcnew MouseEventHandler(this, &CPPGUIForm::MoveWindow);
this->menuStrip1->MouseDown += gcnew MouseEventHandler(this, &CPPGUIForm::titleBarOnClicked);
this->menuStrip1->MouseUp += gcnew MouseEventHandler(this, &CPPGUIForm::titleBarOnReleased);
this->menuStrip1->MouseLeave += gcnew EventHandler(this, &CPPGUIForm::titleBarMouseLeave);

MoveWindow功能:

private:
    void MoveWindow(Object^ sender, MouseEventArgs^ e){
        POINT p;
        GetCursorPos(&p);
        if (mClicked == true){
                this->Location = System::Drawing::Point(p.x - mouseXLocOnWindow, p.y - mouseYLocOnWindow);


        }

    }

标题栏点击和释放功能:

private:
    void titleBarOnClicked(Object^ sender, MouseEventArgs^ e){
        HWND hwnd;
        POINT pt;
        GetCursorPos(&pt);
        ScreenToClient(hwnd, &pt);

        mouseXLocOnWindow = pt.x;
        mouseYLocOnWindow = pt.y;
        mClicked = true;
    }
private:
    void titleBarOnReleased(Object^ sender, MouseEventArgs^ e){
        mClicked = false;
    }

标题栏鼠标离开功能(修复错误):

private:
    void titleBarMouseLeave(Object^ sender, EventArgs^ e){
        mClicked = false;
    }

如果您在这篇文章中需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

titleBarOnClicked()函数中,hwnd未初始化。

我想你想要这样的东西:

HWND hwnd = static_cast<HWND>(this->Handle.ToPointer());