复习win32-温故而知新

AI生成电路图实测:从自然语言到PCB的工程实践与边界 在电子工程领域,AI电路生成正成为硬件设计自动化的新范式。其核心原理是将自然语言需求翻译为结构化网表,再通过EDA工具渲染为原理图,技术价值在于大幅压缩从想法到原理图草稿的时间。典型应用场景包括MCU开发板、电源电路和接口电路的快速原型设计。然而,AI在器件选型、去耦电容配置和高速布线等环节仍存在明显边界。本文基于多款主流AI硬件设计工具的实测,深入剖析从自然语言到完整PCB的可行路径与工程陷阱,为硬件工程师提供可落地的参考。 阅读详情

一、窗口的创建

分五步:

1、设计(对图标之类的各种东西进行初始化)

2、注册(调用函数RegisterClassEx())

3、创建(调用函数CreateWindow())

4、显示(调用函数ShowWindow())

5、消息循环(主要部分)

附窗口创建的代码:

#include<windows.h>

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
HBRUSH hBrush = ::CreateSolidBrush(RGB(255,255,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}
//删除画刷
::DeleteObject(hBrush);
return 0;
}

二、插入位图

几个关于DC的概念

//HDC 相当于绘图板,DC里面一定要有一张图片
//窗口DC     GetDc(hwnd); ReleaseDC(); //窗口DC已经包含一张位图
//兼容性DC   CreateCompatibleDC(dc); DeleteDC() //创建的兼容性DC没有位图

//贴图片(拷贝位图) 一定需要两个DC,一个叫目标,一个叫源

贴图写到消息处理函数的重绘里面

附代码:

#include<windows.h>
#include “resource.h”

HINSTANCE hins;

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT: //重绘
{
//目标DC
HDC dc = ::GetDC(hWnd);
//源DC
HDC hMemDC = ::CreateCompatibleDC(dc);
//加载位图
HBITMAP hBitmap1 = ::LoadBitmap(hins,MAKEINTRESOURCE(IDB_BITMAP1));
HBITMAP hBitmap2 = ::LoadBitmap(hins,MAKEINTRESOURCE(IDB_BITMAP2));
//选入位图
::SelectObject(hMemDC,hBitmap1);
::BitBlt(dc,0,0,48,48,hMemDC,0,0,SRCAND); //白色背景

::SelectObject(hMemDC,hBitmap2);
::BitBlt(dc,0,0,48,48,hMemDC,0,0,SRCPAINT); //黑色背景

::DeleteObject(hBitmap2);
::DeleteObject(hBitmap1);
::DeleteDC(hMemDC);
::ReleaseDC(hWnd,dc);
}
break;
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
hins = hinstance;
HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}
//删除画刷
::DeleteObject(hBrush);
return 0;
}

三、gdi+

消除了贴bmp要黑白两种图型的麻烦,可以直接贴透明png图片,也可以贴bmp图片

代码如下

#include<windows.h>
#include<gdiplus.h> //Gdi+头文件
using namespace Gdiplus; //Gdi+命名空间
using namespace std;

#pragma comment(lib,”gdiplus.lib”)

HINSTANCE hins;

float nAngle = 10;

//窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:

break;

case WM_TIMER: //定时器发送的消息
if (nAngle == 360)
nAngle = 0;
else
nAngle+=10;
//旋转图片
{
HDC dc = ::GetDC(hWnd);
//========================================================
//定义 图形对象
Graphics graphics(dc);
//加载图片
Image image(L”bitmap1.bmp”);
//获取图片的宽度和高度
int nWeight = image.GetWidth();
int nHeight = image.GetHeight();
//设置旋转的中心点
graphics.TranslateTransform(float(nWeight/2),float(nHeight/2)); //设置旋转的中心点
//旋转
graphics.RotateTransform(nAngle);
graphics.DrawImage(&image,-(nWeight/2),-(nHeight/2),nWeight,nHeight);
//========================================================
::ReleaseDC(hWnd,dc);
}
break;
case WM_CREATE: //窗口创建的时候发送 初始化的过程
::SetTimer(hWnd,1,100,NULL); //启动定时器
break;
case WM_CLOSE: //点x 窗口关闭的消息
::PostQuitMessage(0); //发送推出的消息
break;
}
return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int CALLBACK WinMain(HINSTANCE hinstance,
HINSTANCE hPrelnstance,
LPSTR pCmdLine,
int nCmdShow)
{
//—————————-开始gdi+—————————————————
ULONG_PTR ulToken;
GdiplusStartupInput gdiplusStartupInput;
::GdiplusStartup(&ulToken,&gdiplusStartupInput,NULL);
hins = hinstance;

HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));
//1、设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //是否要分配额外的空间
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = hBrush; //背景颜色
wndclass.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HELP)); //光标
wndclass.hIcon = NULL; //窗口图标
wndclass.hIconSm = NULL; //窗口左上小图标
wndclass.hInstance = hinstance; //当前实例的句柄
wndclass.lpfnWndProc = WndProc; //消息处理函数
wndclass.lpszClassName = “-_-“; //注册窗口类的名字
wndclass.lpszMenuName = NULL; //菜单名
wndclass.style = CS_HREDRAW|CS_VREDRAW; //窗口类的样式

