123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- #include "stdafx.h"
- #include "BkDialogST.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #ifndef WM_NCLBUTTONDOWN
- #define WM_NCLBUTTONDOWN 0x00A1
- #define BKDLGST_DEFINES
- #endif
- CBkDialogST::CBkDialogST(CWnd* pParent )
- {
-
-
-
- Init();
- }
- CBkDialogST::CBkDialogST(UINT uResourceID, CWnd* pParent)
- : CDialog(uResourceID, pParent)
- {
- Init();
- }
- CBkDialogST::CBkDialogST(LPCTSTR pszResourceID, CWnd* pParent)
- : CDialog(pszResourceID, pParent)
- {
- Init();
- }
- CBkDialogST::~CBkDialogST()
- {
- FreeResources();
- }
- void CBkDialogST::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
-
-
-
- }
- BEGIN_MESSAGE_MAP(CBkDialogST, CDialog)
-
- ON_WM_ERASEBKGND()
- ON_WM_SIZE()
-
- ON_WM_LBUTTONDOWN()
- END_MESSAGE_MAP()
- void CBkDialogST::Init()
- {
- FreeResources(FALSE);
-
- m_byMode = BKDLGST_MODE_TILE;
-
- m_bEasyMoveMode = FALSE;
- }
- void CBkDialogST::FreeResources(BOOL bCheckForNULL)
- {
- if (bCheckForNULL == TRUE)
- {
-
- if (m_hBitmap) ::DeleteObject(m_hBitmap);
- #ifndef UNDER_CE
-
- if (m_hRegion)
- {
- ::SetWindowRgn(m_hWnd, NULL, FALSE);
- ::DeleteObject(m_hRegion);
- }
- #endif
- }
- m_hBitmap = NULL;
- #ifndef UNDER_CE
- m_hRegion = NULL;
- #endif
- m_dwWidth = 0;
- m_dwHeight = 0;
- }
- void CBkDialogST::OnLButtonDown(UINT nFlags, CPoint point)
- {
-
- if (m_bEasyMoveMode == TRUE)
- PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
-
- CDialog::OnLButtonDown(nFlags, point);
- }
- void CBkDialogST::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
-
-
- if (m_hBitmap != NULL)
- {
- Invalidate();
- }
- }
- BOOL CBkDialogST::OnEraseBkgnd(CDC* pDC)
- {
- CRect rWnd;
- int nX = 0;
- int nY = 0;
- BOOL bRetValue = CDialog::OnEraseBkgnd(pDC);
-
- if (m_hBitmap)
- {
- GetClientRect(rWnd);
- CDC dcMemoryDC;
- CBitmap bmpMemoryBitmap;
- CBitmap* pbmpOldMemoryBitmap = NULL;
- dcMemoryDC.CreateCompatibleDC(pDC);
- bmpMemoryBitmap.CreateCompatibleBitmap(pDC, rWnd.Width(), rWnd.Height());
- pbmpOldMemoryBitmap = (CBitmap*)dcMemoryDC.SelectObject(&bmpMemoryBitmap);
-
- dcMemoryDC.FillSolidRect(rWnd, pDC->GetBkColor());
- CDC dcTempDC;
- HBITMAP hbmpOldTempBitmap = NULL;
- dcTempDC.CreateCompatibleDC(pDC);
- hbmpOldTempBitmap = (HBITMAP)::SelectObject(dcTempDC.m_hDC, m_hBitmap);
- switch (m_byMode)
- {
- case BKDLGST_MODE_TILE:
-
- while (nY < rWnd.Height())
- {
- while(nX < rWnd.Width())
- {
- dcMemoryDC.BitBlt(nX, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- nX += m_dwWidth;
- }
- nX = 0;
- nY += m_dwHeight;
- }
- break;
- case BKDLGST_MODE_CENTER:
- nX = ((rWnd.Width() - m_dwWidth)/2);
- nY = ((rWnd.Height() - m_dwHeight)/2);
- dcMemoryDC.BitBlt(nX, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_STRETCH:
-
- dcMemoryDC.StretchBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcTempDC, 0, 0, m_dwWidth, m_dwHeight, SRCCOPY);
- break;
- case BKDLGST_MODE_TILETOP:
- while(nX < rWnd.Width())
- {
- dcMemoryDC.BitBlt(nX, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- nX += m_dwWidth;
- }
- break;
- case BKDLGST_MODE_TILEBOTTOM:
- while(nX < rWnd.Width())
- {
- dcMemoryDC.BitBlt(nX, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- nX += m_dwWidth;
- }
- break;
- case BKDLGST_MODE_TILELEFT:
- while (nY < rWnd.Height())
- {
- dcMemoryDC.BitBlt(0, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- nY += m_dwHeight;
- }
- break;
- case BKDLGST_MODE_TILERIGHT:
- while (nY < rWnd.Height())
- {
- dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- nY += m_dwHeight;
- }
- break;
- case BKDLGST_MODE_TOPLEFT:
- dcMemoryDC.BitBlt(0, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_TOPRIGHT:
- dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_TOPCENTER:
- nX = ((rWnd.Width() - m_dwWidth)/2);
- dcMemoryDC.BitBlt(nX, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_BOTTOMLEFT:
- dcMemoryDC.BitBlt(0, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_BOTTOMRIGHT:
- dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- case BKDLGST_MODE_BOTTOMCENTER:
- nX = ((rWnd.Width() - m_dwWidth)/2);
- dcMemoryDC.BitBlt(nX, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
- break;
- }
- pDC->BitBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcMemoryDC, 0, 0, SRCCOPY);
- OnPostEraseBkgnd(&dcMemoryDC);
- ::SelectObject(dcTempDC.m_hDC, hbmpOldTempBitmap);
- dcMemoryDC.SelectObject(pbmpOldMemoryBitmap);
- }
- return bRetValue;
- }
- void CBkDialogST::OnPostEraseBkgnd(CDC* pDC)
- {
- }
- #ifndef UNDER_CE
- HRGN CBkDialogST::ScanRegion(HBITMAP hBitmap, BYTE byTransR, BYTE byTransG, BYTE byTransB)
- {
-
- DWORD dwBmpWidth = 0, dwBmpHeight = 0;
-
- HRGN hRgn = NULL, hTmpRgn = NULL;
-
- LPBYTE lpbyPixels = Get24BitPixels(hBitmap, &dwBmpWidth, &dwBmpHeight);
- if (!lpbyPixels) return NULL;
-
- hRgn = ::CreateRectRgn(0, 0, dwBmpWidth, dwBmpHeight);
- if (!hRgn)
- {
- delete lpbyPixels;
- return NULL;
- }
-
-
-
- DWORD p=0;
- for (DWORD y=0; y<dwBmpHeight; y++)
- {
- for (DWORD x=0; x<dwBmpWidth; x++)
- {
- BYTE jRed = lpbyPixels[p+2];
- BYTE jGreen = lpbyPixels[p+1];
- BYTE jBlue = lpbyPixels[p+0];
- if (jRed == byTransR && jGreen == byTransG && jBlue == byTransB)
- {
-
- hTmpRgn = ::CreateRectRgn(x,y,x+1,y+1);
- ::CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR);
- ::DeleteObject(hTmpRgn);
- }
-
- p+=3;
- }
- }
-
- delete lpbyPixels;
-
- return hRgn;
- }
- #endif
- #ifndef UNDER_CE
- LPBYTE CBkDialogST::Get24BitPixels(HBITMAP hBitmap, LPDWORD lpdwWidth, LPDWORD lpdwHeight)
- {
-
- BITMAP bmpBmp;
-
- LPBITMAPINFO pbmiInfo;
-
- BITMAPINFO bmiInfo;
-
- DWORD dwBmpWidth = 0, dwBmpHeight = 0;
-
-
-
- ::GetObject(hBitmap, sizeof(bmpBmp),&bmpBmp);
- pbmiInfo = (LPBITMAPINFO)&bmpBmp;
-
- dwBmpWidth = (DWORD)pbmiInfo->bmiHeader.biWidth;
- dwBmpWidth -= (dwBmpWidth%4);
- dwBmpHeight = (DWORD)pbmiInfo->bmiHeader.biHeight;
-
- *lpdwWidth = dwBmpWidth;
- *lpdwHeight = dwBmpHeight;
-
-
- LPBYTE lpbyPixels = new BYTE[dwBmpWidth * dwBmpHeight * 3];
- if (!lpbyPixels) return NULL;
-
- HDC hDC = ::GetWindowDC(NULL);
-
- bmiInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmiInfo.bmiHeader.biWidth = dwBmpWidth;
- bmiInfo.bmiHeader.biHeight = 0 - (int)dwBmpHeight;
- bmiInfo.bmiHeader.biPlanes = 1;
- bmiInfo.bmiHeader.biBitCount = 24;
- bmiInfo.bmiHeader.biCompression = BI_RGB;
- bmiInfo.bmiHeader.biSizeImage = dwBmpWidth * dwBmpHeight * 3;
- bmiInfo.bmiHeader.biXPelsPerMeter = 0;
- bmiInfo.bmiHeader.biYPelsPerMeter = 0;
- bmiInfo.bmiHeader.biClrUsed = 0;
- bmiInfo.bmiHeader.biClrImportant = 0;
-
- int iRes = ::GetDIBits(hDC,hBitmap, 0, dwBmpHeight, (LPVOID)lpbyPixels, &bmiInfo, DIB_RGB_COLORS);
-
- ::ReleaseDC(NULL,hDC);
-
- if (!iRes)
- {
- delete lpbyPixels;
- return NULL;
- }
-
- return lpbyPixels;
- }
- #endif
- DWORD CBkDialogST::ActivateEasyMoveMode(BOOL bActivate)
- {
- m_bEasyMoveMode = bActivate;
- return BKDLGST_OK;
- }
- DWORD CBkDialogST::SetBitmap(int nBitmap, COLORREF crTransColor)
- {
- HBITMAP hBitmap = NULL;
- HINSTANCE hInstResource = NULL;
-
- hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmap), RT_BITMAP);
-
- hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmap), IMAGE_BITMAP, 0, 0, 0);
- return SetBitmap(hBitmap, crTransColor);
- }
- DWORD CBkDialogST::SetBitmap(HBITMAP hBitmap, COLORREF crTransColor)
- {
- int nRetValue;
- BITMAP csBitmapSize;
-
- FreeResources();
- if (hBitmap)
- {
- m_hBitmap = hBitmap;
-
- nRetValue = ::GetObject(hBitmap, sizeof(csBitmapSize), &csBitmapSize);
- if (nRetValue == 0)
- {
- FreeResources();
- return BKDLGST_INVALIDRESOURCE;
- }
- m_dwWidth = (DWORD)csBitmapSize.bmWidth;
- m_dwHeight = (DWORD)csBitmapSize.bmHeight;
- #ifndef UNDER_CE
-
- if (crTransColor != -1L)
- {
- m_hRegion = ScanRegion(m_hBitmap, GetRValue(crTransColor), GetGValue(crTransColor), GetBValue(crTransColor));
- if (m_hRegion == NULL)
- {
- FreeResources();
- return BKDLGST_FAILEDREGION;
- }
- ::SetWindowRgn(m_hWnd, m_hRegion, FALSE);
- }
- #endif
- }
- Invalidate();
- return BKDLGST_OK;
- }
- DWORD CBkDialogST::SetMode(BYTE byMode, BOOL bRepaint)
- {
- if (byMode >= BKDLGST_MAX_MODES) return BKDLGST_INVALIDMODE;
-
- m_byMode = byMode;
- if (bRepaint == TRUE) Invalidate();
- return BKDLGST_OK;
- }
- #ifndef UNDER_CE
- DWORD CBkDialogST::ShrinkToFit(BOOL bRepaint)
- {
- CRect rWnd;
- CRect rClient;
- DWORD dwDiffCX;
- DWORD dwDiffCY;
- GetWindowRect(&rWnd);
- GetClientRect(&rClient);
- dwDiffCX = rWnd.Width() - rClient.Width();
- dwDiffCY = rWnd.Height() - rClient.Height();
- m_byMode = BKDLGST_MODE_CENTER;
- MoveWindow(rWnd.left, rWnd.top, dwDiffCX + m_dwWidth, dwDiffCY + m_dwHeight, bRepaint);
- return BKDLGST_OK;
- }
- #endif
- #ifdef BKDLGST_DEFINES
- #undef BKDLGST_DEFINES
- #undef WM_NCLBUTTONDOWN
- #endif
|