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); }