투명 화 창 SetLayeredWindowAttributes
Windows 2000/XP 에서 User32.dll 에 새 함수 SetLayered Window Attributes 가 추가 되 었 습 니 다.이 함 수 를 사용 하려 면 창 을 만 들 거나 SetWindowLong 함 수 를 사용 하여 창 스타일 WS 를 설정 해 야 합 니 다.EX_LAYERED (0x00080000)。이 스타일 이 설정 되면 창 을 투명 하 게 하기 위해 이 함 수 를 호출 할 수 있 습 니 다.이 함수 에 필요 한 매개 변 수 는 다음 과 같 습 니 다.
HWND hwnd:창 핸들COLORREF col:투명 화 색상
코드 는 먼저 대화 상자 의 구성원 변수(WinTransDlg.h)를 정의 합 니 다.
bool m_bTracking; // TRUE
HWND m_hCurrWnd; //
HCURSOR m_hCursor; //
SetLayered Window Attributes 함 수 를 가리 키 는 지침 을 동시에 정의 합 니 다.이 함 수 는 User32.dll 에서 정의 합 니 다.
//
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr,
BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;
OnInitDialog 이벤트 에서 SetLayered Window Attributes 함수 의 지침 을 가 져 오고 전역 변수 g 에 저장 합 니 다.pSetLayered Window Attributes 중.
BOOL CWinTransDlg::OnInitDialog()
{
....
// SetLayeredWindowAttributes User32.dll
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32,
"SetLayeredWindowAttributes");
if (g_pSetLayeredWindowAttributes == NULL)
AfxMessageBox (
"Layering is not supported in this version of Windows",
MB_ICONEXCLAMATION);
//
HINSTANCE hInstResource = AfxFindResourceHandle(
MAKEINTRESOURCE(IDC_WAND), RT_GROUP_CURSOR);
m_hCursor = ::LoadCursor( hInstResource, MAKEINTRESOURCE(IDC_WAND) );
...
}
그리고 이벤트 WM 정의LBUTTONDOWN, WM_LBUTTONUP 와 WMMOUSEMOVE 의 트리거 함수.MLBUTTONDOWN 이벤트 코드 는 다음 과 같 습 니 다.
void CWinTransDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
...
SetCapture(); // 。 , //
m_hCurrWnd = NULL; //
m_bTracking = true; // track
::SetCursor(m_hCursor); //
}
WM_MOUSEMOVE 이벤트 처리 함수:
void CWinTransDlg::OnMouseMove(UINT nFlags, CPoint point)
{
...
if (m_bTracking)
{
...
//
ClientToScreen(&point);
...
//
m_hCurrWnd = ::WindowFromPoint(point);
...
// 、 …
...
}
...
}
마우스 왼쪽 단 추 를 누 르 고 놓 지 않 으 면 마우스 포인터 가 막대 모양 으로 바 뀌 고 이 창의 정 보 는 WinTrans 창 에 표 시 됩 니 다.마우스 왼쪽 단 추 를 눌 렀 을 때 이벤트 WMLBUTTONUP 처리 함수 가 호출 됩 니 다.
void CWinTransDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
...
//
ReleaseCapture();
m_bTracking = false;
// WinTrans, 。
if (g_pSetLayeredWindowAttributes && m_hCurrWnd != m_hWnd)
{
::SetWindowLong(m_hCurrWnd, GWL_EXSTYLE,
GetWindowLong(m_hCurrWnd,
GWL_EXSTYLE) ^ WS_EX_LAYERED);
g_pSetLayeredWindowAttributes(m_hCurrWnd, 0,
(BYTE)m_slider.GetPos(), LWA_ALPHA);
::RedrawWindow(m_hCurrWnd, NULL, NULL,
RDW_ERASE | RDW_INVALIDATE |
RDW_FRAME | RDW_ALLCHILDREN);
}
...
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.