JD2022-TU1/main/extern/Camcam/LIBS/Input/BWSR.cpp

390 lines
8.9 KiB
C++

#include <windows.h>
#include <winuser.h>
#include "SCENE.h"
#include "MEDIA.h"
#include "browser.h"
#define UPDATE_ONFOCUS 50
#define UPDATE_NOFOCUS 50
//#pragma optimize ("",off)
class BROWSER_Grabber:public INPUT_IO
{
public:
CWebBrowser *_WebBrowser;
RECT WR;
u32 IsFocused;
u32 LastUpDate;
WORLD *pWorld;
u32 RealDX,RealDY;
HWND TrackedWindow;
HDC hDCMem ;
HBITMAP hBmp ;
int INIT (class WORLD*){return 0;};
int FRAME (void);
int END (void)
{
delete _WebBrowser;
_WebBrowser = NULL;
return 0;
};
IOTYPE GetType() {return IOtype_BROWSER;};
void SendMouseInfo(s32 X,s32 Y,s32 Button);
};
typedef struct MyMessage_
{
UINT Msg;
LPARAM lParam;
WPARAM wParam;
s32 PX,PY;
} MyMessage;
typedef BOOL (_stdcall *tPrintWindow)( HWND, HDC,UINT);
tPrintWindow pPrintWindow =0;
static u32 Depth = 0;
BOOL CALLBACK myChildProc2(HWND hwnd, LPARAM lParam)
{
MyMessage *pmm;
if (Depth < 20)
{
Depth++;
EnumChildWindows(hwnd,myChildProc2,lParam);
Depth--;
}
pmm = (MyMessage *)lParam;
if (pmm->Msg)
{
extern BOOL GetWindowClientRect(HWND wnd, RECT *clientRect);
RECT ClienRect;
POINT CArea;
CArea.x = pmm->PX;
CArea.y = pmm->PY;
GetWindowClientRect(hwnd,&ClienRect);
if ((CArea.x > ClienRect.left) && (CArea.y > ClienRect.top) &&
(CArea.x < ClienRect.right) && (CArea.y < ClienRect.bottom))
{
if (pmm->lParam == -1)
{
ScreenToClient(hwnd,(POINT *)&CArea);
PostMessage(hwnd, pmm->Msg, pmm->wParam, MAKELONG(CArea.x, CArea.y));
pmm->Msg = 0;
return false;
}
}
if (pmm->lParam == 0)
SendMessage(hwnd, pmm->Msg, pmm->wParam, pmm->lParam);
}
return true;
}
BOOL CALLBACK myChildProc3(HWND hwnd, LPARAM lParam)
{
SetScrollPos( hwnd, SB_VERT, 0, true);
return true;
}
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
if (Depth < 3)
{
Depth++;
EnumChildWindows(hwnd,EnumChildProc,lParam);
Depth--;
}
if (lParam == 0)
{
//InvalidateRect( hwnd, NULL, TRUE) ;
//UpdateWindow( hwnd) ;
} else
{
/* InvalidateRect( hwnd, NULL, TRUE) ;
UpdateWindow( hwnd) ;//*/
SendMessage(hwnd, WM_PRINT, (WPARAM)lParam ,
PRF_CHILDREN +
PRF_CLIENT +
PRF_NONCLIENT+
PRF_ERASEBKGND +
//PRF_OWNED +
//PRF_CHECKVISIBLE +
0);//*/
}
return true;
}
int Update(BROWSER_Grabber *Ret,WORLD *pScene)
{
RECT WR2;
u32 Update = 0;
DWORD time = timeGetTime();
if (pPrintWindow == 0)
{
HINSTANCE handle = ::GetModuleHandle("user32.dll");
if ( handle == 0 )
handle = ::LoadLibrary("User32.dll");
if (handle)
pPrintWindow = (tPrintWindow)::GetProcAddress(handle,"PrintWindow");
}
//Account._WebBrowser->navigate("www.globulos.com");
if (Ret->TrackedWindow == NULL) return 0;
RECT MastRect;
GetWindowRect(Ret->TrackedWindow,&MastRect);
WR2 = MastRect;
WR2.right = WR2.right - WR2.left;
WR2.bottom = WR2.bottom - WR2.top;
if (pScene->OwnerHwnd == GetFocus())
Ret->IsFocused = 1;
else
Ret->IsFocused = 0;
if (Ret->IsFocused && (time - Ret->LastUpDate) > UPDATE_ONFOCUS)
Update = 1;
if (!Ret->IsFocused && (time - Ret->LastUpDate) > UPDATE_NOFOCUS)
Update = 1;
if (memcmp(&WR2,&Ret->WR,sizeof(RECT)) || Update)
{
Ret->LastUpDate = time;
Ret->WR = WR2;
Ret->Image.PITCH = Ret->Image.SX = Ret->RealDX;
Ret->Image.SY = Ret->RealDY;
if (Ret->Image.SetSize(Ret->WR.right, Ret->WR.bottom))
{
Ret->RealDX = Ret->Image.SX;
Ret->RealDY = Ret->Image.SY;
if (Ret->ulAssociatedTextureIndex != -1) pScene->DI->DestroyTexture(Ret->ulAssociatedTextureIndex);
Ret->ulAssociatedTextureIndex = -1;
if (Ret->hDCMem) DeleteObject(Ret->hDCMem);
if (Ret->hBmp) DeleteObject(Ret->hBmp);
Ret->hDCMem = NULL;
Ret->hBmp = NULL;
}
if (!Ret->hDCMem)
{
HDC hDC = GetDC(Ret->TrackedWindow);
Ret->hDCMem = CreateCompatibleDC(hDC);
Ret->hBmp = CreateCompatibleBitmap(hDC, GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES));
ReleaseDC(Ret->TrackedWindow, hDC);
}
HGDIOBJ hOld = SelectObject(Ret->hDCMem, Ret->hBmp);
bool res = false;
if (pPrintWindow)
{
res = pPrintWindow(Ret->TrackedWindow, Ret->hDCMem, 0);
}
if (!res)
{
EnumChildWindows(Ret->TrackedWindow,EnumChildProc,(WPARAM)Ret->hDCMem);
SendMessage(Ret->TrackedWindow, WM_PRINT, (WPARAM)Ret->hDCMem ,
PRF_CHILDREN +
PRF_CLIENT +
//PRF_NONCLIENT+
//PRF_ERASEBKGND +
//PRF_OWNED +
//PRF_CHECKVISIBLE +
0);//*/
}
BITMAPINFOHEADER bi;
memset(&bi, 0,sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Ret->Image.SX;
bi.biHeight = Ret->Image.SY;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
GetDIBits ( Ret->hDCMem, Ret->hBmp, 0,Ret->Image.SY, Ret->Image.GetBase(),(BITMAPINFO*)&bi, DIB_RGB_COLORS);
SelectObject(Ret->hDCMem, hOld );
static volatile u32 KK = 1;
if (KK)
{
if (Ret->hDCMem) DeleteObject(Ret->hDCMem);
Ret->hDCMem = NULL;
if (Ret->hBmp) DeleteObject(Ret->hBmp);
Ret->hBmp = NULL;
}
/* Sub Window Resize */
u32 Xb,Yb,Xs,Ys;
s32 *SRC,*SRCLast,*DST;
RECT CltRect;
POINT CArea;
GetClientRect(Ret->TrackedWindow, &CltRect);
CArea.x = 0;
CArea.y = 0;
ClientToScreen(Ret->TrackedWindow,(POINT *)&CArea);
Xs = CltRect.right - CltRect.left;
u32 Counter = Ys = CltRect.bottom - CltRect.top;
Xb = CArea.x - MastRect.left;
Yb = Ret->Image.SY - Ys - (CArea.y - MastRect.top) ;
if ((u32)((u32)Yb + (u32)Ys) >= (u32)Ret->Image.SY)
{
Yb = 0;
Counter = Ys = Ret->Image.SY;
}
if ((u32)Xb + (u32)Xs >= (u32)Ret->Image.SX)
{
Xb = 0;
Xs = Ret->Image.SX;
}
SRC = ((s32*)Ret->Image.GetBase()) + Xb + Yb * Ret->Image.PITCH;
DST = ((s32*)Ret->Image.GetBase());
while (Counter--)
{
SRCLast = SRC + Xs;
while (SRC<SRCLast)
{
*(DST++) = *(SRC++);
}
SRC += Ret->Image.PITCH - Xs;
}
Ret->Image.PITCH = Ret->Image.SX = Xs;
Ret->Image.SY = Ys;//*/
if (Ret->ulAssociatedTextureIndex == -1)
Ret->ulAssociatedTextureIndex = pScene->DI->CreateTexture(&Ret->Image,Ret->ulColorMode);
return 1;
}
return 0;
}
int BROWSER_Grabber::FRAME (void)
{
return Update(this,pWorld);
}
//SendInput
u32 BROWSER_MouseSend(INPUT_IO *pBRO,s32 MX,s32 MY,s32 MouseButton)
{
if (pBRO && (pBRO->GetType() == IOtype_BROWSER))
{
BROWSER_Grabber *pBrowser;
pBrowser = (BROWSER_Grabber*)pBRO;
if (pBrowser->TrackedWindow)
{
MyMessage mmm;
static u32 LastMB = 0;
POINT P;
HWND AcW = pBrowser->TrackedWindow;//Account._WebBrowser->GetActiveXWindow();
/* AcW = Account._WebBrowser->GetOwnWindow();
AcW = Account._WebBrowser->GetOwnWindow();*/
P.x = MX;
P.y = MY;
ClientToScreen(AcW,&P);
//AcW = WindowFromPoint(P);
// AcW = ChildWindowFromPoint(AcW,P);
char String[255];
GetWindowText(AcW, String, sizeof(String));
// SetCapture(pBrowser->pWorld->OwnerHwnd);
if ((MouseButton != 1) && (MouseButton != 0))
{
mmm.Msg = WM_VSCROLL;
mmm.wParam = MouseButton>0?SB_LINEUP:SB_LINEDOWN;
mmm.lParam = 0;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
} else
if (MouseButton /*&& (!LastMB)*/)
{
// SendMessage(AcW, WM_ACTIVATE, WA_ACTIVE , 0);
mmm.Msg = WM_LBUTTONDOWN;
mmm.wParam = MK_LBUTTON;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
/* } else
if (!MouseButton && LastMB)
{//*/
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
mmm.Msg = WM_LBUTTONUP;
mmm.wParam = MK_LBUTTON;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);//*/
} else
{
mmm.Msg = WM_MOUSEMOVE;
mmm.wParam = LastMB ? MK_LBUTTON : 0;
mmm.lParam = -1;
mmm.PX = P.x;
mmm.PY = P.y;
myChildProc2(AcW,(LPARAM)&mmm);
//EnumChildWindows(AcW,myChildProc2,(LPARAM)&mmm);
}//*/
LastMB = MouseButton;
}
}
return 0;
}
INPUT_IO *BROWSER_CREATE(WORLD *pScene,char *Filename)
{
u32 SX,SY;
INPUT_IO *Ret;
Ret = (INPUT_IO *)new(BROWSER_Grabber);
((BROWSER_Grabber*)Ret)->pWorld = pScene;
((BROWSER_Grabber*)Ret)->_WebBrowser = new CWebBrowser();
((BROWSER_Grabber*)Ret)->_WebBrowser->setPosAndSize(-512, -70, 512, 384);
((BROWSER_Grabber*)Ret)->_WebBrowser->init(pScene->OwnerHwnd, WS_VISIBLE);
if (strlen(Filename) > strlen("BROWSER"))
{
char Save;
Save = Filename[strlen(Filename) - strlen("BROWSER")];
Filename[strlen(Filename) - strlen("BROWSER")] = 0;
((BROWSER_Grabber*)Ret)->_WebBrowser->navigate(Filename);
Filename[strlen(Filename) - strlen("BROWSER")] = Save;
}
((BROWSER_Grabber*)Ret)->_WebBrowser->setVisible(true);
((BROWSER_Grabber*)Ret)->TrackedWindow = ((BROWSER_Grabber*)Ret)->_WebBrowser->GetActiveXWindow();
//pScene->SkipFunctions |= SKIP_TRACKER;
Ret->dTotalTime = 0;
Ret->dAvgFramePerSecond = 30.0;
Ret->ulAssociatedTextureIndex = -1;
Update((BROWSER_Grabber*)Ret,pScene);
return (INPUT_IO *)Ret;
};