我用vc建了个多文档应用程序,想用两个菜单项控制显示用OpenGL渲染的图.
点击第一个菜单项,程序正常显示了渲染图.
可再点击第二个菜单项的时候,第一个的视图就空了,只有第二个菜单项对应的渲染图.
我也用了两个dc分别对应不同的hrc,不知是什么原因还是这样.

解决方案 »

  1.   

    两个窗口都要做OpenGL初始化操作.
      

  2.   

       我现在是这样初使化的,这样对吗? 
        PIXELFORMATDESCRIPTOR pfd;
        int         n;
        my_pDC2 = new CPaintDC(this);    ASSERT(my_pDC2 != NULL);    if (!mypixelformat())
            return;
        n =::GetPixelFormat(my_pDC2->GetSafeHdc());
        ::DescribePixelFormat(my_pDC2->GetSafeHdc(), n, sizeof(pfd), &pfd);
        hrc2 = wglCreateContext(my_pDC2->GetSafeHdc());
        wglMakeCurrent(my_pDC2->GetSafeHdc(), hrc2);    glClearDepth(1.0f);
        glEnable(GL_DEPTH_TEST);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
      

  3.   

    任何时候你想要从渲染一个窗口转到渲染另一个窗口,你需要重新调用wglMakeCurrent
      

  4.   

    已解决,确实是没有用wglMakeCurrent
    非常感谢!
      

  5.   


    #include <stdio.h>
    #include <windows.h>
    //#include "Setupapi.h"
    //#include "objbase.h"
    #include <setupapi.h>
    #pragma comment(lib,"setupapi.lib")
    void EnumDevices(HDEVINFO hDevInfo)
    {
     SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
     LPOLESTR guid;
     char devName[128];
     char instanceId[128];
     for (int i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
     {
      StringFromCLSID(DeviceInfoData.ClassGuid,&guid);
      SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid,devName,128,NULL);
      if(!strcmp(devName,"Net"))
      {
      SetupDiGetDeviceInstanceId(hDevInfo,&DeviceInfoData,instanceId,128,NULL);
      if(!strncmp(instanceId,"PCI",3))
      {
      // wprintf(L"%s\n",guid);
      printf("%s\n",devName);
      printf("%s\n",instanceId);
      SP_PROPCHANGE_PARAMS params = {sizeof(SP_CLASSINSTALL_HEADER )};
      params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
      params.Scope = DICS_FLAG_CONFIGSPECIFIC;
      params.StateChange = DICS_ENABLE; //禁用:DICS_DISABLE,DICS_ENABLE启用
    // params.StateChange = DICS_DISABLE; //禁用:DICS_DISABLE,DICS_ENABLE启用
      params.HwProfile = 0;
      SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)&params, sizeof(SP_PROPCHANGE_PARAMS));
      SetupDiChangeState(hDevInfo, &DeviceInfoData);
      }
      }
      CoTaskMemFree(guid);
     }
    }
    int main(int argc, char* argv[])
    {
     HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
     hDevInfo = SetupDiGetClassDevs(NULL,NULL,NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
     if(INVALID_HANDLE_VALUE == hDevInfo)
      return GetLastError();  
     EnumDevices(hDevInfo);
     SetupDiDestroyDeviceInfoList(hDevInfo);
     return 0;
    }
      

  6.   

    这个没法用了,原来是windows上的
      

  7.   

    这个没法用了,原来是windows上的
      

  8.   

    这个没法用了,原来是windows上的