vaps 源码修改记录2

vaps xt底层用的是opengl实现的,源码里面是用opengl直接绘制在窗口上,我尝试了一下把opengl绘制在内存兼容DC中,然后用gdi绘制在窗口中。结论是可以绘制出来,但是程序变的异常卡顿。

修改vxtPLWindowImpl.cpp文件

1. 将窗口DC修改为内存DC

在m_HDC = GetDC(m_HWND);后面添加下面代码

static HDC hdc = GetDC(m_HWND);
static HDC hdcMemory = CreateCompatibleDC(hdc);
static HBITMAP hBitmap = CreateCompatibleBitmap(hdc, m_Params.m_Width, m_Params.m_Height);
static HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMemory, hBitmap);
m_HDC = hdcMemory;

2. 修改opengl上下文的建立

static PIXELFORMATDESCRIPTOR s_PixelFormat =
{
	sizeof(PIXELFORMATDESCRIPTOR),
	1,
	PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SUPPORT_GDI,
	PFD_TYPE_RGBA,
	32,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	8,
	0,
	PFD_MAIN_PLANE,
	0,
	0,
	0,
	0
};

3. 在vEndDraw函数中来添加绘制代码

glReadBuffer(GL_FRONT); //这行没用,那不加就是不显示,实际这里只要调用任意的opengl函数都可以,原因不知道
StretchBlt(GetDC(m_HWND), 0, 0, m_Params.m_Width, m_Params.m_Height, m_HDC, 0, 0, m_Params.m_Width, m_Params.m_Height, SRCCOPY);

4. 最后在ONPAINT消息里调用下面函数即可实现窗口透明

HMODULE hUser32;
#define LWA_COLORKEY	0x00000001
#define LWA_ALPHA		0x00000002
#define WS_EX_LAYERED	0x00080000
void SetLayeredWindow(HWND *hWnd)
{
	typedef BOOL(WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
	lpfn g_pSetLayeredWindowAttributes;
	lpfn g_pSetLayeredWindowAttributes1;
	hUser32 = GetModuleHandle(TEXT("USER32.DLL"));
	g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");

	LONG lWindowLong = GetWindowLong(*hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
	::SetWindowLong(*hWnd, GWL_EXSTYLE, lWindowLong);


	g_pSetLayeredWindowAttributes(*hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
	
}

猜你喜欢

转载自blog.csdn.net/sukhoi27smk/article/details/80252289
今日推荐