用VC++制作变形窗体

Halcon印刷检测实战:从算法原理到工业部署全解析 机器视觉是工业自动化的核心技术,通过图像采集与处理实现对生产过程的智能监控。其核心原理在于利用相机、镜头和光源获取目标图像,再通过图像处理算法提取特征、识别缺陷或读取信息,最终实现自动化检测与分类。这项技术的价值在于替代人眼,实现高精度、高速度、无疲劳的24小时在线检测,大幅提升生产效率和产品质量。在工业领域,机器视觉广泛应用于定位引导、尺寸测量、缺陷检测和字符识别等场景。其中,印刷品质量检测是典型的应用之一,涉及字符、条码的读取验证以及图案、色彩的完整性检查。本文以工业级视觉库Halcon为例,深入剖析其 阅读详情
用VC++制作变形窗体

首先,我们要建立一个基于对话框的工程distort,这样生成了三个类,即CAboutDlg , CDistort , CDistortDlg ,我们将要进行大改动的是CDistortDlg类,因此我们给出此文件的原代码,有改动的地方 我们用粉色字表出,并加人注释。

// distortDlg.h : header file
//

#if !defined(AFX_DISTORTDLG_H__B21CDC69_5A48_11D7_A464_00055DE445C1__INCLUDED_)
#define AFX_DISTORTDLG_H__B21CDC69_5A48_11D7_A464_00055DE445C1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif
// _MSC_VER > 1000


// CDistortDlg dialog

class CDistortDlg : public CDialog
{
// Construction
public:
CDistortDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
{{AFX_DATA(CDistortDlg)

enum { IDD = IDD_DISTORT_DIALOG };
// NOTE: the ClassWizard will add data members here
}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDistortDlg)

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CDistortDlg)

virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
}}AFX_MSG


//重载 WM_NCTHITEST 消息,单激对话框任何部位都可移动对话框
afx_msg UINT OnNcHitTest(CPoint point);
//定时器,使窗体可以变形
afx_msg void OnTimer(UINT nIDEEvent);
//在撤销对话框时关闭定时器
afx_msg void OnDestroy();
DECLARE_MESSAGE_MAP()

private:

//窗体初始的矩形对象
CRect m_rectWnd;
//设置窗体所在区域
CRgn m_rgn;

};

{{AFX_INSERT_LOCATION}}

#endif // !defined(AFX_DISTORTDLG_H__B21CDC69_5A48_11D7_A464_00055DE445C1
__INCLUDED_)

下一步,我们先将对话框的属性中的stype设为popup ,而Border设为none,如图:


在此类的实现文件中,我们就将系统自动生成的函数略去了,只写出有改动的地方

// distortDlg.cpp : implementation file
//

#include "stdafx.h"
#include "distort.h"
#include "distortDlg.h"

#if def _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

