【发布时间】:2015-09-04 08:41:32
【问题描述】:
我的主代码中有一个回调函数,它包含在 Switch case 语句中。在每个案例之后,我定义了一个 SetWindowText 函数来打印在对话框(或父窗口)上创建的静态控件中的文本,如下所示:
::SetWindowText(GetDlgItem(IDC_STATIC)->m_hWnd, "loading");
我打算将静态控件的背景设置为对话框的背景。一切都很顺利,除了所有案例的文本相互重叠,我收到一个带有重叠文本的静态控件,如下所示:
我不知道为什么在每个步骤中它都没有关闭静态窗口以避免此类问题。
我添加了OnEraseBkgnd、OnDestroy、OnCtlColor 消息如下:
BOOL CmainDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldbitmap = dcMemory.SelectObject(&CBmp);
CRect rcClient;
GetClientRect(&rcClient);
const CSize& sbitmap = bitmapSize;
pDC->BitBlt(0, 0, sbitmap.cx, sbitmap.cy, &dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(pOldbitmap);
return TRUE;
}
HBRUSH CmainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == IDC_STATIC)
//Example of changing Text colour specific to a certain
//Static Text Contol in this case IDC_STATIC.
{
pWnd->GetExStyle() & (WS_EX_TRANSPARENT);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255, 255, 255));
}
if (pWnd->GetDlgCtrlID() == IDC_OPERATION)
{
pWnd->GetExStyle() & (WS_EX_TRANSPARENT);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255, 255, 0));
// Return handle to our CBrush object
}
return reinterpret_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
}
void CmainDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
Background.DeleteObject(); // Delete Background bitmap
BrushHol.DeleteObject();
}
//subclass the static control, just to make sure the code is the only one handling WM_ERASEBKGND and WM_PAINT messages.
void CmainDlg::PreSubclassWindow()
{
CWnd::PreSubclassWindow();
const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT);
}
更新:
我评论了OnEraseBkgnd、OnDestroy、OnCtlColor 函数。所以我收到了相同的重叠文本,现在我可以更确定地说问题来自setWindowText,因为在完成每个 Case 后,文本仍保留在我在每个开关中定义的静态控制窗口上案例陈述。
我尝试使用以下命令,但没有任何反应:
EnableWindow( GetDlgItem(m_hWnd, IDC_STATIC), FALSE);
m_static.EnableWindow(FALSE);
或
::SetDlgItemText(m_hWnd, IDC_STATIC, "");
我将不胜感激。
【问题讨论】:
-
您将背景设置为透明,这是正确的行为吗?如果您在主循环中的同一区域渲染相同的文本,这意味着文本不会被替换,而是会保留在那里并且会重叠...尝试将背景更改为不透明。打印文本时是否使用相同的坐标?
-
原来你其实并不喜欢 SetBkMode(TRANSPARENT)
-
@KostasRim 没有
SetBkMode(TRANSPARENT)函数,静态控件失去其父背景! -
@HansPassant 如果没有 SetBkMode(TRANSPARENT),它会再次回到非透明模式。我的意思是父背景没有设置为静态背景!
-
查看当您将某些内容设置为透明时,在同一位置呈现文本的循环的每次迭代都会重叠。这就是透明物体的全部意义所在。除了透明,你还有其他选择吗?现在,如果您真的不关心性能,那么为什么不在每次循环迭代中再次尝试设置背景呢?你能试试这个吗?如果您这样做,它将清除整个屏幕,并准备好再次呈现文本。
标签: c++ visual-c++ mfc dialog