我做的一个SDI程序要求能修改程序亮度,原来我用的是直接修改程序的各种颜色,模拟亮度的变化。但是前一段时间我看到了一个演示程序,它修改的是显示器的亮度,也就是说,当你运行程序的时候,切换出来到windows桌面,桌面的亮度也变了。我不会用,那位高手能帮忙,最好有例子,谢谢。
(我找了一些资料,好像叫做调整gamma亮度,不知道是不是这样)

解决方案 »

  1.   

    这里有个例子,重新设置Gamma ramp,将所有的R(Red)值设置为0:  HDC hDC = ::GetDC(NULL);
      if (!hDC)
        return E_FAIL;  WORD RamdacTable[3*256];  GetDeviceGammaRamp(hDC, RamdacTable);  for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 256; ++j)
          if ( i == 0)
            RamdacTable[i] = 0;
          else
            RamdacTable[i*256+j] = j*256;  if(!SetDeviceGammaRamp( hDC, RamdacTable))
      {
        BOOL bReason = GetLastError();
        ::MessageBox(NULL, "SetDeviceGampRamp failed!", "Error", NULL);
      }
      ::ReleaseDC(NULL, hDC);
      

  2.   

    if (!hDC)
       return E_FAIL;
    不知道有什么用。还有,程序运行后没有反应。我要怎么办?各位大侠帮忙,谢谢
      

  3.   

    if(!hDC)
       return E_FAIL;
    在你的程序中改成失败返回就可以了。上面的例子出自:
    http://vip.6to23.com/mays/develop/directx/200111/GammaCalibrator.htm
      

  4.   

    去http://202.112.105.179/vc看看
    并查查msdn上的SetDeviceGammaRamp()。
      

  5.   

    To dycdyc123(重出江湖);
    你觉得能用API实现吗,请多指教,谢谢。
      

  6.   

    我的试了,不行!我对IMB的显示器2115!
    显卡是Trident 9750 4MB!
      

  7.   

    我公司有一个(不是自己开发的)程序,其中用到了一个功能是可以改变显示器的设置,我试过了,好用。显示器为acer,驱动为“即插即用”,显卡为TNT2 M64 32M显存。
    还有,现在的大多数显卡都有“彩色校正”功能,打开方法为显示属性-〉设置-〉高级-〉彩色校正。
    这个东西不会是涉及到驱动程序吧,要是那样就麻烦了。
      

  8.   

    终于取得了一些进展,pcman1990(pcman) 给出的例子应该说是对的。
    问题在于RamdacTable里面的值需要满足一定的关系,否者的话系统不会执行SetDeviceGammaRamp函数,这一点我不知道怎么解决,谁能帮我,谢谢。
      

  9.   

    http://vip.6to23.com/mays/develop/directx/200111/GammaCalibrator.htm
      

  10.   

    客户程序必须支持DirectDraw,才能调用calibrator。
      1)首先,创建一个Direct3D object  LPDIRECT3D8 g_pD3D;
      g_pD3D = ::Direct3DCreate8(D3D_SDK_VERSION)  2)获得当前显示模式  D3DDISPLAYMODE d3ddm;
      g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)  3)创建Direct3D device  LPDIRECT3DDEVICE8 g_pd3dDevice = NULL;
      g_pD3D->CreateDevice(
          D3DADAPTER_DEFAULT,
          D3DDEVTYPE_HAL,
          hWnd,
          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
          &d3dpp,
          &g_pd3dDevice
      )  4)检测设备是否支持Gamma Calibration  D3DCAPS8 d3dcap;
      if( FAILED( g_pd3dDevice->GetDeviceCaps( &d3dcap ) ) )
      {
        ::MessageBox(NULL, "GetDeviceCaps", "Failed", NULL);
        return E_FAIL;
      }
      if( !( d3dcap.Caps2 & D3DCAPS2_CANCALIBRATEGAMMA ) )
      {
        ::MessageBox(NULL, "Your machine doesn't support gamma Calibrator", "Warnning", NULL);
        return E_FAIL; 
      }  5)设置Gamma ramp  D3DGAMMARAMP d3dgamaramp;
      ... // 初始化d3dgamaramp  // 设置gamma ramp,同时请求Calibration
      g_pd3dDevice->SetGammaRamp( D3DSGR_CALIBRATE , &d3dgamaramp);