现在的位置: 首页 > 综合 > 正文

CEdit编辑框透明的实现

2013年10月31日 ⁄ 综合 ⁄ 共 1296字 ⁄ 字号 评论关闭

只是为了存下来,慢慢研究

实现方法1:
直接在对话框中:

  1. HBRUSH CLoginDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  2. {
  3. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  4. if(nCtlColor == CTLCOLOR_DLG)
  5. return m_brush;
  6. if(nCtlColor == CTLCOLOR_EDIT)
  7. {
  8. HBRUSH hNullBr = (HBRUSH)::GetStockObject(NULL_BRUSH);
  9. pDC->SetTextColor(RGB(0, 255, 0));
  10. pDC->SetBkMode(TRANSPARENT);//设置背景透明
  11. return hNullBr;
  12. }
  13. if(nCtlColor == CTLCOLOR_STATIC)
  14. {
  15. //HBRUSH hNullBr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
  16. //pDC->SetTextColor(RGB(0, 0, 0));
  17. //pDC->SetBkMode(TRANSPARENT); //背景设为透明
  18. //return hNullBr;
  19. }
  20. return hbr;
  21. }

如果只是这样的话,编辑框无法回格删除,所以我在OnEnChange中刷新一下:

  1. void CLoginDlg::OnEnChangeEditUser()
  2. {
  3. // TODO: 如果该控件是 RICHEDIT 控件,它将不
  4. // 发送此通知,除非重写 CDialog::OnInitDialog()
  5. // 函数并调用 CRichEditCtrl().SetEventMask(),
  6. // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
  7. CRect rc;
  8. GetDlgItem(IDC_EDIT_USER)->GetWindowRect(&rc);
  9. ScreenToClient(&rc);
  10. InvalidateRect(&rc, FALSE);
  11. }

这个实现的方法前提是我的编辑框属性必须为多行, 但我的应用中其中一个编辑框是用来输入密码的,设置多行之后就不能设置密码属性; 所以放弃

实现方法2
CMyEdit继承CEdit, 重载CtlColor(),设置编辑框的字体以及背景透明;

  1. HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
  2. {
  3. HBRUSH hNullBr = (HBRUSH)::GetStockObject(NULL_BRUSH);
  4. pDC->SetTextColor(RGB(0, 255, 0));
  5. pDC->SetBkMode(TRANSPARENT);
  6. return hNullBr;
  7. //return NULL;
  8. }

同样我要刷新一下:

  1. void CMyEdit::OnEnChange()
  2. {
  3. CRect rc;
  4. CLoginDlg* pParent = (CLoginDlg*)GetParent();
  5. GetWindowRect(&rc);
  6. pParent->ScreenToClient(&rc);
  7. pParent->InvalidateRect(&rc, FALSE);
  8. }

抱歉!评论已关闭.