網上的所有方法都用了, 還是不行, 下面是我寫的代碼,請問有漏掉的地方嗎?
OnPaint 代碼:
CPaintDC dc(this);
if (_font == nullptr)
{
_font = new CFont();
_font->CreateFont(15, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
0, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
0, // nPitchAndFamily
_T("Arial"));
}
if (_blackBrush == nullptr){
_blackBrush = new CBrush();
_blackBrush->CreateSolidBrush(RGB(0, 0, 0));
}
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CRect rect;
GetClientRect(rect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
memDC.SelectObject(bitmap);
memDC.FillSolidRect(rect, RGB(0, 0, 0));
CString text;
GetWindowText(text);
memDC.SetTextColor(RGB(255, 255, 255));
memDC.SelectObject(_font);
memDC.DrawText(text, -1, rect, DT_VCENTER);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, rect.left, rect.top, SRCCOPY);
bitmap.DeleteObject();
memDC.DeleteDC();
OnEraseBkgnd代碼:
BOOL LogOutEdit::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
OnCtlColor代碼:
HBRUSH CmediaServerGuiDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (pWnd->GetSafeHwnd() == _logOutEdit.GetSafeHwnd()){
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255, 255, 255));
return _blackBrush;
}
return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}
重繪Edit的代碼:
int i = _logOutEdit.GetWindowTextLength();
if (Message == "\b\b\b\b\b\b\b\b\b\b"
"\b\b\b\b\b\b\b\b\b\b"
"\b\b\b\b\b\b\b\b\b\b"
"\b\b\b"){
_logOutEdit.SetSel(i - 33, i);
}
else
_logOutEdit.ReplaceSel(Message);
_logOutEdit.Invalidate(TRUE);
uj5u.com熱心網友回復:
我記得UpdateData(FALSE);可以的uj5u.com熱心網友回復:
如果你重繪速度很快,每次重繪的內容不重復的話肯定會有閃爍的效果的。另外,我不太喜歡用Edit去重繪;我是建議你用ListBox去重繪,效果肯定要比Edit好
uj5u.com熱心網友回復:
那visual studio 里的Log框微軟是用什么做的呢, 它的就沒有重繪閃爍的問題
uj5u.com熱心網友回復:
從 CWnd 直接派生新類 去畫參考早先的 CSplashWnd 類
uj5u.com熱心網友回復:
int i = _logOutEdit.GetWindowTextLength();if (Message == "\b\b\b\b\b\b\b\b\b\b"
"\b\b\b\b\b\b\b\b\b\b"
"\b\b\b\b\b\b\b\b\b\b"
"\b\b\b"){
_logOutEdit.SetSel(i - 33, i);
}
else
_logOutEdit.ReplaceSel(Message);
_logOutEdit.Invalidate(TRUE);
問題出在_logOutEdit.Invalidate(TRUE); 你把你Edit的內容賦值給cstring型別的 然后UpdateData(false);
uj5u.com熱心網友回復:
給你的Edit控制元件添加一個Cstring型別的字串變數 用UpdateData(false);uj5u.com熱心網友回復:
不明白 “重繪Edit的代碼:” ?uj5u.com熱心網友回復:
_logOutEdit.ReplaceSel(Message);// edit 是 control 不要 UpdateData_logOutEdit.Invalidate(TRUE);// replace 后 控制元件 應該自動 重繪, 不要 這句
uj5u.com熱心網友回復:
視窗創建風格加入WS_CLIPCHILDuj5u.com熱心網友回復:
memDC.FillSolidRect(rect, RGB(0, 0, 0));這句是把 edit 全部 都 刷黑, 當然 會 閃爍,應該 只 繪制 真正 變的部分 如
開始 是 “Ha ha ha ha” 后來輸入了 Xixi , 那就只能 繪制 Xixi, haha 要保留 不要Fill 為 黑色。
不是 很容易搞得。
uj5u.com熱心網友回復:
memDC不是不顯示嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/120629.html
標籤:界面