//2、注册
if(::RegisterClassEx(&wndclass) == FALSE)
{
::MessageBox(NULL,”注册失败”,”提示”,MB_OK);
return 0;
}

//3、创建
HWND hWnd = ::CreateWindow(“-_-“,”哒哒哒”,WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hinstance,NULL);
if(hWnd == NULL)
{
::MessageBox(NULL,”创建失败”,”提示”,MB_OK);
}
//4、显示
::ShowWindow(hWnd,SW_SHOW);
//5、消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
//翻译
::TranslateMessage(&msg);
//分发
::DispatchMessageA(&msg);
}

//删除画刷
::DeleteObject(hBrush);

//——————————关闭gdi+———————————————–
::GdiplusShutdown(ulToken);
return 0;
}

C# Stream深度解析:流封装链、资源生命周期与异步IO陷阱 Stream是.NET中承载I/O行为的核心抽象,其本质并非简单数据管道,而是一套严格的状态机契约,涵盖可读性、可写性、寻址能力及资源释放语义。理解CanSeek、Length、Dispose等成员的真实行为边界,是规避ObjectDisposedException、性能骤降与数据损坏的关键。尤其在多层封装场景(如CryptoStream+GZipStream+FileStream)下,缓冲策略错配、Dispose级联阻塞、Length语义混淆等问题集中爆发。本文聚焦C#流处理的工程真相,结合异步IO原理、 阅读详情

相关推荐

C# Stream资源契约与高性能IO实践指南

Stream是.NET中对操作系统句柄和托管内存的统一资源抽象,其核心并非数据流动,而是生命周期管理、线程安全边界与超时控制等底层契约。理解CanRead/CanWrite语义、Dispose即释放句柄、缓冲区与所有权关系,是避免ObjectDisposedException、CPU飙高和内存泄漏的关键。结合FileStream异步标志、MemoryStream零拷贝陷阱、NetworkStream粘包与超时机制,可构建健壮IO链路。在高性能场景下,BufferedStream缓冲调优、PipeReader

diaojin6880的博客 391

WNDCLASS和WNDCLASSEX

typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HB...

308

C# Stream底层原理与高并发I/O实战避坑指南

Stream是.NET中抽象字节流传输的核心接口,其本质并非数据容器,而是描述数据在时间维度上有序传递的过程性契约。理解Read/Write/Seek等方法的语义、CanRead/CanWrite的运行时能力声明特性、Position与Length的坐标系差异,是规避I/O阻塞、内存泄漏和跨平台异常的基础。技术价值体现在对同步/异步I/O机制(如IOCP、epoll)、Dispose资源归属逻辑、包装流责任链及缓冲区管理(ArrayPool、Span<byte>)的精准掌控。典型应用场景包括大文件流式解析、

世范水晶 513

WIN32复习和学习笔记!

去年四月份到的实验室,开始研究生生活。因为是跨专业,所以相当于零基础。然后在网上搞到了一套共享的视频,开始学习C语言,C++,Linux高级编程。大约在去年十一月份的时候,开始学习WIN32编程。去年到现在已经把WIN32,MFC,COM等等学习完毕了。然后最近一个月看的是《windows核心编程》,感觉看的很痛苦。很多地方看不懂,但是我估计看第二遍的时候会好很多。所以也就是个阵痛,咬咬牙,挺一挺

学峰的学习笔记 645

C# Stream底层契约与高并发I/O实战解析

Stream是.NET中I/O操作的核心抽象,其本质并非数据管道,而是一组运行时能力契约(CanRead/CanWrite/CanSeek等),直接影响异步行为、资源释放和跨平台兼容性。理解其状态机语义、Dispose与Close的差异、缓冲区管理策略及CancellationToken穿透机制,是构建高吞吐、低延迟、抗压型流式系统的前提。尤其在文件上传、日志分析、实时音视频转发等场景中,错误假设Stream可Seek或忽略BufferedStream.Flush缺失,极易引发数据丢失与超时雪崩。本文聚焦S

