신 구 MFC 버 전 CEdit 투명 2 가지 구현 방법

4939 단어 mfc
전재 출처 를 밝 혀 주 십시오: http://www.cnblogs.com/xuesongshu/
모든 문자열 을 항상 그 릴 필요 가 없 기 때문에 최근 에 그림 알고리즘 을 수정 하 였 습 니 다.유 후 공 으로 마우스 이벤트 의 알고리즘 도 보완 한다.
MFC 4.2 (Visual Studio 6) 구현 이 편리 합 니 다. 대화 상자 클래스 에서 WM 만 처리 하면 됩 니 다.CTLCOLOR 메시지, 그리고 다음 코드 를 사용 하면 됩 니 다.
  
HBRUSH CAlphaEditboxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 

{

	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	

	// TODO: Change any attributes of the DC here

	pDC->SetBkMode(TRANSPARENT);

	hbr=(HBRUSH)GetStockObject(HOLLOW_BRUSH);

	// TODO: Return a different brush if the default is not desired

	return hbr;

}


그리고 컨트롤 을 편집 하 는 이벤트 에서 Invaidate 를 호출 합 니 다.
void CAlphaEditboxDlg::OnKillfocusEditkey() 

{

	// TODO: Add your control notification handler code here

	Invalidate();

}



void CAlphaEditboxDlg::OnKillfocusEditmessage() 

{

	// TODO: Add your control notification handler code here

	Invalidate();

}



void CAlphaEditboxDlg::OnKillfocusEditpath() 

{

	// TODO: Add your control notification handler code here

	Invalidate();

}


문 자 를 삭제 하면 배경 을 다시 그 리 는 것 을 잊 지 마 세 요.여기 에는 일부분 만 나열 되 어 있다.
새로운 MFC 는 배경 을 CLR 로 설정 하기 때문에 상당히 번거롭다 고 할 수 있다.NONE 또는 브러시 는 HOLLOWBRUSH, 마이크로소프트 가 검은색 배경 을 기본적으로 만 들 수 있다 는 점 에서 마이크로소프트 는 정말 후퇴 했다.쓸데없는 소리 하지 마 세 요. 편집 컨트롤 의 하위 화 는 피 할 수 없습니다. WM 를 처리 해 야 합 니 다.PAINT、WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP 라 는 몇 가지 소식.편집 제어 테 두 리 를 제거 하려 면 WM 를 처리 해 야 합 니 다.NCPAINT 메시지 입 니 다. 하지만 여 기 는 아무런 코드 도 쓰 지 않 습 니 다. 기본 CDialogEx: OnNcPaint () 방법 으로 테 두 리 를 그 리 는 것 을 피하 기 위해 서 입 니 다.아래 코드 는 기본 적 인 투명 효 과 를 구현 합 니 다. 정상 적 인 입력 은 문제 가 없습니다. 삭제, 선택, 취소 등 기능 을 수행 하려 면 WM 을 추가 로 처리 하 십시오.LBUTTONDOWN、WM_LBUTTONUP 메시지.
//////////////////////////////////////////////////////////////////////////

//    。

//////////////////////////////////////////////////////////////////////////

void CMyEdit::OnPaint()

{

	PAINTSTRUCT ps;

	TEXTMETRIC tm;

	int nSelStart=0,nSelEnd=0,nDrawStart=0,nDrawLen=0,nTxtLen=0;

	RECT r;

	CBitmap b;

	LPTSTR szData=(LPTSTR)calloc(1024,sizeof(TCHAR));

	//    ,      ,          szData

	LPTSTR szDraw=szData;

	CPaintDC* d2=(CPaintDC*)BeginPaint(&ps);

	CDC d1;

	CFont f;

	CWnd* p=GetParent();

	nTxtLen=GetWindowText(szData,1024);

	b.LoadBitmap(IDB_BITMAP1);

	d1.CreateCompatibleDC(p->GetDC());

	GetWindowRect(&r);

	p->ScreenToClient(&r);

	d1.SelectObject(b);

	d2->BitBlt(0,0,r.right-r.left,r.bottom-r.top,&d1,r.left,r.top,SRCCOPY);

	f.CreateFontIndirect(&m_lf);

	d2->SelectObject(f);

	d2->SetBkMode(TRANSPARENT);

	d2->GetTextMetrics(&tm);

	while(*szDraw++);

	szDraw--;

	nDrawStart=min(nTxtLen,(r.right-r.left)/tm.tmAveCharWidth);

	nDrawLen=nDrawStart;

	while (nDrawStart--)

		szDraw--;

	d2->TextOut(0,0,szDraw,nDrawLen);

	d2->SelectObject(GetStockObject(NULL_BRUSH));

	d2->SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));

	d2->Rectangle(0,0,r.right-r.left,r.bottom-r.top);

	POINT pt;

	pt=GetCaretPos();

	pt.x=min(nTxtLen*tm.tmAveCharWidth,r.right-r.left);

	SetCaretPos(pt);

	delete szData;

	EndPaint(&ps);

}



//////////////////////////////////////////////////////////////////////////

//             2   。

//////////////////////////////////////////////////////////////////////////

void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

	TEXTMETRIC tm;

	int nSelStart=0,nSelEnd=0,nDrawStart=0,nDrawLen=0,nTxtLen=0;

	RECT r;

	CBitmap b;

	LPTSTR szData=(LPTSTR)calloc(1024,sizeof(TCHAR));

	LPTSTR szInput=(LPTSTR)calloc(1024,sizeof(TCHAR));

	//    ,      ,          szData

	LPTSTR szDraw=szData;

	CClientDC d2(this);

	CDC d1;

	CFont f;

	CWnd* p=GetParent();

	nTxtLen=GetWindowText(szData,1024);

	wsprintf(szInput,L"%c",nChar);

	lstrcat(szData,szInput);

	SetWindowText(szData);

	b.LoadBitmap(IDB_BITMAP1);

	d1.CreateCompatibleDC(p->GetDC());

	GetWindowRect(&r);

	p->ScreenToClient(&r);

	d1.SelectObject(b);

	d2.BitBlt(0,0,r.right-r.left,r.bottom-r.top,&d1,r.left,r.top,SRCCOPY);

	f.CreateFontIndirect(&m_lf);

	d2.SelectObject(f);

	d2.SetBkMode(TRANSPARENT);

	d2.GetTextMetrics(&tm);

	while(*szDraw++);

	szDraw--;

	nDrawStart=min(nTxtLen,(r.right-r.left)/tm.tmAveCharWidth);

	nDrawLen=nDrawStart;

	while (nDrawStart--)

		szDraw--;

	d2.TextOut(0,0,szDraw,nDrawLen);

	d2.SelectObject(GetStockObject(NULL_BRUSH));

	d2.SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));

	d2.Rectangle(0,0,r.right-r.left,r.bottom-r.top);

	POINT pt;

	pt=GetCaretPos();

	pt.x=min(nTxtLen*tm.tmAveCharWidth,r.right-r.left);

	SetCaretPos(pt);

	delete szData;

	delete szInput;

	//CEdit::OnChar(nChar, nRepCnt, nFlags);

}


  
이상 은 이것 입 니 다. 주석 에 적 힌 기능 이 없 는 것 을 어떻게 실현 하 는 지 함께 교류 하 는 것 을 환영 합 니 다.저 는 풋내기 입 니 다. 대하 가 웃 지 마 세 요.잘 부탁드립니다.

좋은 웹페이지 즐겨찾기