我寫了一段程式,可以通過顏色按鈕修改字體顏色
//我是在OnCtlColor函式里pDC->SetTextColor(m_color1); 實作對字體修改顏色的
m_color1 = ((CMFCColorButton*)GetDlgItem(IDC_MFCCOLORBUTTON2))->GetColor();
用顏色按鈕控制元件換顏色后,界面的字體顏色不會重繪;我的程式中控制元件是可以拖動的,我拖動控制元件后,字體顏色才會變化
因此我想用定時器來進行重繪界面
求大佬指點
uj5u.com熱心網友回復:
void CEditTestDlg::OnBnClickedBtnTimerUpdate()
{
this->SetTimer(1,1,NULL);
this->SetTimer(2,1,NULL);
}
void CEditTestDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
if (tmp >= 100)
{
this->KillTimer(1);
MessageBox(_T("定時器1停止!"), NULL, NULL);
return;
}
Sleep(20);
tmp += 1;
m_value.Format(_T("%d"),tmp);
UpdateData(FALSE);
break;
case 2:
if (tmp1 >= 200)
{
this->KillTimer(2);
MessageBox(_T("定時器2停止!"), NULL, NULL);
return;
}
Sleep(20);
tmp1 += 1;
m_value2.Format(_T("%d"),tmp1);
UpdateData(FALSE);
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
紅色標注的幾個變數是什么類的啊?
uj5u.com熱心網友回復:
有人以前做過類似的嗎uj5u.com熱心網友回復:
可以用 Invalidate 引發重繪if(GetDlgItem(IDC_MFCCOLORBUTTON2))
{
GetDlgItem(IDC_MFCCOLORBUTTON2)->Invalidate();
}
uj5u.com熱心網友回復:
從代碼猜測 int tmp; CString m_value, m_value2;uj5u.com熱心網友回復:
if(GetDlgItem(IDC_MFCCOLORBUTTON2)){
GetDlgItem(IDC_MFCCOLORBUTTON2)->Invalidate();
}
這段怎么用?在OnPaint,還是在OnCtlColor,亦或是在其他函式里面使用?
uj5u.com熱心網友回復:
void ButtonCreatePad::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: 在此處添加訊息處理程式代碼
// 不為繪圖訊息呼叫 CDialogEx::OnPaint()
CPaintDC dc(this);
CRect rect1;
GetClientRect(&rect1);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmapW(IDB_BITMAP7);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap* pbmpOld = dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0, 0, rect1.Width(), rect1.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
}
HBRUSH ButtonCreatePad::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
m_color1 = ((CMFCColorButton*)GetDlgItem(IDC_MFCCOLORBUTTON2))->GetColor();
// TODO: 在此更改 DC 的任何特性
UINT id = pWnd->GetDlgCtrlID();
if (id == IDC_RADIO_SQUARE || id == IDC_RADIO_ROUND)
{
pDC->SetBkMode(TRANSPARENT);
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
CDC* dc = GetDC();
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY); //把父視窗背景圖片先畫到按鈕上
ReleaseDC(dc);
hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
}
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT); //設定文字背景透明
pDC->SetTextColor(m_color1); //設定字體為白色
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
pDC->SetTextColor(m_color1);
pDC->SetBkMode(TRANSPARENT); //設定控制元件背景透明 (不要忘了將控制元件背景設為透明呀,或者在控制元件的屬性中修改,那樣太費力了)
switch (nCtlColor)
{
case CTLCOLOR_BTN:
hbr = (HBRUSH)::GetStockObject(NULL_BRUSH); //回傳一個空刷子即可使靜態字體背景透明
default:break;
}
// TODO: 如果默認的不是所需畫筆,則回傳另一個畫筆
return hbr;
}
你說的Invalidate 引發重繪是怎么弄
uj5u.com熱心網友回復:




uj5u.com熱心網友回復:
用顏色按鈕控制元件換顏色后,控制元件.Invalidate();
uj5u.com熱心網友回復:
我剛才直接加了一個按鈕,然后在點擊函式里面Invalidate();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/233231.html
標籤:界面
上一篇:MFC位移運算子不能正常使用
