19,468
社区成员
发帖
与我相关
我的任务
分享
void CGLEdit::DrawEdit()
{
glColor3f(0, 0, 0);
static BITMAP bmp = GetBmp(L"B.bmp");
static GLuint texid;
glGenTextures(1, &texid);
glBindTexture(GL_TEXTURE_2D, texid);
glTexImage2D(GL_TEXTURE_2D, 0, 3, bmp.bmWidth, bmp.bmHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bmp.bmBits);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);//这个注释了或者改成GL_REPLACE也没用
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glBindTexture(GL_TEXTURE_2D, texid);
glColor4f(1, 1, 1, 1);
glBegin(GL_QUADS);
glNormal3d(0.0,0.0,1.0);
glTexCoord2d(0.0, 0.0); glVertex3d(-HalfPanelWidth,-HalfPanelWidth, 0.0);
glTexCoord2d(1.0, 0.0); glVertex3d( HalfPanelWidth,-HalfPanelWidth, 0.0);
glTexCoord2d(1.0, 1.0); glVertex3d( HalfPanelWidth, HalfPanelWidth, 0.0);
glTexCoord2d(0.0, 1.0); glVertex3d(-HalfPanelWidth, HalfPanelWidth, 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glColor4f(0, 0, 1, 1);
glBegin(GL_QUADS);//为了测试环境,画了一个蓝色的方块
glNormal3d(0.0,0.0,1.0);
glVertex3d(-HalfPanelWidth/2.0,-HalfPanelWidth/2.0, 0.1); //HalfPanelWidth和HalfPanelWidth是绘图区的半长和半宽
glVertex3d( HalfPanelWidth/2.0,-HalfPanelWidth/2.0, 0.1);
glVertex3d( HalfPanelWidth/2.0, HalfPanelWidth/2.0, 0.1);
glVertex3d(-HalfPanelWidth/2.0, HalfPanelWidth/2.0, 0.1);
glEnd();
}
BITMAP CGLEdit::GetBmp(LPCTSTR title)
{
static HBITMAP hbmp = 0;
hbmp = (HBITMAP)::LoadImage(GetModuleHandle(0), title, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
static BITMAP bmp = { 0 };
GetObject(hbmp, sizeof(BITMAP), &bmp);
return bmp;
}
BITMAPINFOHEADER BIH;
HDC pdcDIB;
HBITMAP hbmpDIB;
void CGLStatic::CreateDIB()
{
CRect rect;
GetClientRect(&rect);
int iSize = sizeof(BITMAPINFOHEADER);
memset(&BIH, 0, iSize);
BIH.biSize = iSize;
BIH.biWidth = (LONG)(rect.Width());
BIH.biHeight = (LONG)(rect.Height());
BIH.biPlanes = 1;
BIH.biBitCount = 24;
BIH.biCompression = BI_RGB;
pdcDIB = CreateCompatibleDC(NULL);
assert(pdcDIB);
hbmpDIB = CreateDIBSection(
pdcDIB,
(BITMAPINFO*)&BIH,
DIB_RGB_COLORS,
&bmp_cnt,
NULL,
0);
assert(hbmpDIB);
assert(bmp_cnt);
if(hbmpDIB)
SelectObject(pdcDIB, hbmpDIB);
}
wglMakeCurrent(pdcDIB, m_hGLContext);
////////.......................
BitBlt(hDC, 0, 0,rect.width(),rect.height,pdcDIB, 0, 0, SRCCOPY);
void CGLEdit::DrawBck()
{
////////////////////////将背景传到内存dc上
CGLPanel* ParentPanel=(CGLPanel*)this->GetParent();
HDC ParentHDC=ParentPanel->pdcDIB;
CRect rect1;
GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1);
HDC hDCMem = ::CreateCompatibleDC(ParentHDC);
int DIBDim=NearestPowerOfTwo((int)(2.0*HalfPanelWidth), (int)(2.0*HalfPanelHeight));
//这里要解释一下,因为我发现即使我的opengl版本很高了,可纹理尺寸依然要为2的幂次方才能正常显示
//所以这里就先检测子控件的尺寸,HalfPanelWidth和HalfPanelHeight分别为子控件的半宽和半高,
//然后返回一个比子控件尺寸大的,最小的一个2的幂次方作为抠图的尺寸DIBDim,作为纹理尺寸
HBITMAP hBitMap = ::CreateCompatibleBitmap(ParentHDC, DIBDim,DIBDim);
HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);
BitBlt(hDCMem, 0, 0, DIBDim, DIBDim, ParentHDC,
rect1.CenterPoint().x-DIBDim/2, rect1.CenterPoint().y-DIBDim/2, SRCCOPY);
//这里将扩大的尺寸换到子控件坐标下
BITMAP bmp;
GetObject(hBitMap,sizeof(bmp),&bmp);
//通过内存bitmap句柄获取位图信息
//////////////////////////////////////////////////开始opengl作图,和普通读取bmp文件做纹理一样
// Create one OpenGL texture
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture (GL_TEXTURE_2D,textureID);
gluBuild2DMipmaps(GL_TEXTURE_2D,4, bmp.bmWidth,
bmp.bmHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE,bmp.bmBits);
//glTexImage2D(GL_TEXTURE_2D, 0, 4, bmp.bmWidth, bmp.bmHeight,
// 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, bmp.bmBits);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);//一定要为GL_NEAREST,否则像素颜色会和背景有差别
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
::SelectObject(hDCMem, hOldMap); //释放临时资源
::DeleteObject(hBitMap);
::DeleteObject(hOldMap);
::DeleteDC(hDCMem);
glEnable(GL_TEXTURE_2D);
glDisable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColor4f(1, 1, 1, 1);
GLdouble BckWH=(GLdouble)DIBDim*0.5;//贴纹理
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex3d(-BckWH,-BckWH, 0.0);
glTexCoord2d(1.0, 0.0); glVertex3d( BckWH,-BckWH, 0.0);
glTexCoord2d(1.0, 1.0); glVertex3d( BckWH, BckWH, 0.0);
glTexCoord2d(0.0, 1.0); glVertex3d(-BckWH, BckWH, 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glEnable(GL_LIGHT0);
}
gluBuild2DMipmaps(GL_TEXTURE_2D,4, bmp.bmWidth, bmp.bmHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE,bmp.bmBits);