使用无效()更改GDI形状

use InvalideRect() to change a GDI shape

本文关键字:更改 GDI 形状 无效      更新时间:2023-10-16

我昨天问了我的问题,但无法得到正确的答案。现在生病更清楚地问。使用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);
  }

此编译没有错误。但是按钮单击

什么都没有发生

问题是,您总是用绿色刷子绘制。查看您的代码

HBRUSH brusha;
brusha=CreateSolidBrush(RGB(0,255,0));
switch(msg)
{
    ...
    case WM_PAINT:
    {
    hDC=BeginPaint(hWnd,&ps);
    SelectObject(hDC,brusha);
    ...

在此代码中,当您进入WM_PAINT时,brusha总是将是绿色刷子。

您似乎认为,仅仅因为您将红色刷子分配给brusha变量的WM_COMMAND部分中,这将以某种方式记住下一幅油漆,但这不是事实。请记住,每次输入功能时,在C 变量中都会重新创建,并在每次退出功能时都会破坏。因此,您编写代码无法正常工作的方式。

最简单的方法可能是使hbrusha变量static。每次您输入并退出Funciton时,静态变量不是不是创建和破坏的。像这样的东西

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;
        ...
    }
    ...
}