0

我昨天问了我的问题,但没有得到正确的答案。现在我问得更清楚了。使用 win api 我创建了一个窗口和一个按钮。在按钮的前面有一个用绿色绘制的圆圈。按下按钮后,圆圈应变为红色。

(我正在使用 C++ 和 mingw 编译器。)

这是我的代码

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
 PAINTSTRUCT ps;
 HDC hDC;
 HBRUSH brusha;
 brusha=CreateSolidBrush(RGB(0,255,0));

 switch(msg)
{
    case WM_CREATE:
    {

        b=CreateWindowEx(WS_EX_CLIENTEDGE,
            "BUTTON",
            "red",
            WS_CHILD|WS_VISIBLE|
            BS_DEFPUSHBUTTON,
            350,
            100,
            100,
            40,
            hWnd,
            (HMENU)BUTTON,
            GetModuleHandle(NULL),
            NULL);
    }
    break;


    case WM_PAINT:
    {


    hDC=BeginPaint(hWnd,&ps);
    SelectObject(hDC,brusha);
    Ellipse(hDC, 20, 20, 100, 100);
    EndPaint(hWnd, &ps);

    }

    case WM_COMMAND:
      switch(LOWORD(wParam))
        {
            case BUTTON:
            {
            brusha=CreatSolideBrush(RGB(255,0,0));
            InvalidateRect( hWnd,0,false);

            }
        }
  break;


      case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    break;
}

return DefWindowProc(hWnd,msg,wParam,lParam);

  }

这编译没有错误。但是单击按钮时没有任何反应

4

1 回答 1

0

问题是你总是用绿色画笔画画。看你的代码

HBRUSH brusha;
brusha=CreateSolidBrush(RGB(0,255,0));

switch(msg)
{
    ...
    case WM_PAINT:
    {
    hDC=BeginPaint(hWnd,&ps);
    SelectObject(hDC,brusha);
    ...

在这段代码brusha中,当你进入WM_PAINT.

您似乎认为,仅仅因为您将红色笔刷分配给部分中的brusha变量,WM_COMMAND就会以某种方式记住下一次绘画,但事实并非如此。请记住,在 C++ 中,每次进入函数时都会重新创建变量,并在每次退出函数时销毁。所以你编写代码的方式是行不通的。

可能最简单的方法是制作hbrusha变量static。每次进入和退出函数时都不会创建和销毁静态变量。像这样的东西

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    static HBRUSH brusha;

    switch(msg)
    {
    case WM_CREATE:
        brusha=CreateSolidBrush(RGB(0,255,0)); // set the brush green on create

        ...

        break;


    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case BUTTON:
            brusha=CreatSolideBrush(RGB(255,0,0));
            InvalidateRect( hWnd,0,false);
        }
        break;

        ...

    }

    ...
}
于 2012-11-08T09:38:11.777 回答