DAMO-YOLO手机检测5分钟快速上手:考场防作弊实战教程

核心内容摘要

AI净界RMBG-1.4模型解析:架构与训练原理深入解读
大数据领域:挖掘数据价值的核心策略

CIFAR10/CIFAR100数据集下载与可视化全攻略:从零开始处理图像数据

添加 Dialog 资源普通 DLL 中创建对话框可视化操作普通 DLL 项目添加 Dialog 资源和 BRX 模板项目操作一致全程可视化无需手动写复杂脚本

1 添加资源脚本文件.rc右键项目名称 →「添加」→「新建项」左侧切换「Visual C」→「资源」右侧选择「资源脚本 (.rc)」文件名填写Resource.rc默认即可点击「添加」VS 自动生成Resource.rc资源脚本和resource.h资源 ID 管理在「解决方案资源管理器」中可见。

2 新建 Dialog 资源可视化创建双击「Resource.rc」打开「资源视图」若未显示点击「视图」→「其他窗口」→「资源视图」在「资源视图」中右键Resource.rc→「添加资源」弹出「添加资源」窗口选择「Dialog」→ 点击「新建」VS 自动创建默认对话框IDIDD_DIALOG1并打开可视化对话框编辑器。

3 修改 Dialog 属性匹配立方体参数需求选中对话框点击标题栏 / 空白区域不选中内部按钮按F4调出「属性窗口」逐一修改以下属性确保后续代码能识别ID删除默认IDD_DIALOG1输入IDD_DIALOG_CUBE_PARAM自定义唯一标识Caption输入创建立方体参数对话框标题显示中文Font下拉选择「Microsoft YaHei UI」字号「9」避免中文字体乱码Width250对话框宽度Height180对话框高度属性窗口「布局」分类下Style保持「Popup」「Dialog Frame」弹窗样式默认即可点击「文件」→「保存」暂不关闭对话框编辑器。

4 添加 Dialog 控件编辑框 标签实现参数输入调出「工具箱」若未显示CtrlAltX或「视图」→「工具箱」添加 3 个「Static Text」静态标签说明文字第 1 个标签拖拽到对话框内选中后按F4打开属性Caption长度ID保留IDC_STATIC无需修改布局位置X20Y30属性窗口「布局」分类下第 2 个标签Caption宽度布局位置X20Y70第 3 个标签Caption高度布局位置X20Y110添加 3 个「Edit Control」编辑框输入长宽高第 1 个编辑框对应长度拖拽到对话框内选中后按F4打开属性IDIDC_EDIT_LENGTH自定义唯一 ID后续代码调用勾选「Auto HScroll」自动横向滚动优化输入体验布局位置X70Y30尺寸Width150Height20第 2 个编辑框对应宽度IDIDC_EDIT_WIDTH布局位置X70Y70尺寸同前第 3 个编辑框对应高度IDIDC_EDIT_HEIGHT布局位置X70Y110尺寸同前保留默认「确定」「取消」按钮BricsCAD 识别默认 IDIDOK/IDCANCEL「确定」按钮位置X60Y145尺寸60×25「取消」按钮位置X130Y145尺寸60×25调整完成后点击「文件」→「保存全部」VS 自动更新Resource.rc和resource.h。

5 验证资源 ID确保resource.h自动生成双击打开resource.h确认以下 ID 已自动添加VS 自动生成无需手动编写数值可不同名称一致即可#ifndef RESOURCE_H #define RESOURCE_H #define IDD_DIALOG_CUBE_PARAM 101 #define IDC_EDIT_LENGTH 1001 #define IDC_EDIT_WIDTH 1002 #define IDC_EDIT_HEIGHT 1003 #define IDC_STATIC -1 #endif // RESOURCE_H

一段代码示例#include StdAfx.h #include Box.h #include resource.h #include windows.h #include tchar.h // 全局变量保存插件自身模块句柄用于获取对话框资源 static HMODULE g_hPluginModule NULL; // 全局结构体存储立方体参数 typedef struct { double dLength; // 长度 double dWidth; // 宽度 double dHeight; // 高度 BOOL bDialogActive; // 对话框是否激活 HWND hDialog; // 对话框句柄 } CubeParamStruct; // 全局变量初始化默认参数100×100×100 static CubeParamStruct g_CubeParam {

