当前位置: 首页 > news >正文

C/C++ 调用约定与 Windows GDI 位图操作实用解析

stdcall调用约定
stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK。

stdcall调用约定声明的语法为(以前文的那个函数为例):

int __stdcall function(int a,int b)

stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

以上述这个函数为例,参数b首先被压栈,然后是参数a

cdecl调用约定
cdecl调用约定又称为C调用约定,是C语言缺省的调用约定,它的定义语法是:

int function (int a ,int b) //不加修饰就是C调用约定
int __cdecl function(int a,int b)//明确指出C调用约定

在写本文时,出乎我的意料,发现cdecl调用约定的参数压栈顺序是和stdcall是一样的,参数首先由右向左压入堆栈。所不同的是,函数本身不清理堆栈,调用者负责清理堆栈。由于这种变化,C调用约定允许函数的参数的个数是不固定的,这也是C语言的一大特色。

GlobalUnlock函数解除锁定的内存块,使指向该内存块的指针无效,GlobalLock锁定的内存,一定要用GlobalUnlock解锁。

锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效。Windows为每个内存对象都维持着一个锁定计数。对这个函数的每次调用都应有一个对应的 GlobalUnlock 调用返回值Long,如成功,返回内存块的地址;如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。

一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下:>

FindDIBBits

取bmp灰度值FindDIBBits 是得到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); 得到指针后读取就可得到数据
// 得到各个灰度值
for (i = 0; i < m_lHeight; i ++)
{//m_lHeight为图像高
for (j = 0; j < m_lWidth; j ++)
{//m_lHeight为图像宽
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j; // // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(m_lWidth * 8);
// 计数加1
// m_lCount[*(lpSrc)]++;
}
}

DIBNumColors

//获取图象的颜色数 wNumColors=::DIBNumColors(lpDIB);

DIB,全称Device Independent Bitmap,设备无关位图文件,这是一种文件格式,其目的是为了保证用某个应用程序创建的位图图形可以被其它应用程序装载或显示一样。

paintdib函数显示DIB

AssertValid / Dump 知识解析

http://blog.sina.com.cn/s/blog_4add390001000alo.html

Invalidate

Invalidate()函数的作用是使整个窗口客户区无效,窗口客户无效即需要重绘,这时Window系统会发送一WM_PAINT消息放在应用程序的消息队列中,WM_PAINT消息的优先级很低,所以不会立即重绘。
如果需要立即重绘,那么就使用UpdateWindow( )函数,该函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

C++头文件中的#ifndef _MAC 的含义

http://zhidao.baidu.com/link?url=jOzE-8HSU5ZFNp1znfOAiLpwNHsATIHhLhLyChPxinM3s6tNesjabMpj7heOTYdIs8NF_9wSajGtqyqlpx-eJ_

DIB 读取bmp 及jpg图像是如何判断的?文件头?

http://blog.sina.com.cn/s/blog_549667a50100rukf.html

http://www.jsqmd.com/news/574556/

相关文章:

  • 从‘血流’到‘口型’:拆解斯坦福与英特尔背后那些让人拍案叫绝的Deepfake检测黑科技
  • Pixel Language Portal实操手册:自定义天空蓝主题(#e3f2fd)与金币黄按钮配置
  • 【UE5】- LinuxArm64打包实战:从像素流插件依赖到预编译配置的完整排错指南
  • ISOLAR-B系统配置实战:如何将DBC文件信号正确映射到SWC Port(CAN网络示例)
  • 高通平台实战:手把手教你解析和修改CDT中的board-id(附常见报错排查)
  • 2026河北灌浆料采购指南:五大服务商深度测评与组合选型策略 - 2026年企业推荐榜
  • Claude Code + GLM 4.7 终极配置指南:从零搭建到实战开发(含MCP功能解锁)
  • Qwen3.5-9B部署教程:Docker Compose编排+Redis会话状态管理
  • JAVA重点基础、进阶知识及易错点总结(13)File 类 + 路径操作
  • KOReader 2025.04:跨平台电子书阅读器的架构演进与性能突破
  • 亚马逊Buy for Me代购服务全流程实测:从下单到收货的完整避坑手册
  • 阅读记录(2026年4月)
  • DataX 3.0实战:如何用阿里开源工具搞定MySQL到Hive的数据同步(附避坑指南)
  • 通义千问3-VL-Reranker-8B入门指南:小白也能轻松玩转多模态重排序
  • 从404到无损输出:一个Favicon抓取API的三年优化笔记(含CDN、懒加载避坑指南)
  • 2026市面上评价高的次氯酸钠发生器品牌怎么选?看这,一体化净水器/二氧化氯发生器,次氯酸钠发生器供货厂家推荐分析 - 品牌推荐师
  • 阿里云OSS文件上传那些坑:一个苍穹外卖项目中的真实调试案例
  • OpenClaw+千问3.5-9B智能监控:24小时网站异常检测
  • 阿里通义Z-Image-GGUF实测:8GB显存流畅运行,小白也能画出惊艳作品
  • YOLOv8与YOLOv11网络结构对比:从yolov8.yaml到yolo11.yaml的演进与优化
  • 深度学习环境管理指南:如何在一台电脑上安装并切换多个CUDA版本(以CUDA 11.6和12.0为例)
  • Serverless时代Java开发者必学的3种函数封装范式:POJO/Function/Consumer,第2种正在被淘汰!
  • 别再只会接VCC和GND了!HC-SR501人体红外传感器的触发模式、延时和灵敏度到底怎么调?
  • Leather Dress Collection效果展示:Leather Leather Bandeau Cargo Pants机能口袋结构特写
  • GLM-OCR效果展示:94.6分SOTA模型,实测识别发票、合同、论文效果惊艳
  • AMD显卡玩转AI绘画:RX 5600XT安装秋叶SD整合包保姆级避坑指南(HIP+ZLUDA)
  • Typora风格文档化:使用Markdown实时记录PyTorch 2.8实验过程
  • 像素剧本圣殿参数详解:ScriptGen LoRA适配器与8-Bit UI协同机制
  • 实战演练:基于快马平台与opencv,从零构建车牌识别系统
  • 南北阁Nanbeige 4.1-3B企业级应用:软件测试用例的自动化生成与评审