我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片形式绘制图片,但是我创建的插件仅绘制第一个插件实例。如果我打开插件的多个实例,它会继续绘制与每张图片重叠的第一个插件窗口。FireBreath插件不会在所有插件实例上绘制
我使用的是opengl从URL中绘制图片。
以下是使用线程其中提请虚设的OpenGL tringles在一个循环中一个代码:
FB :: PluginWindowWin * pluginWindowWin = dynamic_cast的(pluginWindow);
EnableOpenGL(pluginWindowWin->getHWND(), &hDC, &hRC);
SetFocus(pluginWindowWin->getHWND());
//FB::
static int fps = 1;
GLfloat rotate = 0;
static double start = 0, diff, wait;
wait = 1/fps;
//return 0;
while (true)
{
//lets check for keyboard input
try
{
FB::Rect pos = pluginWindow->getWindowPosition();
PAINTSTRUCT ps;
if (pluginWindowWin){
hDC = BeginPaint(pluginWindowWin->getHWND(), &ps);
pos.right -= pos.left;
pos.left = 0;
pos.bottom -= pos.top;
pos.top = 0;
rotate += 0.1f;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(rotate, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
glEnd();
glBegin(GL_QUADS); // Draw A Quad
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f); // Top Left
glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f); // Top Right
glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f); // Bottom Right
glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f); // Bottom Left
glEnd(); // Done Drawing The Quad
glPopMatrix();
glRotatef(rotate, 0.0f, 1.0f, 0.0f);
SwapBuffers(hDC);
}
//rtri+=0.1f;
::SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
LPCTSTR pszText = _T("FireBreath Plugin!\n:-)");
::TextOut(hDC, pos.left + (pos.right - pos.left)/2, pos.top + (pos.bottom - pos.top)/2, pszText, lstrlen(pszText));
if (pluginWindowWin) {
// Release the device context
EndPaint(pluginWindowWin->getHWND(), &ps);
}
}
catch (...)
{
return 0;
}
Sleep(10);
}//end of while run
我在做什么错在这里?
什么浏览器(s)你见过这种情况?你是在开窗还是无窗模式? (我假设有窗口,但如果不是这是个大问题)。你是否为插件的每个实例启动线程的新实例?每个线程都有自己的数据,包括它自己的插件hwnd实例吗?您是否意识到SetFocus调用(如果它执行了任何操作)只会在开始时调用一次,而不会再次调用每个窗口,这意味着只有最后一个调用仍然有焦点? – taxilian
这发生在Firefox和IE上,我只使用窗口模式。另外每个插件实例都有自己的线程和数据。 关于SetFocus我刚刚使用了opengl示例插件中的代码来复制我正在面对的问题以及我的原始实现,删除SetFocus并没有在输出中产生任何影响。 –
你可以添加hDC和hRC的定义吗?我认为这些不共享? – taxilian