unixboy 559

大数据面试题(附答案,持续更新...)

说说对hadoop的理解,都有哪些组件,分别是干什么的 还了解大数据其他组件嘛? kafka在什么地方需要用到zookeeper 了解HBase吗? 说下spark中的transform和action 为什么spark要把操作分为transform和action spark中有了RDD,为什么还要有Dataframe和DataSet? 了解函数式编程吗?说下c/c++和scala这种函数式编程语...

xiaozhaoshigedasb的博客 9947

复习MFC之绘图-温故而知新

一、画矩形框 在视图(view)类里面的重绘(ondraw)添加 win32版: HDC dc = ::GetDC(this-&gt;m_hWnd); ::Rectangle(dc,0,0,100,100); ::ReleaseDC(this-&gt;m_hWnd,dc); MFC版: CDC *pDC = this-&gt;GetDC(); pDC-&gt;Rectangle(0...

fa1lr4in的小博客 254

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3324

win32GDI函数BitBlt

今天又充电了。 平时输出文字一般都是用textout或者drawtext。而今天遇到绘制绘图的问题,但是这个不能顾名思义的说直接在客户区draw就可以了,win32有特俗的处理方法。 要在一个设备环境中绘制位图,我们不能直接话,按msdn里面的说法,我们要创建一个与当前设备环境相兼容的另一个设备环境;将位图选入新创建的设备环境后,再调用bitblt函数来显示位图,bitblt就实现了将位图...

weixin_34290390的博客 227

神经符号AI架构解析:如何通过V&V提升AI系统可信性

在人工智能领域,深度学习模型因其强大的模式识别能力而广泛应用,但其内部决策过程往往如同“黑盒”,难以追溯和解释,这给系统验证与确认带来了巨大挑战。验证与确认是确保复杂软件系统安全、可靠、符合预期的基石,其中验证关注“是否正确地构建了产品”,确认则关注“是否构建了正确的产品”。神经符号人工智能作为一种新兴范式,通过融合符号逻辑的透明推理与深度学习的强大感知,为解决这一难题提供了关键技术路径。它使得AI系统既能从数据中学习复杂模式,又能依据可形式化检验的规则进行逻辑推理,从而在自动驾驶、医疗诊断等高可靠性应用场

weixin_28681379的博客 356

思科模拟器实战:MQTT协议实现物联网设备通信全流程解析

本文详细解析了如何在思科模拟器中利用MQTT协议实现物联网设备通信的全流程。通过搭建网络拓扑、配置MQTT Broker与客户端,并编写发布/订阅逻辑,手把手指导读者完成一个“开关控制电灯”的经典物联网场景实验,帮助零成本掌握物联网通信核心。

weixin_29294975的博客 381

SWT总结-基础和布局管理器

最近复习了一下SWT的基本知识,也看了不少书上的例子,总体感觉东西不难,但是零碎的东西很多,不容易记住。比如说布局管理器知识,它是任何一个图形界面设计不可或缺的基础知识,因此,我也就详细的对这块做了一个整理,总结,还针对各个布局管理器做了个demo。因此,我就写这篇博文,一来是对自己学过的知识重新梳理一下,做到温故而知新,二来是将重要的东西记录下来,留着以后查看。首先了解一下SWT的基础知识。1. 如何安装SWTSWT开始流行始于Eclipse的流行,可以从Eclipse SWT官方首页(http://ww

Gavin's Note Book 2231

【git】git: ‘interpret-trailers’ is not a git command. See ‘git --help’

cents 7.6系统. yum源安装git最新版本是1.8.3 报错: git: 'interpret-trailers' is not a git command. See 'git --help'. cannot insert change-id line in .git/COMMIT_EDITMSG 解决: git add xxx git commit -m "xxx" 然后修改 vim .git/hooks/commit-msg #if test -n "${reviewurl}" ; th

machh的专栏 4758

C# Stream底层原理与高性能实践:从I/O契约到内存优化

Stream是.NET中统一字节流操作的核心抽象,其设计融合了同步/异步I/O契约、状态一致性保障与零成本性能抽象。作为所有文件、网络、内存等字节流的基类,它通过23个虚方法定义可读写、可寻址、可缓冲的行为边界,并直接影响吞吐量、GC压力与线程调度。理解CanSeek、Position语义、ReadAsync生命周期及buffer管理,是避免大文件上传超时、句柄泄漏与内存溢出的关键。本文深入剖析FileStream、MemoryStream、BufferedStream等典型实现的协作机制,结合CopyTo

diaoqi6581的博客 377

金砖大赛-第二届网络安全防护治理实战技能大赛全国总决赛WP

格式进行md4加密,然后将小写的md4密文进行作为flag信息进行提交,提交格式为flag{MD4小写},例如调用频率异常高的user_id是user_xxx,使用的非公开模型名称是model-name,具体调用次数为10,那么按照格式,对user_xxx:model-name:10进行md4加密后,提交范例为:flag{dd00cb9e393f4a9ac639294b3cfe4d6a}挖矿木马是通过远程脚本进行部署的,请登录到失陷的服务器上,找到并分析挖矿木马是从那个远程IP下载的。

Laffrey的专栏 239

用 ABAP CDS Table Function 把复杂计算下沉到 SAP HANA:从定义到 AMDP 实战与 Clean Core 落地

摘要 CDS table function 是 SAP S/4HANA 开发中的关键工具,它允许在 ABAP CDS 中调用由 HANA 原生执行的函数逻辑,并以表形式返回结果集。其核心价值在于:弥补 CDS 表达式不足,将复杂计算(如排序、分组、币种换算等)安全地推送到数据库层执行,同时保持 CDS 的可组合性。实现方式是通过 AMDP 框架,在 ABAP 类中编写 SQLScript 代码。使用时需注意参数设计应区分业务语义与过滤条件,并严格遵守 client-safe 原则以避免跨客户端数据泄露风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1002

C# Stream 深度解析:从字节契约到高并发I/O实战

Stream 是 .NET 中最基础也最易被误用的 I/O 抽象,它并非简单数据管道,而是一套强制的状态机契约,涵盖 CanRead/CanWrite/CanSeek 的状态声明、Length/Position 的隐式同步机制,以及 Read/Write/Seek 的状态迁移语义。其设计深刻影响同步阻塞与异步回调的线程模型绑定,决定 ASP.NET Core 高并发下的吞吐能力;缓冲策略(如 BufferedStream)需权衡系统调用频次与内存风险;而 CancellationToken 在 FileSt

世范水晶 466

2026年高教社杯数学建模国赛A题解题思路:从物理方程推导到MATLAB高效求解的全流程实战指南

□所有代码能够从头运行到尾,不报错(清除workspace重新跑一遍)□论文中的每个图号、表号、公式编号与正文引用一致□附录中附上核心代码(注意:不是全部代码,而是关键求解器和后处理部分)□支撑材料压缩包包含完整代码、数据文件、README说明□摘要字数严格控制在1000字以内,突出创新点和核心结果□。

YOLO 110

SSH出现Access Denied解决方法

/etc/ssh/sshd_config中 1、PermitRootLogin由no改为yes 2、AllowUsers root 最后 service ssh restart

fa1lr4in的小博客 8792

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hiberfil.sys和swapfile.sys文件的删除

hiberfil.sys的删除方法:管理员打开cmd,然后: powercfg -h off swapfile.sys的删除方法:高级系统设置->高级->性能->设置->高级->虚拟内存->更改->取消打勾(自动管理所有驱动器的分页文件大小)->无分页文件->设置->确定xN ...

fa1lr4in的小博客 5669

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

操作系统知识盘点(五)(内存管理方式以及其他)

25、非连续分配管理方式 (1)基本分页存储管理方式 在分区存储管理中,要把作业放在一个连续的存储区中,因而会产生碎片问题(外部碎片)。尽管通过拼接方式可以解决碎片问题,但代价较高。如果允许将一个作业存放到许多不相邻接的分区中,那么就可以避免拼接,,从而有效解决外部碎片问题。基于这一思想引入了分页存储管理(或称页式存储管理)技术 1)分页管理 在分页存储管理中,用户作业的地址空间被划分称若...

fa1lr4in的小博客 4999

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

snort学习以及规则编写

一、结构 CIDF模型(Common Intrusion Detection Framework): 包含事 件生成器(event generator:E-boxes),分析引擎(analysis engines:A-boxes),存储机制(storage mechanisms:D-boxes),以及响应模块(countermeasures:C-boxes) SNORT数据流 snort ...

fa1lr4in的小博客 3136

解决wine中文乱码问题

一、在http://www.font5.com.cn/font_download.php?id=150&part=1237886897下载simsun.ttc字体 二、将simsun.ttc拷贝到linux机器上 三、 vi zh.reg 将下面的内容拷贝到zh.reg中 REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\Win...

fa1lr4in的小博客 3115
上一篇: kali安装后要做的事情
下一篇: 复习MFC之消息-温故而知新
fa1lr4in
博客等级 码龄9年 64粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值