///////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
//略去系统自动生成的类成员
......
//此处为消息宏映射
BEGIN_MESSAGE_MAP(CDistortDlg, CDialog)
{{AFX_MSG_MAP(CDistortDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()

ON_WM_NCHITTEST()
ON_WM_TIMER()
}}AFX_MSG_MAP
END_MESSAGE_MAP()
//下面我们将要加入对话框程序一般都要重载的虚函数 OnInitDiolog(),它是消息响应函数,处理 //WM_INITDIALOG 消息


#define EVENT_REDRAW 0

BOOL CDistortDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
//获得对话框客户区的尺寸
GetClientRect(m_rectWnd);
//创建窗体对话框客户区的尺寸
m_rgn.CreateEllipticRgn(0,0,m_rectWnd.right,m_rectWnd.bottom);
//设置重画窗口定时器,每0.1秒重绘一次 SetWindowRgn((HRGN)m_rgn,TRUE);
this->SetTimer(EVENT_REDRAW,100,NULL);

//-------------------------set time----------------------------
return TRUE;
// return TRUE unless you set the focus to a control

其中椭圆效果是通过 int SetWindowRgn(HRGN hRgn,BOOL bRedraw);
而参数 hRgn 是窗体区的句柄, 参数 bRedraw 是决定是否要重画窗体,在本例中Windows 向窗体发送 WM_PAINT消息,从而调用 OnPaint()函数,
下面我们来修改此函数

void CDistortDlg::OnPaint()
{
CPaintDC dc(this);
if (IsIconic())
{
// device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//add by myself---------------------------------------------------
dc.SelectStockObject(NULL_PEN);//绘制不带边的椭圆

//获得客户区的尺寸
CRect rect;
GetClientRect(rect);

CBrush *pBrushOld;
CBrush brushNew;

//定义画刷,在此你可以更改颜色
brushNew.CreateSolidBrush(RGB(204,255,66));
//选取画刷作为画图设备
pBrushOld=dc.SelectObject(&brushNew);
//绘制椭圆
dc.Ellipse(rect);
//还原画刷,并释放
dc.SelectObject(pBrushOld);
brushNew.DeleteObject();
}
}

//下面编写实现窗体任意托动的函数

HCURSOR CDistortDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

UINT CDistortDlg::OnNcHitTest(CPoint point)
{
UINT nHitTest=CDialog::OnNcHitTest(point);
return(nHitTest==HTCLIENT)?HTCAPTION:nHitTest;
}

//下面编写定时器实数

//若想结果n次变化后正好便为圆形,则设此值为 1.035
#define MULTI 1.1

void CDistortDlg::OnTimer(UINT nIDEvent)
{
static nCount=0;//窗体变化次数,每次增1
static bOrder=1;//表示变大或变小
static double dMulti=1;//窗体的变化倍数

CRect rectWnd;
CPoint ptMiddle,ptTopLeft,ptBtmRight;

//确定窗体区域中心
ptMiddle=m_rectWnd.CenterPoint();

//分情况处理各种定时事件
switch(nIDEvent)
{
case EVENT_REDRAW:
nCount++;
if(bOrder==1)
{//表示变大
dMulti*=MULTI;
}
else
{//表示变小
dMulti/=MULTI;
}

//确定窗体的矩形大小
ptTopLeft.x=(long)(ptMiddle.x-m_rectWnd.Width()/(2*dMulti));
ptTopLeft.y=(long)(ptMiddle.y-m_rectWnd.Height()/2);
ptBtmRight.x=(long)(ptMiddle.x+m_rectWnd.Width()/(2*dMulti));
ptBtmRight.y=(long)(ptMiddle.y+m_rectWnd.Height()/2);
rectWnd.SetRect(ptTopLeft,ptBtmRight);

//释放对象
m_rgn.Detach();

//创建椭圆区域
m_rgn.CreateEllipticRgn(ptTopLeft.x,ptTopLeft.y,ptBtmRight.x,ptBtmRight.y);

SetWindowRgn((HRGN)m_rgn,TRUE);

if(nCount==10)//设置变化次数,此为10次
{
nCount=0;
bOrder=(bOrder==1)?-1:1;//10次之后反向变化
}
break;
}
CDialog::OnTimer(nIDEvent);
}

最后的效果如图:

希望大家通过对本例的实践,初步了解 MFC 的对话框机制 (细节请参见《Vicual c++ 高级编程》)
MFC桌面端3D饼图控件源码:支持鼠标拖拽旋转、滚轮缩放、键盘微调视角 这是一个基于MFC框架开发的可嵌入式3D饼图C++可视化组件,专为传统Windows桌面应用设计。运行后可直接通过鼠标左键拖拽旋转饼图视角,滚轮控制缩放距离,方向键进行精细的角度微调。每个扇区颜色、文字标签、数值百分比均可编程设置,数据结构更新后图形自动实时重绘,无需手动刷新。工程包含完整Visual Studio解决方案(PieChart.sln),主项目PieChart实现核心渲染逻辑,pieChart2提供备用实现方案,PieChart_demo为演示模块,便于快速验证功能。所有代码采用标准C++编写 阅读详情

相关推荐

图像扭曲C++实现

用来图像数据增强,进行图像扭曲,从而生成更多样本

简单MFC程序开发-C++反编译肉鸡养成

为了更好的理解MFC(C++)程序的结构,拆解方法,需要首先创建一个MFC窗口程序,对于只了解一点C++的工程师来说,走一遍MFC程序开发的流程,是很有必有有一个指导的,无奈C++开发工具的版本太多,暴走了一段时间,终于摸索出来visual studio 2022版本的流程。

qq_20031585的博客 5613

嵌入式NTC温度解算库:Steinhart-Hart定点实现与硬件解耦设计

NTC热敏电阻是嵌入式系统中最常用的模拟温度传感器,其阻值-温度关系高度非线性,需依赖Steinhart-Hart方程实现高精度转换。该方程通过三参数对数多项式建模,理论上可将误差控制在±0.1°C以内,但直接移植到MCU面临浮点开销大、定点溢出、系数精度损失等工程瓶颈。为此,归一化处理(ln(R/R₂₅))、Q24.8定点运算、查表+插值对数计算等优化技术成为资源受限场景下的关键技术路径。其核心价值在于将ADC采样与温度解算彻底解耦,适配各类HAL/裸机/RTOS环境,广泛应用于电池管理、工业PLC、Io

weixin_35756624的博客 647

Winform 工程反编译后窗体如何显示

Winform反编译后,如果想要让它象正常的工程一样,可以在窗体顷刻

郝玉杰的专栏 1万+

eMMC数据擦除的方式

接下来主要是讲解erase、trim、discard的差异,涉及的command有CMD35、CMD36、CMD38。一般用来擦除整卡或者某些分区,如果只想擦除一个。以下是device status的部分解释。eMMC的数据擦除方式有6种,分别是。将会跳过写保护,只执行其他的范围。Discard的命令序列是。Erase的命令序列是。的范围有包含写保护,Trim的命令序列是。

DPJimmy的博客 1774

NHANES数据库的介绍及使用(一)

一、数据库概况 NHANES(National Health and Nutrition Examination Survey)是一项旨在评估美国成人和儿童健康和营养状况的研究计划,计划始于20世纪60年代初期,是一项针对不同人群或健康主题的调查。 1999年该调查成为一项持续计划,涉及各种健康和营养测量,项目每年调查一个全国代表性的样本,约5000人,这些人群位于全国各县,每年对其中15个县进行访问。 NHANES访谈部分包括人口统计学、社会经济学、饮食和健康相关问题。体检部分包括生理测量、实验室检查等

Christina 5万+

【190517】VC++透明背景的奇怪窗体演示源码源代码

源码下载简介 VC++透明背景的奇怪窗体演示源码,实现不规则的窗体,主要考查的是函数的使用,相对简单一点,VC入门朋友适合参考。 源码下载地址:点击下载 备用下载地址:点击下载 ...

资源小站 510

Windows11开机必看:3种方法跳过联网激活(含最新OOBE命令)

本文详细介绍了Windows11新机开箱时绕过联网激活的三种实用方法,包括任务管理器终止进程法、命令行强制终止法和最新的OOBE\BYPASSNRO命令法。特别推荐使用微软官方预留的OOBE命令,操作简单且无副作用,帮助用户快速完成系统设置。

weixin_28366353的博客 1630

VC++实现窗口异形(转载)

转载地址:https://www.cnblogs.com/lmqweeds/archive/2012/07/23/2605319.html   由于工作的需要,最近一直在研究异形窗口的实现。网上也有一些相关的文章,能够满足各式各样的异形窗口要求。既然花了时间去研究,就想好好的将其总结记录下来,以免今后遇到类似问题,还要从新花时间去研究。 我需要完成的效果很简单,但实现思路适合大部分的...

blacet的专栏 645

华为防火墙——本地Portal认证

配置IP地址、路由、Nat策略使得内网主机可以访问公网服务器对网段不进行认证,对网段进行portal认证。

m0_49864110的博客 3263

TriCore架构-基于TC397的启动流程

TC397芯片的启动流程分为三个关键阶段:固件启动(BootFirmware)、Bootloader引导和应用程序启动。BootFirmware作为硬件信任根,包含SSW基础初始化、CHSW自检和BSL应急刷写通道。Bootloader承担安全验证和程序引导功能,支持双分区(AB-SWAP)和双引导方案(PBL/SBL)。安全启动通过校验机制确保软件完整性,提供三种可选技术方案。应用程序启动阶段实现软件双分区管理,支持SOTA更新。整个流程体现了汽车电子系统的安全设计理念,通过硬件级保护与软件验证相结合确保

xiandang8023的博客 987

【190516】三个VC++程序精灵编程源码实例源代码

源码下载简介 三个VC++专用的程序精灵编程源码实例,就像Word中的动画提示一样,出来一个小动物询问你要怎么做,本精灵可设三种状态:变形、散步、休息,像变形金刚,哈。另外能设置是否显示、隐藏它,设置开机自动运行、新闻显示、是否静音、是否全屏幕活动等,除了研究这些小技巧外,你完全可以把它看作一个动画窗体来研究,我觉得挺不错。   压缩内有三个不同样式、不同动画形式的程序精灵,每个都能顺利编译,根...

资源小站 1017

把大表拆成更好用的“小仓库”:SAP HANA 表分区设计、分区裁剪与内存代价全解析

摘要:本文深入解析SAP HANA分区技术的核心价值与实现策略。作为内存数据库的"手术刀",分区通过将逻辑表横向切分为独立物理容器,显著提升并行计算能力与查询效率。重点探讨了三种分区类型(Range、Hash、Round-robin)的适用场景,以及分区裁剪的优化原理与前提条件。特别指出分区设计需要平衡查询模式与数据分布,并揭示了分区对内存占用的双向影响机制:既可能因字典复制增加消耗,也可能因数据纯度提升压缩率。通过电商订单表等实际案例,展示了合理分区如何将分钟级报表优化至秒级响应。文章

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

基于VC++PNG 按钮的实现

一、 VC++ 的优势        Visual C++ 是一个功能强大的可视化应用程序开发工具,用于 Windows 环境下 32 位的应用程序的开发,是计算机世界公认的最优秀的应用开发工具之一。在 Visual C++ 环境下,利用 Microsoft 的基本类库 MFC ,可以使用完全的面向对象的方法来进行 Windows 95/98/NT 应用程序的开发,使得 Wi

fjclc2008的专栏 1733

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6865

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

字符串变形拷贝c语言,C语言基本语法详解:文件夹变形大法

各位观众,今天我们讲的是文件夹的变形大法。首先,我们看看这两个图,如图1所示。一秒前:一秒后: 怎么样?文件夹变成回收站了!不信?双击进入试试,里面真的是回收站哦。神奇吧!看过本文,你不但能变文件夹为回收站,还可以将它变成各种稀奇古怪的东东!首先要说明一下原理:在Windows资源管理器中,Desktop.ini和Folder.htt中定义了文件夹的属性,在Windows 9X下,我们可以在文件夹...

weixin_39617669的博客 233

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC++实现窗口异形

由于工作的需要,最近一直在研究异形窗口的实现。网上也有一些相关的文章,能够满足各式各样的异形窗口要求。既然花了时间去研究,就想好好的将其总结记录下来,以免今后遇到类似问题,还要从新花时间去研究。      我需要完成的效果很简单,但实现思路适合大部分的异形窗口。                                                           

jackfengwei的专栏 900

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机c语言文件夹,C语言基本语法详解:文件夹变形大法.doc

C语言基本语法详解:文件夹变形大法类型:合作 作者: 日期:2005-06-07 17:15:57适合读者:编程爱好者、网民前置知识:C语言基本语法文件夹变形大法各位观众,欢迎来到全金属的编程讲座。今天我们讲的是文件夹的变形大法。首先,我们看看这两个图,如图1所示。一秒前:, 一秒后: 图1怎么样?文件夹变成回收站了!不信?双击进入试试,里面真的是回收站哦。神奇吧!看过本文,你不但能变文件夹为回收...

weixin_34193397的博客 141

控件大小随窗口变化的正确方法.

一.在介绍这个方法之前先看下在网上见过一种方法:VC++之根据对话框大小调整控件大小1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);3、在WM_SIZE的响应函数OnSize()中加入以下代码: CWnd *pWnd; pWnd = G

