Win API 基础绘图程序

3

我想学习一些Win API知识,试图制作一个基本的绘画应用程序,类似于MS Paint。

目前我正在尝试让一个功能起作用,即当你左键单击并拖动鼠标时,在鼠标后面画出一条直线。这是我目前的进展,但出现了以下问题:

1)直线立即开始绘制而不是等待左键单击 2)线条不连续,非常稀疏。

case WM_MOUSEMOVE:
{


    if(MK_LBUTTON){
    hdc = GetDC(hwnd);
    hPen = CreatePen(PS_SOLID,5,RGB(0, 0, 255));
    SelectObject(hdc, hPen);

    int x = LOWORD(lParam);
    int y = HIWORD(lParam);

    MoveToEx(hdc,x,y,NULL);
    LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
    ReleaseDC(hwnd,hdc);
    }
    else
        break;

}

感谢您的帮助!

非常感谢您的任何帮助!

1个回答

1
WM_LBUTTONDOWN事件中,您需要在程序中设置一个变量为true(即鼠标当前按下),在WM_MOUSEMOVE事件中,检查该变量是否为true,只有当它为true时才进行绘制。在WM_LBUTTONUP事件中,将该变量设置为false。(该变量应初始化为false)。

抱歉,我没有理解你的意思,请您能否再解释一下?谢谢您的回复。 - Tom Burman
当鼠标移动时,WM_MOUSEMOVE 会触发,而不仅仅是在移动并按下按钮时才触发。因此,要仅在按下按钮时绘制,您首先必须让程序“记住”它是否已按下。 - Bernd Elkemann
所以使用 WM_LBUTTONDOWN 和一个布尔值或其他东西,当它等于 true 时触发 WM_MOUSEMOVE? - Tom Burman
不完全是这样。在函数外声明 bool isDown。然后使用:case WM_LBUTTONDOWN: isDown=true; break; case WM_LBUTTONUP: isDown=false; break; case WM_MOUSEMOVE: if(isDown) draw(); break; - Bernd Elkemann
我尝试了改变代码和实现你说的方法,但是没有成功,我只得到一个空白屏幕和加载图标。 - Tom Burman
但是之前不是已经画过了吗?试试从你上一个画了东西的版本开始,只需添加布尔值即可。 - Bernd Elkemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接