2013年8月27日星期一(DEMO7-19窗口的裁剪等)

2023-11-03

OK,现在马不停蹄,结束这个第7章,拖延的时间真长,有6个月了,汗。。。

这个是上次的应用,加上逻辑判断如何画点,并用GetWindowRect()是客户区,实际上这不对,应该是GetClientRect(),果然不对,只能是说把图画上了。

 

代码如下

     DDSURFACEDESC2     ddsd;

     RECT          client;

     GetWindowRect( main_window_handle, & client );

     DDRAW_INIT_STRUCT( ddsd );

     lpddsprimary->Lock( NULL, & ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL );

     UCHAR         *    primary_buffer         = ( UCHAR * ) ddsd.lpSurface;

     if( pixel_format == 32 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              DWORD    color              = _RGB32BIT( 0, rand() % 256, rand() % 256, rand() % 256 );

              * ( ( DWORD * ) ( primary_buffer + x * 4 + y * ddsd.lPitch ) ) = color;

         }

     }

     else

     if( pixel_format == 24 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

        

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[0] =  rand() % 256 ;

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[1] =  rand() % 256 ;

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[2] =  rand() % 256 ;

         }

     }

     else

     if( pixel_format == 16 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              USHORT   color              = _RGB32BIT( 0, rand() % 256, rand() % 256, rand() % 256 );

              * ( ( USHORT * ) ( primary_buffer + x * 4 + y * ddsd.lPitch ) ) = color;

         }

     }

     else

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              UCHAR    color              =  rand() % 256;

              primary_buffer[x  + y * ddsd.lPitch] = color;

         }

     }

     lpddsprimary->Unlock( NULL );

     Sleep( 1 );

 

 

结果如下图所示

但是当封装后,

 

     DDSURFACEDESC2     ddsd;

     RECT          client;

     GetWindowRect( main_window_handle, & client );

     DDRAW_INIT_STRUCT( ddsd );

     ddraw->getPrimarySurface()->Lock( NULL, & ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL );

     UCHAR         *    primary_buffer         = ( UCHAR * ) ddsd.lpSurface;

     if( ddraw->getPixelFormat() == 32 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              DWORD    color              = _RGB32BIT( 0, rand() % 256, rand() % 256, rand() % 256 );

              * ( ( DWORD * ) ( primary_buffer + x * 4 + y * ddsd.lPitch ) ) = color;

         }

     }

     else

     if( ddraw->getPixelFormat() == 24 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

        

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[0] =  rand() % 256 ;

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[1] =  rand() % 256 ;

              ( ( primary_buffer + x * 3 + y * ddsd.lPitch ) )[2] =  rand() % 256 ;

         }

     }

     else

     if( ddraw->getPixelFormat() == 16 )

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              USHORT   color              = _RGB32BIT( 0, rand() % 256, rand() % 256, rand() % 256 );

              * ( ( USHORT * ) ( primary_buffer + x * 4 + y * ddsd.lPitch ) ) = color;

         }

     }

     else

     {

         for( int index = 0; index < 10; index ++ )

         {

              int      x                  = rand() % ( client.right - client.left ) + client.left;

              int      y                  = rand() % ( client.bottom - client.top ) + client.top;

              UCHAR    color              =  rand() % 256;

              primary_buffer[x  + y * ddsd.lPitch] = color;

         }

     }

     ddraw->getPrimarySurface()->Unlock( NULL );

     Sleep( 1 );

 

 

8位模式时却不对,只占了左侧一部分。

 

但是改为全屏,却是可以的,邪门了

 

接下来,就是查找实际的客户区,或许与这个有关系。

这里在T3DCONSOLE2中的main()函数里面了。

加上以下代码后,窗口根本显示不出来了,废了,

     if( WINDOWED_APP )

     {

         RECT window_rect                      = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};

         AdjustWindowRectEx( & window_rect, GetWindowStyle( main_window_handle ), GetMenu( main_window_handle ) != NULL,

              GetWindowExStyle( main_window_handle ) );

 

//       window_client_x0                     = -window_rect.left;

//       window_client_y0                     = -window_rect.top;

 

         MoveWindow( main_window_handle, CW_USEDEFAULT, CW_USEDEFAULT, window_rect.right - window_rect.left,

              window_rect.bottom - window_rect.top, TRUE );

 

         ShowWindow( main_window_handle, SW_SHOW );

     }

 

加了个窗口的裁剪器 LPDIRECTDRAWCLIPPER              m_lpddclipperwin;

 

     if( m_bWindowed == true )

     {

         m_lpdd->CreateClipper( 0, & m_lpddclipperwin, NULL );

         m_lpddclipperwin->SetHWnd( 0, m_hWnd );

         m_lpddsprimary->SetClipper( m_lpddclipperwin );

 

     }

