【发布时间】:2014-04-29 08:37:22
【问题描述】:
这就是我要说的:program window
我知道,这个话题已经发布了好几次了,但是我找不到任何好的解决方案。
我的问题是
1.: - 显示时间和直方图的闪烁控件(静态,非双缓冲)。
2.:-我无法将控件的背景(标签、轨迹栏伙伴、直方图 bkgnd)从白色更改为 LTGRAY_BRUSH。
下面是一些代码:
case WM_PAINT:
PaintProcedure( hdcClock );
SetBkColor(hdcWindow, RGB(255,220,180));
TextOut(hdcWindow,260,10,TEXT(" -- CAMERA WINDOW -- "),21);
break;
... ...
void PaintProcedure( HDC hdc )
{
img = cam->getFrame();
cam->ShowImage(img, hdcCam, 1, 1, img->width, img->height, 0, 0);
InvalidateRect( hClock, &rClock, 1 );
RedrawWindow(hClock,&rClock,0,RDW_UPDATENOW);
char sTime[256];
SYSTEMTIME time;
HFONT hFont;
SIZE size;
...
...
BeginPath (hdc) ;
SetBkMode( hdc, TRANSPARENT/*OPAQUE*/ );
TextOut( hdc,1,1,sTime, strlen( sTime ) );
EndPath (hdc) ;
SelectObject (hdc, CreateHatchBrush (HS_DIAGCROSS, RGB (0, 0, 255))) ;
SetBkColor (hdc, RGB (255, 0, 0)) ;
SetBkMode (hdc, OPAQUE) ;
StrokeAndFillPath (hdc) ;
DeleteObject (SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)));
SelectObject (hdc, GetStockObject (SYSTEM_FONT)) ;
DeleteObject (hFont) ;
cam->ShowImage(cam->drawIntensityHistogram(),hdcHistogram,1,1,
rHistogram.right-rHistogram.left,rHistogram.bottom-rHistogram.top,0,0);
InvalidateRect( hwnd, &r, 1 );
RedrawWindow(hwnd,&r,0,RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
}
添加此代码:
case WM_CTLCOLORSTATIC:
case WM_CTLCOLORDLG:
case WM_CTLCOLORBTN:
return (LRESULT)GetStockObject(LTGRAY_BRUSH);
导致仅绘制没有框架的轨迹栏。 我尝试使用计时器来使控件无效并重绘控件,但它没有帮助。 现在我不知道如何解决它。有人可以帮帮我吗?
【问题讨论】:
-
您的主窗口是对话框,还是您自己创建窗口及其控件? [如果是对话框,大概可以在定时器触发时处理绘图,无需处理
WM_PAINT] -
窗口和所有控件都是“自制”的。我在 WM_CREATE 消息上创建控件。并且主窗口设置了 CS_OWNDC 标志。案例 WM_CREATE: hdcWindow = GetDC (hwnd) ; hClock = CreateWindowEx(0, "STATIC", NULL, WS_CHILD |WS_BORDER |WS_VISIBLE, 10, 4, 100, 25, hwnd, NULL, hInst, NULL);
-
我建议删除
WM_PAINT的处理程序并在计时器触发时调用您的PaintProcedure(),从您的PaintProcedure()中删除对InvalidateRect()和RedrawWindow()的所有调用,并使用您不同的@ 987654332@s 绘制到您的控件
标签: winapi controls background-color flicker