vc++ 투명 윈도우 만들자~

개발/Visual Studio 2007/09/01 22:15 posted by zekill
BYTE byTrans = 128; // 0 - 255
    LONG lOldStyle;
    const DWORD WS_EX_LAYERED = 0x80000;
    const DWORD LWA_ALPHA = 0x2;
    typedef BOOL (_stdcall *API_TYPE)(HWND,COLORREF,BYTE,DWORD);
    API_TYPE SetLayeredWindowAttributes;

    HMODULE hUser32 = ::GetModuleHandle( _T("user32.dll"));
    SetLayeredWindowAttributes = (API_TYPE)::GetProcAddress( hUser32, "SetLayeredWindowAttributes");

    if( SetLayeredWindowAttributes)
    {
        lOldStyle = GetWindowLong( m_hWnd, GWL_EXSTYLE);
        long lret;
        lret = SetWindowLong( m_hWnd, GWL_EXSTYLE, lOldStyle | WS_EX_LAYERED);

        int ret;
        ret = SetLayeredWindowAttributes( m_hWnd, 0, byTrans, LWA_ALPHA);
    }


// 요걸로 하면 되긴 되는데...
// 다이얼로그의 스타일이 child 일때는 무조건 실패당..안댄다는얘기..ㅡㅡ
// 팝업스타일일때만 가능
2007/09/01 22:15 2007/09/01 22:15
//음..클라이언트엣지를 없애주면...-0-
//폼뷰에서 초기화할때 아래코드를...

void CInnisCastView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();
    ModifyStyleEx(WS_EX_CLIENTEDGE, 0);    // 경계선 없애기..-0-

    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();

    this->GetParent()->MoveWindow(0, 0, 250, 500);
    this->GetParent()->CenterWindow();

}
2007/09/01 22:14 2007/09/01 22:14
//비트맵 불러오고
CBitmap *bmpImage;
    bmpImage = CBitmap::FromHandle((HBITMAP)LoadImage(GetModuleHandle(NULL), "skin\\All player1.bmp", IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_DEFAULTSIZE ));

//사이즈가져오고
    BITMAP bitmap;
    int nBmpWidth, nBmpHeight;
    ::GetObject(*bmpImage, sizeof(BITMAP), &bitmap);   
    nBmpWidth = bitmap.bmWidth;
    nBmpHeight = bitmap.bmHeight;
2007/09/01 22:14 2007/09/01 22:14
TAG ,

vc++ 윈도우 크기제한하기

개발/Visual Studio 2007/09/01 22:13 posted by zekill
메세지 WM_GETMINMAXINFO


void CBoayoDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
    // TODO: Add your message handler code here and/or call default
    lpMMI->ptMinTrackSize.x = 250;
        lpMMI->ptMinTrackSize.y = 200;

    //CDialog::OnGetMinMaxInfo(lpMMI); <--요넘 제거
}
2007/09/01 22:13 2007/09/01 22:13
//이건 기본 지정되있는 API이며 Msimg32.lib 이넘을 링크해야 사용가능
TransparentBlt(mydc->m_hDC, 0, 0, m_ButtonSize.cx, m_ButtonSize.cy, pMemDC->m_hDC, 0, 0, m_ButtonSize.cx, m_ButtonSize.cy, RGB(255,0,255));


// 이 아래는 커스텀형식의 마스크이미지를 자동으로 만들고 투명처리하는 함수..
// 1번과 2번...뭐 암거나...사용

TransparentBlt1(mydc->m_hDC, 0, 0, pMemDC->m_hDC, m_ButtonSize.cx, m_ButtonSize.cy, RGB(255,0,255));

TransparentBlt2(mydc, 0, 0, m_ButtonSize.cx, m_ButtonSize.cy, pMemDC, RGB(255,0,255));