终于OK了,因为书上的代码不对,而光盘上的代码才是正确的

 

正确代码如下:

 

// resize the window so that client is really width x height

if (WINDOWED_APP)

{

// now resize the window, so the client area is the actual size requested

// since there may be borders and controls if this is going to be a windowed app

// if the app is not windowed then it won't matter

RECT window_rect = {0,0,WINDOW_WIDTH-1,WINDOW_HEIGHT-1};

 

 

// make the call to adjust window_rect

AdjustWindowRectEx(&window_rect,

     GetWindowStyle(main_window_handle),

     GetMenu(main_window_handle) != NULL,

     GetWindowExStyle(main_window_handle));

 

// save the global client offsets, they are needed in DDraw_Flip()

window_client_x0 = -window_rect.left;

window_client_y0 = -window_rect.top;

 

// now resize the window with a call to MoveWindow()

MoveWindow(main_window_handle,

           0, // x position

           0, // y position

           window_rect.right - window_rect.left, // width

           window_rect.bottom - window_rect.top, // height

           FALSE);

 

// show the window, so there's no garbage on first render

ShowWindow(main_window_handle, SW_SHOW);

} // end if windowed

 

不禁感慨,窗口确实要小心测试。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2013年8月27日星期一(DEMO7-19窗口的裁剪等) 的相关文章

  • 【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 详细文章 1 概述 诸如美国全球定位系统 GPS
  • xml入门

    什么是 XML XML 即可扩展标记语言 Extensible Markup Language 是一种平台无关的表示数据的方法 简单地说 使用 XML 创建的数据可以被任何应用程序在任何平台上读取 甚至可以通过手动编码来编辑和创建 XML
  • python爬虫需要学哪些东西_Python爬虫需要学习那些东西?

    一个教程让你学会爬虫 Python爬虫实战8天速成 验证码识别 数据解析 Scrapy框架 实战案例 2020全套 哔哩哔哩 干杯 bilibili www bilibili com 学Python爬虫需要学习的八个知识点 1 HTML H
  • 最新dns大全

    公共DNS服务器IP地址大全 名称 各省公共DNS服务器IP大全 114 DNS 114 114 114 114 114 114 115 115 阿里 AliDNS 223 5 5 5 223 6 6 6 百度 BaiduDNS 180 7
  • wincap问题之一(丢包)

    最近开发一个项目 发现wincap会有丢包现象 与wincap的具体应用是这样的 一个接收线程 采用pcap loop接收网络中的数据包 一个发送线程 采用pcap sendqueue transmit的方式发送数据包 pcap loop接
  • 重新赋能Web3域名,Dmail让ESN域名不再单一

    Dmail独特的NFT账号不仅提供了全新的概念 还为用户提供了参与平台上各种信息和资产服务的权利 以及体验Web3 0时代各种应用的可能性 一般来说 NFT域账户除了基本的应用之外 还具有三个有价值的方面 即收集投资 奖励赎回和一般身份 首
  • 数据结构-顺序表(c++)含全代码

    顺序表的原理及实现 文章目录 前言 一 顺序表是什么 二 创建顺序表 三 顺序表的初始化及销毁 1 顺序表的初始化 2 顺序表的销毁 四 顺序表的基本操作 1 顺序表的添加元素 2 顺序表的插入元素 3 顺序表的删除元素 4 打印顺序表的元

