Visual C++实现不规则窗口图形图像处理示例

版权申诉
0 下载量 87 浏览量 更新于2024-11-15 收藏 42KB RAR 举报
资源摘要信息:"ContourBitmapDemo.rar是一个涉及图形图像处理的Visual C++示例项目,该项目的重点在于实现不规则窗口的设计以及鼠标事件与不规则窗口的交互跟随功能。不规则窗口是指窗口的形状不是传统的矩形,而是可以是任意形状的窗口,这种窗口的边缘通常由轮廓线定义。在此项目中,开发者将学会如何使用C++语言结合Windows API来创建和管理不规则窗口,同时实现窗口对鼠标事件的响应,包括鼠标移动和点击等,让窗口能够实时跟随鼠标指针移动,实现特殊的用户界面交互效果。 为了完成这个项目,开发者需要掌握以下几个关键知识点: 1. Windows编程基础:了解并熟悉Windows API函数,特别是与窗口创建和事件处理相关的函数,例如CreateWindowEx、DefWindowProc、RegisterClassEx等。 2. 不规则窗口的创建:学习如何定义窗口的形状。在Windows编程中,这通常是通过使用区域(Region)来实现的。一个不规则窗口的区域可以通过CreateEllipticRgn、CreatePolygonRgn等函数创建,并通过SetWindowRgn函数应用到窗口上。 3. 鼠标事件处理:了解如何处理鼠标事件,以便让窗口能够响应鼠标的移动。这涉及到了解鼠标消息,如WM_MOUSEMOVE、WM_LBUTTONDOWN等,以及如何编写相应的消息处理函数来响应这些事件。 4. GDI(图形设备接口):掌握基本的GDI编程知识,包括如何在窗口中绘制图形,如何使用位图等。这是为了能够自定义窗口的外观,并在窗口中绘制复杂的图形或位图。 5. MFC(Microsoft Foundation Classes)框架:如果ContourBitmapDemo项目使用了MFC库,则需要对MFC有一定的了解,包括其文档/视图架构、消息映射机制等。 6. 图形图像处理:项目名称中包含“图形图像处理”,因此需要了解图像处理的基础知识,如像素操作、图像格式转换等,以便在不规则窗口中进行高级图像处理。 7. 性能优化:对于图形图像处理项目,性能优化是一个重要的方面。开发者需要考虑如何提高图形渲染的效率,比如使用双缓冲技术、减少不必要的重绘等。 通过实现ContourBitmapDemo这个项目,开发者将获得深入理解和应用Windows API进行图形图像处理的实际经验,提升在图形用户界面设计方面的技术能力。同时,该项目也是对Visual C++编程能力的一次综合考验,特别是在Windows平台下进行界面定制和交互设计的能力。"

#include "prepare_ogm.hpp" namespace senior { namespace guardian { namespace prepare { std::string PrepareOgm::Name() { return "Prepare Ogm Element"; } void PrepareOgm::Initiate() {} void PrepareOgm::Process(data::DataFrame& his, data::DataFrame& cur) { if (cur.source_ogm_points_.is_invalid()) return; if (cur.source_visual_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_visual_ogm_points_.begin(), cur.source_visual_ogm_points_.end()); } if (cur.source_higher_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_higher_ogm_points_.begin(), cur.source_higher_ogm_points_.end()); } auto& predict_path = cur.monitor_data_.mutable_predict_path(); predict_path.GenerateBoundary(cur); cur.AABox2d_ = predict_path.vehicle_AABox2d_; // if (!his.monitor_data_.is_need_to_take_over()) { // LOG(INFO)<<"1"; cur.AABox2d_.SetWidth(cur.AABox2d_.width() + 1.0); cur.AABox2d_.SetLength(cur.AABox2d_.length() + 1.0); // } std::vector<math::Vec2d> corner_points_; cur.AABox2d_.GetAllCorners(&corner_points_); auto& polygon2d = predict_path.tractor_polygon2d_; math::Vec2d temp; VoxelGrid filter_; common::Time now = common::Time::Now(); for (auto& point : cur.source_ogm_points_) { temp.set_x(point.x()); temp.set_y(-point.y()); if (cur.AABox2d_.IsPointIn(temp)) { cur.AABB_ogm_points_.emplace_back(point); } } cur.guardian_diagnose_["Prepare_PrepareOgm_AABox_filter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); now = common::Time::Now(); filter_.VoxelGrid_ApplyFilter( cur.AABB_ogm_points_, cur.ogm_points_, corner_points_, 0.1, 0.1, 0); cur.guardian_diagnose_["Prepare_PrepareOgm_VoxelGrid_ApplyFilter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); cur.ogm_points_.set_stamp(cur.source_ogm_points_.stamp()); cur.ogm_points_.set_time(cur.source_ogm_points_.time()); cur.ogm_points_.set_delay_time(cur.source_ogm_points_.delay_time()); cur.ogm_points_.set_valid(); } } // namespace prepare } // namespace guardian } // namespace senior 改变为C语言程序

2023-06-13 上传