Start my cnBlogs

作者首次使用CNBlog,对比优快云博客,发现CNBlog在内容、UI及广告等方面更舒适。作者承诺将用英语撰写博客,坚持原创,不转发他人文章,并规定转发需注明原文链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Compared to 优快云 blog, althought it's my first time to use CNBlog,i felt it makes me more comfortable,no matter from content,UI,advertising,etc.

    My CnBlog career is getting started.

1) i will try my best to write blog by using English;

2)my blog is all created by myself, 'cause i try not to forward any;

3)if u want to forward my cnblog,please show an annotation about the link of my article;

4)u can contact to me by send messages to "Allen-PengYe "(Sina Weibo);

 

 

转载于:https://www.cnblogs.com/allenpengyu/p/3422427.html

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
#ifndef _WND_H_ #define _WND_H_ #define _CRT_SECURE_NO_WARNINGS #define NO_WARN_MBCS_MFC_DEPRECATION #include <SDKDDKVer.h> #include <afxwin.h> //默认情况下所有继承Wnd的控件都是透明状态,需要自己绘画, alpha通道被置0了 #define RGBA(r,g,b,a) (COLORREF)(((BYTE)(b) |((WORD)((BYTE)(g)) << 8)) |(((DWORD)((BYTE)(r)) << 16)) |(((DWORD)((BYTE)(a)) << 24))) namespace MPlus { #pragma pack(push,1) typedef struct tagWndProcThunk { DWORD mov; // 修改堆栈中的参数 mov [esp+4], 0xC7 0x44 0x24 0x04 = 0x042444C7 DWORD thiz; // 存储 this 指针 ?? ?? ?? ?? (DWORD)this BYTE jmp; // 跳转指令 jmp 0xE9 DWORD relproc; // 相对跳转地址 ?? ?? ?? ?? staic_WndProc-(thunk + sizeof WndProcThunk) }WndProcThunk; typedef WndProcThunk* LPWNDPROCTHUNK; #pragma pack(pop) template<class T> T* AllocVirtualMemory() { void* mem = VirtualAlloc(NULL, sizeof(T), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!mem) return nullptr; memset(mem, 0, sizeof(T)); return (T*)mem; } template<class T> void Free(T* _pMemory) { if (_pMemory) { VirtualFree(_pMemory, sizeof T, MEM_RELEASE); } } class Wnd : public CWnd { DECLARE_DYNAMIC(Wnd) protected: CDC m_MemDC; //绘图二级缓存DC BITMAPINFO m_BMI; //绘图位图的基本信息 HBITMAP m_hBitmap; //位图的句柄 BYTE* m_pvBits; //位图的裸内存首地址 CRect m_rcWnd; //控件的画布范围 CFont m_Font; //二级DC所使用的字体 CPoint m_ptOrigin; //窗口当前的坐标 int* m_vecRows; //位图的行列表 public: LPCTSTR m_szClassName; //默认提供的类名,创建窗口时要使用 protected: void fast_stack_blur(unsigned char* pix, unsigned int w, unsigned int h, unsigned int comp, int radius);//快速栈模糊算法 virtual bool OnValidBlur(const CPoint& _ptPix); void SetAlphaRect(const CRect _rect, BYTE _alpha); public: Wnd(); ~Wnd(); void Clear(); DECLARE_MESSAGE_MAP() afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); }; } void _output_debug(const char* _format, ...); #ifdef _DEBUG #define outputdebug_default(_format, ...)_output_debug("[Default] "##_format, ##__VA_ARGS__) #define outputdebug_warning(_format, ...)_output_debug("[Warning] "##_format, ##__VA_ARGS__) #define outputdebug_error(_format, ...)_output_debug("[Error] "##_format, ##__VA_ARGS__) #else #define outputdebug_default(format, ...) #define outputdebug_warning(_format, ...) #define outputdebug_error(_format, ...) #endif #endif #include "Wnd.h" void _output_debug(const char* _format, ...) { #define __DstSize__ 1024 char strMsgBuffer[__DstSize__]; va_list list; va_start(list, _format); vsnprintf(strMsgBuffer, __DstSize__, _format, list); va_end(list); //强行加换行符 int last = strlen(strMsgBuffer); if (strMsgBuffer[last - 1] != '\n') { strMsgBuffer[last] = '\n'; strMsgBuffer[last + 1] = 0; } OutputDebugStringA(strMsgBuffer);//win api } namespace MPlus { IMPLEMENT_DYNAMIC(Wnd, CWnd) } MPlus::Wnd::Wnd(): m_hBitmap(NULL), m_pvBits(NULL), m_rcWnd(0, 0, 0, 0), m_ptOrigin(0, 0), m_vecRows(NULL) { m_szClassName = AfxRegisterWndClass(0); //注册默认类名 } MPlus::Wnd::~Wnd() { Wnd::Clear(); } void MPlus::Wnd::Clear() { m_Font.DeleteObject();//释放字体内存 DeleteObject(m_hBitmap);//释放位图内存 m_MemDC.DeleteDC();//二级缓存释放 m_pvBits = NULL; ZeroMemory(&m_BMI, sizeof(BITMAPINFO));//重置位图信息 if (m_vecRows) { delete[] m_vecRows; m_vecRows = NULL; } } // Stack Blur v1.1 // // Author: Mario Klingemann <mario@quasimondo.com> // http://incubator.quasimondo.com // created Feburary 29, 2004 // C version updated and performance optimization by tntmonks(http://tntmonks.cnblogs.com) // This is a compromise between Gaussian Blur and Box blur // It creates much better looking blurs than Box Blur, but is // 7x faster than my Gaussian Blur implementation. // // I called it Stack Blur because this describes best how this // filter works internally: it creates a kind of moving stack // of colors whilst scanning through the image. Thereby it // just has to add one new block of color to the right side // of the stack and remove the leftmost color. The remaining // colors on the topmost layer of the stack are either added on // or reduced by one, depending on if they are on the right or // on the left side of the stack. // // If you are using this algorithm in your code please add // the following line: // // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com> //#define MAX(x,y) (x>y?x:y) //#define MIN(x,y) (x>y?y:x) #include <math.h> void MPlus::Wnd::fast_stack_blur(unsigned char* pix, unsigned int w, unsigned int h, unsigned int comp, int radius) { #pragma warning(disable:4018) unsigned int wm = w - 1; unsigned int hm = h - 1; unsigned int imageSize = w * h; unsigned int div = radius * 2 + 1; unsigned char* rgb = (unsigned char*)malloc(sizeof(unsigned char) * imageSize * 4); unsigned char* r = rgb; unsigned char* g = rgb + imageSize; unsigned char* b = rgb + imageSize * 2; unsigned char* a = rgb + imageSize * 3; int rsum, gsum, bsum, asum, x, y, i, p, yp, yi, yw; unsigned int* vmin = (unsigned int*)malloc(max(w, h) * sizeof(unsigned int)); int divsum = (div + 1) >> 1; divsum *= divsum; int* dv = (int*)malloc(256 * divsum * sizeof(int)); for (i = 0; i < 256 * divsum; i++) { dv[i] = (i / divsum); } yw = yi = 0; int(*stack)[4] = (int(*)[4])malloc(div * 4 * sizeof(int)); unsigned int stackpointer; unsigned int stackstart; int* sir; int rbs; int r1 = radius + 1; int routsum, goutsum, boutsum, aoutsum; int rinsum, ginsum, binsum, ainsum; for (y = 0; y < h; y++) { rinsum = ginsum = binsum = ainsum = routsum = goutsum = boutsum = aoutsum = rsum = gsum = bsum = asum = 0; for (i = -radius; i <= radius; i++) { p = yi + (min(wm, max(i, 0))); sir = stack[i + radius]; sir[0] = pix[(p * comp)]; sir[1] = pix[(p * comp) + 1]; sir[2] = pix[(p * comp) + 2]; sir[3] = pix[(p * comp) + 3]; rbs = r1 - abs(i); rsum += sir[0] * rbs; gsum += sir[1] * rbs; bsum += sir[2] * rbs; asum += sir[3] * rbs; if (i > 0) { rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; ainsum += sir[3]; } else { routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; aoutsum += sir[3]; } } stackpointer = radius; for (x = 0; x < w; x++) { r[yi] = dv[rsum]; g[yi] = dv[gsum]; b[yi] = dv[bsum]; a[yi] = dv[asum]; rsum -= routsum; gsum -= goutsum; bsum -= boutsum; asum -= aoutsum; stackstart = stackpointer - radius + div; sir = stack[stackstart % div]; routsum -= sir[0]; goutsum -= sir[1]; boutsum -= sir[2]; aoutsum -= sir[3]; if (y == 0) { vmin[x] = min(x + radius + 1, wm); } p = yw + vmin[x]; sir[0] = pix[(p * comp)]; sir[1] = pix[(p * comp) + 1]; sir[2] = pix[(p * comp) + 2]; sir[3] = pix[(p * comp) + 3]; rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; ainsum += sir[3]; rsum += rinsum; gsum += ginsum; bsum += binsum; asum += ainsum; stackpointer = (stackpointer + 1) % div; sir = stack[(stackpointer) % div]; routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; aoutsum += sir[3]; rinsum -= sir[0]; ginsum -= sir[1]; binsum -= sir[2]; ainsum -= sir[3]; yi++; } yw += w; } for (int x = 0; x < w; x++) { rinsum = ginsum = binsum = ainsum = routsum = goutsum = boutsum = aoutsum = rsum = gsum = bsum = asum = 0; yp = -radius * w; for (i = -radius; i <= radius; i++) { yi = max(0, yp) + x; sir = stack[i + radius]; sir[0] = r[yi]; sir[1] = g[yi]; sir[2] = b[yi]; sir[3] = a[yi]; rbs = r1 - abs(i); rsum += r[yi] * rbs; gsum += g[yi] * rbs; bsum += b[yi] * rbs; asum += a[yi] * rbs; if (i > 0) { rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; ainsum += sir[3]; } else { routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; aoutsum += sir[3]; } if (i < hm) { yp += w; } } yi = x; stackpointer = radius; for (y = 0; y < h; y++) { if (OnValidBlur({ x,y })) { pix[(yi * comp) + 0] = dv[rsum]; pix[(yi * comp) + 1] = dv[gsum]; pix[(yi * comp) + 2] = dv[bsum]; pix[(yi * comp) + 3] = dv[asum]; } rsum -= routsum; gsum -= goutsum; bsum -= boutsum; asum -= aoutsum; stackstart = stackpointer - radius + div; sir = stack[stackstart % div]; routsum -= sir[0]; goutsum -= sir[1]; boutsum -= sir[2]; aoutsum -= sir[3]; if (x == 0) { vmin[y] = min(y + r1, hm) * w; } p = x + vmin[y]; sir[0] = r[p]; sir[1] = g[p]; sir[2] = b[p]; sir[3] = a[p]; rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; ainsum += sir[3]; rsum += rinsum; gsum += ginsum; bsum += binsum; asum += ainsum; stackpointer = (stackpointer + 1) % div; sir = stack[stackpointer]; routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; aoutsum += sir[3]; rinsum -= sir[0]; ginsum -= sir[1]; binsum -= sir[2]; ainsum -= sir[3]; yi += w; } } free(rgb); free(vmin); free(dv); free(stack); #pragma warning(default:4018) } void MPlus::Wnd::SetAlphaRect(const CRect _rect, BYTE _alpha) { int iAlpha = _alpha; iAlpha <<= 24; int* pRow = NULL; for (int i = _rect.top; i < _rect.bottom; ++i) { pRow = (int*)m_vecRows[i];//取出一行数据 for (int j = _rect.left; j < _rect.right; ++j) { *(pRow + j) |= iAlpha;//设置每个ARGB颜色的alpha通道 } } } bool MPlus::Wnd::OnValidBlur(const CPoint& _ptPix) { return true; } BEGIN_MESSAGE_MAP(MPlus::Wnd, CWnd) ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() END_MESSAGE_MAP() int MPlus::Wnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 m_rcWnd = { 0, 0, lpCreateStruct->cx, lpCreateStruct->cy };//保存控件画布范围 m_ptOrigin.x = lpCreateStruct->x; m_ptOrigin.y = lpCreateStruct->y; ZeroMemory(&m_BMI, sizeof(BITMAPINFO)); //初始化位置信息 m_BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //给定位图信息类的大小 m_BMI.bmiHeader.biWidth = m_rcWnd.Width(); //位图的长度 m_BMI.bmiHeader.biHeight = m_rcWnd.Height(); //位图的宽度 m_BMI.bmiHeader.biPlanes = 1; m_BMI.bmiHeader.biBitCount = 32; // four 8-bit components m_BMI.bmiHeader.biCompression = BI_RGB; m_BMI.bmiHeader.biSizeImage = m_BMI.bmiHeader.biWidth * m_BMI.bmiHeader.biHeight * 4; //位图内存的大小 m_hBitmap = CreateDIBSection(NULL, &m_BMI, DIB_RGB_COLORS, (void**)&m_pvBits, NULL, 0); //创建DIB无关联位图 //二级缓存DC初始化 m_MemDC.CreateCompatibleDC(NULL); //创建二级缓存DC HGDIOBJ hdc = m_MemDC.SelectObject(m_hBitmap); //DC选择指定位图 m_Font.CreatePointFont( (m_rcWnd.Height()-2) * 5, "微软雅黑", NULL); //默认字体 m_MemDC.SelectObject(&m_Font); m_MemDC.FillSolidRect(m_rcWnd, RGBA(0,0,0,0)); ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));//修复鼠标 //开始把位图每行标记储存起来 int iRows = m_BMI.bmiHeader.biWidth; int iCols = m_BMI.bmiHeader.biHeight; m_vecRows = new int[iCols]; //m_pvBits的位图内存分布是倒序的,所以最后一行数据就是位图的第一行数据,进行倒序储存 for (int i = (iCols - 1), j=0; i >= 0; --i, ++j) { m_vecRows[i] = int(m_pvBits + (iRows * 4 * j) ); } return 0; } void MPlus::Wnd::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CWnd* pWnd = SetFocus(); CWnd::OnLButtonDown(nFlags, point); } void MPlus::Wnd::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CWnd::OnLButtonUp(nFlags, point); } BOOL MPlus::Wnd::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return CWnd::OnEraseBkgnd(pDC); } 我要扩展LineTo支持alpha通道
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值