随机推荐

  • error: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities

    Store update insert or delete statement affected an unexpected number of rows 0 Entities may have been modified or delet
  • 计算机中数的存储形式(原码,反码,补码的表示)

    原码 反码和补码知识点 1 原码 10进制转换成2进制是原码 只不过正数的原码是本身符号位为0 负数的原码符号位为1 例 单字节的1 10进制1的原码是0000 0001 10进制 1的原码是1000 0001 2 反码 正数的反码是它本身
  • Ueditor设置默认字体、字号、行间距,添加字体种类

    Ueditor默认字体 字号 行间距的修改 ueditor默认字号是16号 默认字体为sans serif 默认行间距为5px 如下图所示 首先 修改ueditor all js文件中如上图红框中对应的字体 字号 行间距的值 其次 uedi
  • 查询三方jar包漏洞

    安全检测的时候一般会对第三方的jar包扫描 下面的地址可以根据artifactId 或者漏洞查询相应的不同版本漏洞 然后自己做相应的处理 一般都是升级包 或者直接用功能类似的包替换 避免重大事故 nvd漏洞查询
  • MySQL数据库——数据库和表的基本操作(一)

    目录 第1关 查看表结构与修改表名 一 本关任务 修改表名 并能顺利查询到修改后表的结构 查看数据表基本结构 查看数据表详细结构 修改表名 二 编程要求 三 预期输出 四 代码 第2关 修改字段名与字段数据类型 一 本关任务 修改表中的字段
  • 2020牛客暑期多校训练营(第八场)E Enigmatic Partition —— 找规律,差分上差分,有丶东西

    This way 题意 定义合法序列 n a1 a2 am m的大小是你自己构造的 m gt 3 并且满足以下条件 定义f n 为构造n的合法序列的情况数 然后每次问你n为l r中所有数的f的和是多少 题解 其实就相当于要预处理每个数有多少
  • Windows使用串口API函数串口编程

    Windows使用串口API函数串口编程 前言 1 打开串口 1 1 参数详解 1 2 代码示例 1 2 1 获取串口号 1 2 2 打开串口 同步通信 1 2 3 打开串口 异步通信 2 关闭串口 3 配置串口 3 1 配置输入输出缓冲区
  • 20230705

  • python将生成的数据按类别以不同颜色作散点图

    遇事不决 可问春风 春风不语 即随本心 文章目录 文章目录 前言 一 实例 1 读取数据 2 创建空数组 3 数据处理 4 绘制散点图 总结 前言 我们在处理分类问题时 经常需要用图表的形式将数据表现出来 这样会更直观的了解分类效果 一 实
  • nodejs的加密方式

    nodejs的加密方式 一 加密算法 为了保证数据的安全性和防篡改 很多数据在传输中都进行了加密 加密可分为三大类 对称加密 非对称加密 摘要算法 二 对称加密 采用单钥密码系统的加密方法 同一个密钥可以同时作用信息的加密和解密 该方法称为
  • C++中使用tuple

    本文讨论的是在C 11标准下使用tuple 而不是python语言 说到tuple 肯定会第一时间想到python语言 但tuple也不仅仅只在python中有 在C C 等语言中都有这样的数据结构 在C 中的tuple和python语言中
  • 解决VS无法识别手动创建的app.manifest文件的问题

    解决VS无法识别手动创建的app manifest文件的问题 解决方案 删除手动添加的app manifest文件 修改项目属性使项目自动添加app manifest文件 操作流程 1 选择当前项目 单击鼠标右键 选择 属性 2 在 属性
  • 语言小型心形图案代码_C语言写一个小程序,胖胖的爱心桃

    学了这么久的C语言 你是不是有很多会写的小玩意了呢 比如说简单的五角星 三角形 等腰三角形 心形之类的 笔者今天发现了个以前写的一个很好玩的小程序分享给大家 画心的C语言 include
  • python 对二维列表的排序

    例如 这样的列表 对它进行排序 第一种 使用lambda对列表中的数据进行排序 如果不懂lambda的可以去百度哦 有很多详细内容 按数字排序 mylist 张三 0 3 李四 0 4 王五 0 8 谢大脚 0 9 谢广坤 0 1 myli
  • edp和edt哪个好_香水edp和edt的区别

    在香水瓶子上 通常会看到edp和edt的标志 它们的具体区别如下 1 含义不同 E D P是Eau de Parfum的缩写 意思是淡香精 而E D T是Eau de Toilette的缩写 意思是淡香水 2 香精浓度不同 E D P的纯香
  • 以图搜图算法java_龙猫数据爬图新姿势:以图搜图

    如果说购物网站近两年有什么新变化 除了商品类别增多以外 以图搜图功能绝对算很重要的一个 看到自己喜欢的东西根本不用问具体信息 随手一拍马上就能在购物网站找同款 识别率相当高 真是方便又快捷 今天我们就来介绍下 这么好用的生产力工具是如何 进
  • Hiredis_API说明

    转 https blog csdn net xumaojun article details 51597468 同步的API接口 redisContext redisConnect const char ip int port void r
  • Qt信号与槽的Connect详解

    QT通过connect关联信号和槽函数 一 槽函数的执行是同步还是异步 在同一个线程中 Qt信号槽的执行是同步的 当一个信号被发射时 槽函数会立即被调用 而不是被放入事件队列中 这是因为在同一个线程中 事件循环和槽函数都是在同一个线程中执行
  • MySQL——索引

    文章目录 1 简介 2 索引的分类 2 1 主键索引 PRIMARy KEY 2 2 唯一索引 UNIQUE KEY 2 3 常规索引 KEY INDEX 2 4 全文索引 FullText 3 测试索引 3 1 创建100万条数据 3 2
  • 2013年8月27日星期一(DEMO7-19窗口的裁剪等)

    OK 现在马不停蹄 结束这个第7章 拖延的时间真长 有6个月了 汗 这个是上次的应用 加上逻辑判断如何画点 并用GetWindowRect 是客户区 实际上这不对 应该是GetClientRect 果然不对 只能是说把图画上了 代码如下 D