신 구 MFC 버 전 CEdit 투명 2 가지 구현 방법
4939 단어 mfc
모든 문자열 을 항상 그 릴 필요 가 없 기 때문에 최근 에 그림 알고리즘 을 수정 하 였 습 니 다.유 후 공 으로 마우스 이벤트 의 알고리즘 도 보완 한다.
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);
}
이상 은 이것 입 니 다. 주석 에 적 힌 기능 이 없 는 것 을 어떻게 실현 하 는 지 함께 교류 하 는 것 을 환영 합 니 다.저 는 풋내기 입 니 다. 대하 가 웃 지 마 세 요.잘 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[프로세스 간 통신] 오일 탱크를 이용하여 프로세스 간의 통신을 실현하다2: 연결이 없는 신뢰할 수 없는 데이터 전송 4: 오일 탱크의 서버 프로세스 읽기, 클라이언트 프로세스 쓰기 "데이터 수신", IDM_MAILSLOT_RECE,view에서 메뉴에 명령 응답 추가 2: 응답 함수에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.