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 に答える