控件的背景色(winapi)

控件的背景色(winapi),winapi,controls,background-color,flicker,Winapi,Controls,Background Color,Flicker,以下是我要说的: 我知道,这个话题已经发表过好几次了,但我找不到好的解决办法。 我的问题是 1.:-显示时间和直方图的闪烁控件(静态,非双缓冲红色)。 2.:-我无法将控件(标签、轨迹栏伙伴、直方图bkgnd)的背景从白色更改为LTGRAY_笔刷。 下面是一些代码: case WM_PAINT: PaintProcedure( hdcClock ); SetBkColor(hdcWindow, RGB(255,220,180)); TextOut(hdcWindow,26

以下是我要说的:

我知道,这个话题已经发表过好几次了,但我找不到好的解决办法。 我的问题是
1.:-显示时间和直方图的闪烁控件(静态,非双缓冲红色)。
2.:-我无法将控件(标签、轨迹栏伙伴、直方图bkgnd)的背景从白色更改为LTGRAY_笔刷。
下面是一些代码:

case WM_PAINT:
    PaintProcedure( hdcClock );
    SetBkColor(hdcWindow, RGB(255,220,180));
    TextOut(hdcWindow,260,10,TEXT(" -- CAMERA WINDOW -- "),21); 
    break;
。。。

添加此代码:

case WM_CTLCOLORSTATIC:
case WM_CTLCOLORDLG:
case WM_CTLCOLORBTN:
    return (LRESULT)GetStockObject(LTGRAY_BRUSH);
导致仅绘制轨迹栏而不绘制框架。 我尝试使用计时器来使控件无效并重新绘制控件,但没有任何帮助。
现在我不知道如何修复它。有人能帮我吗?

移除WM_PAINT的处理程序,并在计时器触发时调用您的PaintProcedure():示例代码

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{   HWND hwnd;
    MSG msg;
    WNDCLASS w;

    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // WHITE_BRUSH
    w.lpszClassName = L"My Class";
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    RegisterClass(&w);
    hwnd = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 300, 200, 800, 600, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

UINT_PTR uTimerId;
LOGBRUSH lbrBk;
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{   switch (Message)
    {   case WM_CREATE:
        {   LRESULT lRes = DefWindowProc(hwnd, Message, wparam, lparam); // I don't have any controls in the main window
            HBRUSH hbr = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
            GetObject(hbr, sizeof(lbrBk), &lbrBk); // for use in timer logic
            uTimerId = SetTimer(hwnd, 123, 1000, NULL);
            return lRes;
        }

        case WM_TIMER:
        {   TCHAR szTime[128];
            HDC hdc = GetDC(hwnd);
            _tstrtime_s(szTime, _countof(szTime));
            SetBkColor(hdc, lbrBk.lbColor);
            TextOut(hdc, 200, 200, szTime, _tcslen(szTime));
            ReleaseDC(hwnd, hdc);
            break;
        }

        case WM_DESTROY: 
            KillTimer(hwnd, uTimerId);
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}

哦,几年来我一直没有使用winapi,所以我可能会忘记gdi是如何工作的,但我不明白我怎么可能不使用它,你说的是:删除WM_PAINT-整个处理程序,而不仅仅是我从它执行的调用
前面我解决了直方图闪烁的问题。这是一个非常快速的过程,我在python中编写并检查了camera类中的所有算法,所以我确信它应该可以工作。它是有效的。我不得不关闭代码优化。
您的提示解决了计时器闪烁问题和总体界面效率。但是现在还没有解决白色背景的问题。我应该使用子类化为控件提供我选择的颜色吗?我试过WM_CREATE

hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD| WS_VISIBLE |SS_LEFT, 10, 130, 200, 20, hwnd, NULL, hInst, NULL );
        SetBkColor(GetDC(hStatic), lbrBk.lbColor);
        SetWindowText( hStatic, buf );
但是没有效果。

这是我现在的界面:
谢谢使用静态控件的源代码:

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);

HWND hWndStatic;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{   HWND hwnd;
    MSG msg;
    WNDCLASS w;

    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    w.lpszClassName = L"My Class";
    w.hCursor = LoadCursor(NULL, IDC_ARROW); 
    RegisterClass(&w);

    hwnd = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 300, 200, 800, 600, NULL, NULL, hInstance, NULL);
    hWndStatic = CreateWindowEx(0, L"Static", NULL, WS_CHILD| WS_VISIBLE |SS_LEFT, 10, 130, 200, 20, hwnd, NULL, hInstance, NULL);

    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

UINT_PTR uTimerId;
LOGBRUSH lbrBk;

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message)
    {   case WM_CREATE:
        {   LRESULT lRes = DefWindowProc(hwnd, Message, wparam, lparam);
            HBRUSH hbr = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
            GetObject(hbr, sizeof(lbrBk), &lbrBk);
            uTimerId = SetTimer(hwnd, 123, 1000, NULL);
            return lRes;
        }

        case WM_CTLCOLORSTATIC:
            if ((HWND)lparam == hWndStatic)
            {   SetBkColor((HDC)wparam, lbrBk.lbColor);
                return (BOOL) GetStockObject(LTGRAY_BRUSH);
            }
            return FALSE;

        case WM_TIMER:
        {   TCHAR szTime[128];
            HDC hdc = GetDC(hwnd);
            _tstrtime_s(szTime, _countof(szTime));
            SetWindowText(hWndStatic, szTime);
            ReleaseDC(hwnd, hdc);
            break;
        }

        case WM_DESTROY: 
            KillTimer(hwnd, uTimerId);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}