void TransparentBlt1(HDC hdc, int xStart, int yStart, HDC hdcTemp, int nWidth, int nHeight, COLORREF cTransparentColor)
{
    COLORREF   cColor;
    HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
    HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
    HDC        hdcMem, hdcBack, hdcObject, hdcSave;
    POINT      ptSize;    

    ptSize.x = nWidth;
    ptSize.y = nHeight;
    DPtoLP(hdcTemp, &ptSize, 1);      // Convert from device
                                     // to logical points    

    // Create some DCs to hold temporary data.
    hdcBack   = CreateCompatibleDC(hdc);
    hdcObject = CreateCompatibleDC(hdc);
    hdcMem    = CreateCompatibleDC(hdc);
    hdcSave   = CreateCompatibleDC(hdc);

    // Create a bitmap for each DC.    

    // Monochrome DC
    bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);    

    // Monochrome DC
    bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
    bmAndMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
    bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);    

    // Each DC must select a bitmap object to store pixel data.
    bmBackOld   = (HBITMAP) SelectObject(hdcBack, bmAndBack);
    bmObjectOld = (HBITMAP) SelectObject(hdcObject, bmAndObject);
    bmMemOld    = (HBITMAP) SelectObject(hdcMem, bmAndMem);
    bmSaveOld   = (HBITMAP) SelectObject(hdcSave, bmSave);    

    // Set proper mapping mode.
    SetMapMode(hdcTemp, GetMapMode(hdc));

    // Save the bitmap sent here, because it will be overwritten.
    BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);    

    // Set the background color of the source DC to the color.
    // contained in the parts of the bitmap that should be transparent
    cColor = SetBkColor(hdcTemp, cTransparentColor);    

    // Create the object mask for the bitmap by performing a BitBlt
    // from the source bitmap to a monochrome bitmap.
    BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);    

    // Set the background color of the source DC back to the original
    // color.
    SetBkColor(hdcTemp, cColor);    

    // Create the inverse of the object mask.
    BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);    

    // Copy the background of the main DC to the destination.
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);    

    // Mask out the places where the bitmap will be placed.
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);    

    // Mask out the transparent colored pixels on the bitmap.
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);    

    // XOR the bitmap with the background on the destination DC.
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);    

    // Copy the destination to the screen.
    BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);    

    // Place the original bitmap back into the bitmap sent here.
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);    

    // Delete the memory bitmaps.
    DeleteObject(SelectObject(hdcBack, bmBackOld));
    DeleteObject(SelectObject(hdcObject, bmObjectOld));
    DeleteObject(SelectObject(hdcMem, bmMemOld));
    DeleteObject(SelectObject(hdcSave, bmSaveOld));    

    // Delete the memory DCs.
    DeleteDC(hdcMem);
    DeleteDC(hdcBack);
    DeleteDC(hdcObject);
    DeleteDC(hdcSave);


}

void TransparentBlt2(CDC *destDC, int nX, int nY, int nW, int nH, CDC *buffDC, COLORREF crTransparent)
{
        CDC        *dc = GetDC();
        CDC        dcTemp, dcMask2, dcMask3;
        CBitmap bitmapTemp, *bitmapTempOld;
        CBitmap bitmapMask2, *bitmapMask2Old;
        CBitmap bitmapMask3, *bitmapMask3Old;

        // DC 만드는 평범한...
        dcTemp.CreateCompatibleDC(dc);
        bitmapTemp.CreateCompatibleBitmap(dc, nW, nH);
        bitmapTempOld = dcTemp.SelectObject(&bitmapTemp);
       
        dcMask2.CreateCompatibleDC(dc);
        bitmapMask2.CreateBitmap(nW, nH, 1, 1, NULL);
        bitmapMask2Old = dcMask2.SelectObject(&bitmapMask2);
       
        dcMask3.CreateCompatibleDC(dc);
        bitmapMask3.CreateBitmap(nW, nH, 1, 1, NULL);
        bitmapMask3Old = dcMask3.SelectObject(&bitmapMask3);
       
        // 마스크 패턴 생성. 투명색 부분만 백색으로 나머지는 검은색으로
        COLORREF crOldBack = buffDC->SetBkColor(crTransparent);
        dcMask3.BitBlt(0, 0, nW, nH, buffDC, 0, 0, SRCCOPY);
        buffDC->SetBkColor(crOldBack);

        destDC->BitBlt(nX, nY, nW, nH, &dcMask3, 0, 0, SRCAND);

        dcMask3.PatBlt(0, 0, nW, nH, PATINVERT);

        dcTemp.BitBlt(0, 0, nW, nH, buffDC, 0, 0, SRCCOPY);
        dcTemp.BitBlt(0, 0, nW, nH, &dcMask3, 0, 0, SRCAND);

        destDC->BitBlt(nX, nY, nW, nH, &dcTemp, 0, 0, SRCPAINT);


        // 리소스 반환
        dcMask3.SelectObject(bitmapMask3Old);
        dcMask3.DeleteDC();
        bitmapMask3.DeleteObject();
       
        dcTemp.SelectObject(bitmapTempOld);
        dcTemp.DeleteDC();
        bitmapTemp.DeleteObject();
       
        dcMask2.SelectObject(bitmapMask2Old);
        dcMask2.DeleteDC();
        bitmapMask2.DeleteObject();
       
        ReleaseDC(dc);
}
2007/09/01 22:12 2007/09/01 22:12