Directx11教程(21) 修正程序最小化异常bug

      很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了。经过调试,原来程序最小化时候,屏幕的高度和宽度为0,此时创建深度缓冲会fail,所以在D3DClass.cpp的初始化函数中加入以下的代码,可以防止最小化时候程序异常。

D3DClass.cpp增加代码:

//Initialize函数包含完成D3D设置的所有代码。
bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hwnd, bool fullscreen,
    float screenDepth, float screenNear)

{

//如果屏幕高度或者宽度为0,则会创建深度缓冲失败,
//当窗口最小化时候,会出现窗口为0的情况。
if(screenWidth < 1)
    screenWidth = 1;
if(screenHeight <1)
    screenHeight = 1;

// 初始化交换链描述
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

// 用1个后缓冲
swapChainDesc.BufferCount = 1;

//帧缓冲的大小和应用程序窗口大小相等.
swapChainDesc.BufferDesc.Width = screenWidth;
swapChainDesc.BufferDesc.Height = screenHeight;

// 后缓冲的surface的格式为DXGI_FORMAT_R8G8B8A8_UNORM.
// surface的每个像素用4个无符号的8bit[映射到0-1]来表示。NORM表示归一化。
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

// 如果使用垂直同步,设置后缓冲的刷新率。.
//刷新率就是一秒钟把后缓冲内容在屏幕上画出的次数。
//如果开启垂直同步,则锁定刷新率,则fps是固定的
if(m_vsync_enabled)
    {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = numerator;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = denominator;
    }
else
    {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    }

}

时间: 2024-12-25 18:02:30

Directx11教程(21) 修正程序最小化异常bug的相关文章

关于C#程序最小化之后与正常状态运行结果不一至,求教

问题描述 程序为验证导入的用户密码和密码是否正确(C#程序webBrowser+timer控件)程序正常状态为模拟输入用户名密码并模拟点击页面上现有提交按钮提交到目标网址验证问题是如果程序最小化了或者是用户操作别的软件那么验证就会失败(用户和密码是正确的)没有提示用户名和密码错误之类的消息程序也无异常抛.经过测试已经确定程序在最小化之后模拟输入用户名密码点击提交按钮没有问题.希望有经验朋友的帮助下如果有好的建议或意见大家一些交流下我的QQ85353838 解决方案 解决方案二:如何确定验证失败以

怎么让程序最小化时不在任务栏上显示,而在左下角显示

问题描述 怎么让程序最小化时不在任务栏上显示,而在左下角显示 解决方案 解决方案二:窗体中有个属性:ShowInTaskbar,设定为false,就不会在任务栏中出现了解决方案三:是右下角吧有现成的控件啊好像是什么No开头的呵呵自己看看吧解决方案四:窗体隐藏起来,有个叫hide的方法.小图标那个是叫什么T..Ico的控件解决方案五:添加NotifyIcon控件,然后重载OnSizeChangedprotectedoverridevoidOnSizeChanged(EventArgse){base

C# winform程序怎样将程序最小化到系统托盘?

这样最简单! 1.在form中添加一个NotifyIcon控件 2.把icon.ico这个图标放在/bin/Debug目录下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MinimizeForm

c#中程序最小化到托盘

拖一个 notifyIcon控件到界面,名为 notifyIcon1           //窗体对应的事件         #region Form1_SizeChanged         private void Form1_SizeChanged(object sender, EventArgs e)         {             if (this.WindowState == FormWindowState.Minimized) //判断是否最小化            

C#程序最小化到托盘图标操作步骤与实现代码_C#教程

复制代码 代码如下: // this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged); //上面一行是主窗体InitializeComponent()方法中需要添加的引用 private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState==FormWindowState.Minimized) { this.Hide();

VC中使程序最小化到系统托盘区

//定义托盘图标结构体 NOTIFYICONDATA nid; #define WM_ICONNOTIFY WM_USER + 909 //图标响应消息(lParam) #define ID_TASKBARICON 100 //参数(wParam) //初始化系统托盘图标 void OnBtnMinimize() { //初始化系统托盘图标 nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = m_hWnd;; nid.uID = ID_TASKBARI

【转】Android开发,按手机上的back键时程序最小化而不退出

@Override public boolean dispatchKeyEvent(KeyEvent event) { // menuUtils.createTwoDispatcher(event); if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN"); intent.addCateg

C#编写最小化到系统托盘的Windows应用程序

window|程序 事情是这样,为了自己使用方便,就顺手写了一个看网络电视的程序.程序最小化到系统托盘中,这样在看网络电视的时候,就可以随时打开,随时切换,比较方便,呵呵. 以前在Visual C++编程环境里,编写一个这样的系统托盘程序,应该说比较复杂,还要自己添加消息处理函数.而在C#中,这一切就变得非常的容易了.下面是简单步骤. 为程序添加两个主要控件,NotifyIcon控件和ContextMenu控件: 为ContextMenu设置Menu菜单和相应菜单的Click事件: 为控件Not

怎么让最小化的程序重新正常显示?

问题描述 程序最小化了到系统托盘,双击托盘如何再让它再显示在前端?谢谢 解决方案 解决方案二:顶顶~~继续求助解决方案三:privatevoidnotifyIcon1_MouseDoubleClick(objectsender,MouseEventArgse){if(this.WindowState==FormWindowState.Minimized){WindowState=FormWindowState.Normal;//this.ShowInTaskbar=true;}}