투명 화 창 SetLayeredWindowAttributes

사용법
Windows 2000/XP 에서 User32.dll 에 새 함수 SetLayered Window Attributes 가 추가 되 었 습 니 다.이 함 수 를 사용 하려 면 창 을 만 들 거나 SetWindowLong 함 수 를 사용 하여 창 스타일 WS 를 설정 해 야 합 니 다.EX_LAYERED (0x00080000)。이 스타일 이 설정 되면 창 을 투명 하 게 하기 위해 이 함 수 를 호출 할 수 있 습 니 다.이 함수 에 필요 한 매개 변 수 는 다음 과 같 습 니 다.
HWND hwnd:창 핸들COLORREF col:투명 화 색상
  • BYTE bAlpha:=0:전체 창 이 투명 하고=255 가 완전히 불투명 합 니 다
  • DWORD dwFlags:=1:색상 col 만 투명 하고=2:창 은 bAlpha 변수 에 따라 투명 하 게 처리 합 니 다

  • 코드 는 먼저 대화 상자 의 구성원 변수(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);
    }
    ...
    }

    좋은 웹페이지 즐겨찾기