zzdmfk的专栏 2093

Wine下VB程序最大化崩溃:浮点异常与加密壳的调试分析

浮点异常是CPU浮点运算单元(FPU)在处理无法精确表示的数值时触发的硬件信号,通常涉及舍入操作。在标准编程环境中,这类异常默认被屏蔽,不会影响程序执行。然而,在跨平台兼容层如Wine中,FPU的初始状态可能与原生Windows存在差异,导致原本被忽略的异常被触发,进而引发程序崩溃。这一机制在运行老旧Windows程序时尤为关键,例如Visual Basic 6.0应用,其窗体最大化时的尺寸计算常涉及单位转换和浮点运算。若程序还被加密壳保护,会进一步阻碍调试分析,使得问题定位复杂化。本文通过解析Wine的异

weixin_30315435的博客 463

Visual Studio集成Halcon C#开发:从环境配置到部署实战指南

机器视觉开发涉及图像处理、算法实现与软件集成等多个核心环节。其基本原理是通过计算机模拟人类视觉,对图像进行分析和理解,从而完成检测、识别、测量等任务。这项技术的价值在于能够实现自动化、高精度和可重复的视觉检测,大幅提升工业生产和质量控制效率。在实际应用中,开发者常使用功能强大的专业库,如Halcon,它提供了丰富的算子,能高效处理复杂的视觉问题。将Halcon集成到C#项目中,特别是在Visual Studio开发环境下,是打通视觉算法与上层应用的关键一步。这涉及到环境配置、DLL引用、许可证管理等工程实践

weixin_34176694的博客 396

VC窗口缩放

获取屏幕分辨率大小int xSize = ::GetSystemMetrics(SM_CXSCREEN); int ySize = ::GetSystemMetrics(SM_CYSCREEN); 最大化最小化在OnSize消息事件中处理最小化 SIZE_MINIMIZED最大化 SIZE_MAXIMIZED还原 SIZE_RESTOREDvoid CMai

山里来的鱼 1438

VC中如何获得对话框中各个模块的系统默认提供的区域大小

具有下面区域的对话框都要有WS_BORDER属性,即不能将对话框WS_BORDER设置为NONE   获得对话框标题栏的大小:WS_CAPTION属性,此时可以响应hittest消息,即拖动非客户区标题栏鼠标有效,否则是无效的。但如果没有WS_SYSMENU系统菜单属性,则无法响应鼠标右键消息,且没有关闭按键及图标显示... 隐藏标题栏 ModifyStyle(WS_CAPTIO

sha_jinhao的专栏 896
上一篇: vc++学习精髓(收集,整理)
下一篇: VC实现在ListBox中选择背景位图
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值