1

0,

1

0,

1

0, FALSE, NULL }; // 对话框过程函数非模态 INT_PTR CALLBACK CubeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) //对话框句柄、消息类型、消息的附加细节如控件ID和通知码 { switch (uMsg) //判断消息类型 { // 对话框初始化 case WM_INITDIALOG: { g_CubeParam.hDialog hDlg; g_CubeParam.bDialogActive TRUE; // 初始化编辑框显示默认值 TCHAR szValue[64]; _stprintf_s(szValue, _T(%.2f), g_CubeParam.dLength); SetDlgItemText(hDlg, IDC_EDIT_LENGTH, szValue); _stprintf_s(szValue, _T(%.2f), g_CubeParam.dWidth); SetDlgItemText(hDlg, IDC_EDIT_WIDTH, szValue); _stprintf_s(szValue, _T(%.2f), g_CubeParam.dHeight); SetDlgItemText(hDlg, IDC_EDIT_HEIGHT, szValue); return TRUE; } // 按钮点击消息处理 case WM_COMMAND: { switch (LOWORD(wParam)) { // 确定按钮创建立方体 case IDOK: { TCHAR szBuffer[64]; // 读取编辑框参数 GetDlgItemText(hDlg, IDC_EDIT_LENGTH, szBuffer,

; g_CubeParam.dLength _tstof(szBuffer); GetDlgItemText(hDlg, IDC_EDIT_WIDTH, szBuffer,

; g_CubeParam.dWidth _tstof(szBuffer); GetDlgItemText(hDlg, IDC_EDIT_HEIGHT, szBuffer,

; g_CubeParam.dHeight _tstof(szBuffer); // 合法性校验 if (g_CubeParam.dLength

001 || g_CubeParam.dWidth

001 || g_CubeParam.dHeight

0.

{ MessageBox(hDlg, _T(长宽高必须大于

0.

, _T(错误), MB_OK | MB_ICONERROR); return TRUE; } // 创建立方体 try { Box::createBoxSolid( g_CubeParam.dLength, g_CubeParam.dWidth, g_CubeParam.dHeight, AcGeVector3d(100, 100,

, 1 // 红色 ); acutPrintf(_T(\n* 立方体创建成功尺寸%.2f×%.2f×%.2f), g_CubeParam.dLength, g_CubeParam.dWidth, g_CubeParam.dHeight); } catch (...) { MessageBox(hDlg, _T(创建立方体失败), _T(错误), MB_OK | MB_ICONERROR); } return TRUE; } // 取消按钮关闭对话框 case IDCANCEL: { DestroyWindow(hDlg); g_CubeParam.bDialogActive FALSE; g_CubeParam.hDialog NULL; return TRUE; } } break; } // 对话框关闭消息 case WM_CLOSE: DestroyWindow(hDlg); g_CubeParam.bDialogActive FALSE; g_CubeParam.hDialog NULL; return TRUE; case WM_DESTROY: g_CubeParam.bDialogActive FALSE; g_CubeParam.hDialog NULL; return TRUE; } return FALSE; } // 插件核心类继承 AcRxArxApp 基类BRX 模板规范 class CubePlugin : public AcRxArxApp { public: // 构造函数调用父类构造初始化插件基础信息 CubePlugin() : AcRxArxApp() {} // 服务器组件注册空实现满足 BRX 框架要求无复杂组件需注册 virtual void RegisterServerComponents() { } // 插件加载时触发初始化配置 打印提示信息 virtual AcRx::AppRetCode On_kInitAppMsg(void* pAppData) { // 调用父类默认初始化完成底层绑定 AcRx::AppRetCode result AcRxArxApp::On_kInitAppMsg(pAppData); // 配置插件支持多文档 允许运行时卸载 acrxRegisterAppMDIAware(pAppData); acrxUnlockApplication(pAppData); // 打印加载成功提示 acutPrintf(_T(\n* 立方体 DLL 插件加载成功)); acutPrintf(_T(\n* 可用命令BCreateCube、CubeDlg)); return result; } // 插件卸载时触发清理命令 关闭对话框 virtual AcRx::AppRetCode On_kUnloadAppMsg(void* pAppData) { // 清理已打开的对话框 if (g_CubeParam.bDialogActive g_CubeParam.hDialog IsWindow(g_CubeParam.hDialog)) { DestroyWindow(g_CubeParam.hDialog); } g_CubeParam.bDialogActive FALSE; g_CubeParam.hDialog NULL; // 调用父类默认卸载逻辑 return AcRxArxApp::On_kUnloadAppMsg(pAppData); } // 其他生命周期方法空实现保证类的完整性满足 BRX 框架要求 virtual AcRx::AppRetCode On_kLoadDwgMsg(void* pAppData) { return AcRxArxApp::On_kLoadDwgMsg(pAppData); } virtual AcRx::AppRetCode On_kUnloadDwgMsg(void* pAppData) { return AcRxArxApp::On_kUnloadDwgMsg(pAppData); } // BRX 命令1快速创建默认立方体静态成员函数符合 BRX 命令规范 static void CubePluginBCreateCube(void) { Box::createBoxSolid(

1

0,

1

0,

1

0, AcGeVector3d(100, 100,

,

; acutPrintf(_T(\n* 默认立方体创建成功尺寸100×100×

); } // BRX 命令2打开参数对话框静态成员函数符合 BRX 命令规范 static void CubePluginCubeDlg(void) { // 若对话框已打开直接激活 if (g_CubeParam.hDialog IsWindow(g_CubeParam.hDialog) g_CubeParam.bDialogActive) { SetForegroundWindow(g_CubeParam.hDialog); ShowWindow(g_CubeParam.hDialog, SW_SHOW); return; } // 获取BricsCAD主窗口句柄兜底使用桌面窗口 HWND hWndAcad adsw_acadMainWnd(); if (hWndAcad NULL) { hWndAcad GetDesktopWindow(); } // 创建非模态对话框 HWND hDlg CreateDialogParam( g_hPluginModule, MAKEINTRESOURCE(IDD_DIALOG_CUBE_PARAM), hWndAcad, CubeDlgProc, 0 ); if (hDlg NULL) { acutPrintf(_T(\n* 错误无法创建对话框错误代码%d), GetLastError()); return; } // 显示对话框 ShowWindow(hDlg, SW_SHOW); UpdateWindow(hDlg); // 更新全局变量 g_CubeParam.hDialog hDlg; g_CubeParam.bDialogActive TRUE; } }; // 关键入口宏告诉 BRX 框架核心插件类无法省略 IMPLEMENT_ARX_ENTRYPOINT(CubePlugin) // DLL 入口函数保存插件模块句柄 BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // 插件加载时保存自身模块句柄 g_hPluginModule hModule; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // 命令1自动注册 BCreateCube遵循 BRX 模板自动注册宏规范 ACED_ARXCOMMAND_ENTRY_AUTO(CubePlugin, CubePlugin, BCreateCube, BCreateCube, ACRX_CMD_TRANSPARENT, NULL) // 命令2自动注册 CubeDlg遵循 BRX 模板自动注册宏规范 ACED_ARXCOMMAND_ENTRY_AUTO(CubePlugin, CubePlugin, CubeDlg, CubeDlg, ACRX_CMD_TRANSPARENT, NULL)

对代码进行解释

1 关于对话框消息处理函数回调函数Windows 系统会在对话框有事件发生比如点击按钮、关闭窗口时自动调用这个函数并把相关信息通过这四个参数传递给你让你决定如何处理这些事件。

逐个拆解参数含义函数原型INT_PTR CALLBACK CubeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

HWND hDlg类型HWND Handle to Window窗口句柄是 Windows 给每个窗口 / 对话框分配的唯一 “身份证号”。

含义这个参数指向当前触发消息的对话框窗口本身。

实际用途你可以通过这个句柄操作对话框比如给对话框里的编辑框设置内容SetDlgItemText(hDlg, IDC_EDIT1, 内容)关闭这个对话框EndDialog(hDlg, IDOK)获取对话框中控件的句柄GetDlgItem(hDlg, IDC_BUTTON

通俗类比相当于你收到了一封信hDlg就是信封上写的 “收件人地址”告诉你这是给哪个对话框的消息。

UINT uMsg类型UINT Unsigned Integer无符号整数本质是 Windows 定义的消息常量。

含义这个参数是消息类型告诉函数 “发生了什么事”。

Windows 预定义了大量消息常量每个常量对应一个具体事件。

常见取值示例消息常量含义WM_INITDIALOG对话框刚创建、初始化时触发WM_COMMAND用户点击了按钮 / 菜单等控件WM_CLOSE用户点击了对话框的关闭按钮WM_DESTROY对话框即将被销毁时触发实际用途你会在函数里用switch(uMsg)分支判断消息类型然后针对性处理。

通俗类比相当于信封里的 “事件说明”比如 “有人按了确认按钮”“要关闭窗口了”。

WPARAM wParam类型WPARAM Window Parameter窗口参数本质是一个 32/64 位的整数根据系统位数。

含义消息的附加参数 1具体值取决于uMsg的类型 —— 不同的消息wParam承载的信息不同。

常见示例当uMsg WM_COMMAND时wParam的低 16 位是控件 ID比如点击的按钮 IDIDC_BUTTON_OK高 16 位是通知码比如BN_CLICKED表示按钮被点击当uMsg WM_KEYDOWN时wParam是按下的键盘按键码比如VK_ENTER表示回车键通俗类比相当于事件说明的 “补充细节 1”比如 “按了确认按钮” 这个事件里wParam告诉你 “是 ID 为 1001 的那个确认按钮”。

LPARAM lParam类型LPARAM Long Parameter长参数也是 32/64 位整数和WPARAM是一对 “搭档参数”。

含义消息的附加参数 2同样取决于uMsg的类型通常承载更复杂的信息比如指针、坐标、控件句柄等。

常见示例当uMsg WM_COMMAND时lParam是触发事件的控件句柄比如被点击按钮的句柄当uMsg WM_MOUSEMOVE时lParam的低 16 位是鼠标 X 坐标高 16 位是 Y 坐标当uMsg WM_INITDIALOG时lParam可能携带创建对话框时传递的自定义数据通俗类比相当于事件说明的 “补充细节 2”比如 “按了确认按钮” 这个事件里lParam告诉你 “这个按钮的具体句柄是多少”。

补充函数返回值和修饰符为了让你理解更完整额外说明函数头部的其他标识INT_PTR函数返回值类型通常返回TRUE/FALSE或特定值比如处理了消息返回TRUE未处理返回FALSE让系统默认处理CALLBACK是 Windows 定义的宏本质是__stdcall指定函数的调用约定参数传递、栈清理的规则确保系统能正确调用这个回调函数。

实战示例帮你理解参数配合使用下面是一个简化的CubeDlgProc实现直观展示参数如何配合INT_PTR CALLBACK CubeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: // 对话框初始化 // 用hDlg对话框句柄给编辑框设置初始内容 SetDlgItemText(hDlg, IDC_EDIT1, 请输入内容); return TRUE; // 表示处理了这个消息 case WM_COMMAND: // 控件事件 // wParam低16位是控件IDHIWORD/LOWORD是提取高低位的宏 int nCtrlID LOWORD(wParam); int nNotifyCode HIWORD(wParam); HWND hCtrl (HWND)lParam; // lParam是控件句柄 if (nCtrlID IDC_BUTTON_OK nNotifyCode BN_CLICKED) { // 点击了“确认”按钮用hDlg操作对话框 MessageBox(hDlg, 你点击了确认按钮, 提示, MB_OK); EndDialog(hDlg, IDOK); // 关闭对话框 return TRUE; } break; case WM_CLOSE: // 关闭对话框 EndDialog(hDlg, IDCANCEL); return TRUE; } // 未处理的消息交给系统默认处理 return FALSE; }

总结hDlg当前对话框的 “身份证”句柄用于操作对话框本身uMsg核心消息类型告诉函数 “发生了什么事”初始化、点击按钮、关闭等wParam/lParam消息的附加细节不同消息对应不同含义是处理具体事件的关键四个参数由 Windows 系统自动传递你只需在函数里根据uMsg判断类型结合wParam/lParam处理逻辑再通过hDlg操作对话框。

甜心vlog免费观看版最新版本更新内容-甜心vlog免费观看版最新版本更新内容应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123