您的主窗口是一个对话框,还是您自己创建窗口及其控件?[如果它是一个对话框,您可能可以在计时器启动时处理图形,无需处理
WM_PAINT
]窗口和所有控件都是“自制的”。我在WM_创建消息上创建控件。并且主窗口设置了CS_OWNDC标志。案例WM_CREATE:hdcWindow=GetDC(hwnd);hClock=CreateWindowEx(0,“静态”,NULL,WS|u子项| WS|u边框| WS|u可见,10,4,100,25,hwnd,NULL,hInst,NULL);我建议删除
WM_PAINT
的处理程序,并在计时器启动时调用
PaintProcedure()
,从
PaintProcedure()中删除对
invalidate()
RedrawWindow()的所有调用
并使用不同的
HDC
s对控件进行绘制,这样就不会绘制任何内容:您需要在每次
TextOut()之前调用
SetBkColor()
[不确定是否使用全局HDC变量并调用
SetBkColor()
om
WM\u CREATE
也会起作用],正如您在创建时看到的那样,它不起作用,我将在晚上尝试使用它。将WM_CTLCOLORSTATIC返回值更改为(LRESULT)CreateSolidBrush(RGB(0,0255))后,我发现控制的背景正确地更改为LTGRAY(现在为蓝色)。控件上文本的白色背景只是字体背景!我明白了,使用系统程序无法更改文本背景。当SetWindowText()发生时,系统使用预定义的颜色简单地执行各种布尔操作。我必须使用控件的子类来实现我想要的。在我准备好这个之前,我不会把话题设定为已解决。再次感谢你的帮助。任何进一步的评论都很清楚:我不确定我是否理解您的要求,但是在
WM\u ctlcolorstic
处理程序中,您可以根据控件返回画笔,例如:
if((HWND)lParam==hWndClock)
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);

HWND hWndStatic;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{   HWND hwnd;
    MSG msg;
    WNDCLASS w;

    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    w.lpszClassName = L"My Class";
    w.hCursor = LoadCursor(NULL, IDC_ARROW); 
    RegisterClass(&w);

    hwnd = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 300, 200, 800, 600, NULL, NULL, hInstance, NULL);
    hWndStatic = CreateWindowEx(0, L"Static", NULL, WS_CHILD| WS_VISIBLE |SS_LEFT, 10, 130, 200, 20, hwnd, NULL, hInstance, NULL);

    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

UINT_PTR uTimerId;
LOGBRUSH lbrBk;

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message)
    {   case WM_CREATE:
        {   LRESULT lRes = DefWindowProc(hwnd, Message, wparam, lparam);
            HBRUSH hbr = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
            GetObject(hbr, sizeof(lbrBk), &lbrBk);
            uTimerId = SetTimer(hwnd, 123, 1000, NULL);
            return lRes;
        }

        case WM_CTLCOLORSTATIC:
            if ((HWND)lparam == hWndStatic)
            {   SetBkColor((HDC)wparam, lbrBk.lbColor);
                return (BOOL) GetStockObject(LTGRAY_BRUSH);
            }
            return FALSE;

        case WM_TIMER:
        {   TCHAR szTime[128];
            HDC hdc = GetDC(hwnd);
            _tstrtime_s(szTime, _countof(szTime));
            SetWindowText(hWndStatic, szTime);
            ReleaseDC(hwnd, hdc);
            break;
        }

        case WM_DESTROY: 
            KillTimer(hwnd, uTimerId);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}