【发布时间】:2013-08-13 06:08:05
【问题描述】:
我有一个使用以下样式创建的主窗口WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_TABSTOP | WS_GROUP | WS_VISIBLE
和前任WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT | WS_EX_LEFT | WS_EX_LTRREADING.
这个主窗口上有一个子窗口,它是一个用样式创建的编辑控件WS_VISIBLE | WS_CHILD | ES_READONLY
和前风格WS_EX_CLIENTEDGE.
我打算将此编辑控件用作进度条控件。我不想使用标准的 Wind32 进度条控件 (PROGRESS_CLASS),因为我想对其进行一些自定义绘画(例如;动态更改填充颜色、在其上显示文本等)。
我可以通过以下代码绘制主窗口的任何区域:
// hWnd: Handle of the main window
case WM_PAINT:
hDc = BeginPaint(hWnd, &Ps);
Rect = AFunctionToGetCornerThePointsOfTheEditControl();
Rect.right = Rect.left + 3 * (Rect.right - Rect.left) / 4; // Fill 3/4 (75%) of it
Rect.left -= 10; // Enlarge the paint region a little
Rect.top -= 10; // so that we can see it if it stays
Rect.bottom += 10; // under the edit control.
hBrush = CreateSolidBrush(RGB(50,100,255));
ret = FillRect(hDc, &Rect, hBrush); // ret = 1 always
ler = GetLastError(); // ler = 0
EndPaint(hWnd, &Ps);
break;
看起来像这样:
我稍微更改了这段代码来绘制子控件:
// hWndEdit: Handle of the edit control
case WM_PAINT:
hDc = BeginPaint(hWndEdit, &Ps);
Rect = AFunctionToGetCornerThePointsOfTheEditControl();
Rect.right = Rect.left + 3 * (Rect.right - Rect.left) / 4; // Fill 3/4 (75%) of it
Rect.left -= 10;
Rect.top -= 10;
Rect.bottom += 10;
hBrush = CreateSolidBrush(RGB(50,100,255));
ret = FillRect(hDc, &Rect, hBrush); // ret = 0 always
ler = GetLastError(); // ler = 6 (ERROR_INVALID_HANDLE)
EndPaint(hWndEdit, &Ps);
break;
这次不行。一旦我将其某些部分拖出屏幕区域,主窗口就会完全消失,并且它变得完全没有响应。其下方的桌面图标可见,但不可点击。
那么,为了绘制子窗口(编辑控件),我必须做什么?
【问题讨论】:
-
进行自定义绘画的正确方法是继承它。
标签: c++ winapi paint gdi win32gui