得到单击的listctrl的行列号

本博客介绍如何在C++中通过NM_CLICK消息处理函数获取listctrl控件的单击行列号。

 得到单击的listctrl的行列号

添加listctrl控件的NM_CLICK消息相应函数

void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
      {
           // 方法一:
           /*
           DWORD dwPos = GetMessagePos();
           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
   
           m_list.ScreenToClient(&point);
   
           LVHITTESTINFO lvinfo;
           lvinfo.pt = point;
           lvinfo.flags = LVHT_ABOVE;
     
           int nItem = m_list.SubItemHitTest(&lvinfo);
           if(nItem != -1)
           {
                CString strtemp;
                strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
                AfxMessageBox(strtemp);
           }
          */
   
          // 方法二:
          /*
           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
           if(pNMListView->iItem != -1)
           {
                CString strtemp;
                strtemp.Format("单击的是第%d行第%d列",
                                pNMListView->iItem, pNMListView->iSubItem);
                AfxMessageBox(strtemp);
           }
          */
           *pResult = 0;
      }


 

下面给出“可直接贴进代码”的逐行清单,每个条目包含四: 【功能ID】 【界面可见文字(控件类型)】 【内部变量/常量名】 【写死公式/功能描述】 一、工具栏(顶部横条,tk.Frame) 1. 日期标签 → Label(text="📅 日期") → 无公式 2. 日期选择 → DateEntry(name="tool_date", date_pattern="y-mm-dd") → 绑定on_date_changed() 3. 保存按钮 → Button(text="💾 保存", command=save) → Ctrl+S 4. 查询按钮 → Button(text="🔍 查询", command=lambda: show_content("数据查询")) 5. 分析按钮 → Button(text="📊 分析", command=lambda: show_content("智能分析")) 6. 刷新按钮 → Button(text="🔄 刷新", command=refresh_data) 7. 导出按钮 → Button(text="📤 导出", command=export_daily) 8. 趋势图按钮 → Button(text="📈 趋势图", command=plot_30d) 9. 状态标签 → Label(name="status_label", text="就绪") → 动态text=f"[{time}] {msg}" 10. 用户标签 → Label(name="user_label", text="当前用户") → 默认文字 二、左侧功能菜单(ttk.Frame, sidebar.TFrame) 11. 运行数据录入 → Button(text="运行数据录入", style="sidebar.TButton", command=lambda: show_content("运行数据录入")) → 异步构建10区块 12. 节能数据录入 → Button(text="节能数据录入", ...) → 构建6组泵界面 13. 设备可靠性 → Button(text="设备可靠性数据录入", ...) → 设备下拉+表格弹窗 14. 智能分析 → Button(text="智能分析", ...) → 同工具栏 15. 数据查询 → Button(text="数据查询", ...) → 打开三页签Notebook 16. 分隔线 → Separator(orient="horizontal") → 视觉分隔 三、运行数据-基本信息(LabelFrame: 基本信息) 17. 日期标签 → Label(text="日期") → 同工具栏联动 18. 日期输入 → DateEntry(name="run_basic_date", textvariable=run_data['date']) → 触发fill_prev_data_thread() 19. 班次标签 → Label(text="班次") → 无公式 20. 班次下拉 → Combobox(name="run_shift", textvariable=run_data['shift'], values=["早","中","夜"]) → 无公式 20. 天气标签 → Label(text="天气") → 无公式 21. 天气输入 → Entry(name="run_weather", textvariable=run_data['weather']) → 无公式 22. 节能措施标签 → Label(text="节能措施、事件") → 无公式 23. 节能措施输入 → Entry(name="run_measures", textvariable=run_data['energy_saving_measures'], width=80) → 无公式 24. 保存基本信息按钮 → Button(text="保存基本信息", command=lambda: save_run_data_by_section('basic_info')) → 只insert run_data.basic_info 四、运行数据-发电机组电量(旧表)(LabelFrame: 发电机组电量(旧表)) 25. 主表标题 → Label(text="洋浦电厂(主表)", font=('SimHei',12,'bold')) → 无公式 26. 表头序 → Label(text="序") → 无公式 27. 表头关口点 → Label(text="关口点名称") → 无公式 28. 表头CT → Label(text="CT") → 固定文字:800/5(220kV)、300/5(132kV) 29. 表头PT → Label(text="PT") → 固定文字:220/100(220kV)、110/100(132kV) 30. 表头零点底数 → Label(text="零点底数") → 无公式 31. 表头解后底数 → Label(text="解后底数") → 无公式 32. 表头并网前底数 → Label(text="并网前底数") → 无公式 33. 表头24点底数 → Label(text="24点底数") → 无公式 34. 表头倍率 → Label(text="合成倍率") → 固定数字:352000(220kV)、6600(132kV) 35. 表头本日电量 → Label(text="本日电量(栏次10)") → 公式:max(0,解后−零点)×倍率 36. 表头本月累计 → Label(text="本月累计电量(栏次11)") → 逐行累加上述本日电量 37. 8行关口点文字 → Label(只读)→ 固定表:220kV洋干Ⅰ线(正)、(反)、洋三线(正)、(反)、洋石线(正)、(反)、132kV厂站1#线、厂站2#线 38. 每行零点输入 → Entry(name="gen_elec_old{point}零点底数", textvariable=run_data['gen_elec_old{point}零点底数']) → 触发delayed_calculate_energy(point,"old") 39. 每行解后输入 → Entry(name="gen_elec_old{point}解后底数", ...) → 同上 40. 每行并网前输入 → Entry(name="gen_elec_old{point}并网前底数", ...) → 不用于计算 41. 每行24点输入 → Entry(name="gen_elec_old{point}24点底数", ...) → 用于累计 42. 每行CT显示 → Label → 固定文字:800/5或300/5 43. 每行PT显示 → Label → 固定文字:220/100或110/100 44. 每行倍率显示 → Label → 固定数字:352000或6600 45. 每行本日电量显示 → Label(name="gen_elec_old{point}daily", textvariable=run_data['gen_elec_old{point}daily']) → 实时公式:max(0,解后−零点)×倍率 46. 每行本月累计显示 → Label(name="gen_elec_old{point}monthly", textvariable=run_data['gen_elec_old{point}monthly']) → 累加上一行+本日电量 47. 主表上网电量标签 → Label(text="主表上网电量") → 公式:主表_net=Σ(正向本日电量)−Σ(反向本日电量) 48. 主表上网输入 → Entry(name="gen_elec_old_main_daily", textvariable=run_data['gen_elec_old_main_daily']) → 实时公式③ 49. 主表本月累计 → Entry(name="gen_elec_old_main_monthly", ...) → 累加公式③ 50. 副表上网电量标签 → Label(text="副表上网电量") → 同主表算法 51. 副表上网输入 → Entry(name="gen_elec_old_sub_daily", ...) → 同上 52. 保存旧表按钮 → Button(text="保存旧表电量", command=lambda: save_run_data_by_section('old_grid')) → 写electric_meter+daily_final旧表字段 五、运行数据-发电机组电量(新表)区块(LabelFrame: 发电机组电量(新表)) 53. 新表主表标题 → Label(text="洋浦电厂(主表)", bold) → 无公式 54. 新表倍率固定值 → Label → 220kV:276000,132kV:6600 55. 其余控件名、公式与旧表一一对应,前缀gen_elec_new_XXX 56. 保存新表按钮 → Button(text="保存新表电量", ...) → 写electric_meter+daily_final新表字段 六、运行数据-电量区块(LabelFrame: 电量) 57. 表头电量类型 → Label(text="电量类型") → 无公式 58. 表头四机组 → Label(text="#11机 #12机 #13机 #14机") → 无公式 59. 日发电量标签 → Label(text="日发电量 (万kWh)") → 横向小计:全厂日发电量=Σ(#11#14) 60. 日上网电量标签 → Label(text="日上网电量 (万kWh)") → 全厂日上网=Σ(#11#14) 61. 厂用电量标签 → Label(text="厂用电量 (万kWh)") → 全厂厂用电=Σ(#11#14) 62. 四机组日发电量输入 → Entry(name="daily_gen_11/12/13/14", textvariable=run_data['daily_gen_X']) → 触发横向小计 63. 四机组日上网输入 → Entry(name="daily_grid_X", ...) → 同上 64. 四机组厂用电输入 → Entry(name="plant_elec_X", ...) → 同上 65. 保存电量按钮 → Button(text="保存电量数据", command=lambda: save_run_data_by_section('electricity')) → 写daily_final电量+table3厂用电 七、运行数据-燃料区块(LabelFrame: 燃料) 66. 天然气日耗标签 → Label(text="天然气日耗 (万Nm³)") → 无公式 67. 天然气热值标签 → Label(text="天然气热值 (MJ/Nm³)") → 无公式 68. 发电单耗后台公式 → 后台计算 → 发电单耗=管网气量(万Nm³)/全厂发电量(万kWh)×1000→g/kWh 69. 保存燃料按钮 → Button(text="保存燃料数据", ...) → 写run_data.gas_daily+calorific 八、运行数据-水耗区块(LabelFrame: 水耗) 70. 工业水标签 → Label(text="工业水 (t)") → 无公式 71. 除盐水标签 → Label(text="除盐水 (t)") → 无公式 72. 保存水耗按钮 → Button(text="保存水耗数据", ...) → 写run_data.industrial_water+desalted_water 九、运行数据-启停区块(LabelFrame: 启停) 73. 启机方式标签 → Label(text="启机方式") → Combobox values=["冷","温","热","极热"] 74. 启机开始日期标签 → Label(text="启机开始时间") → DateEntry+Entry(时:分) 75. 启机结束日期标签 → Label(text="启机结束时间") → 同上 76. 启机时长显示 → Entry(name="start_duration_X", readonly=True, textvariable=run_data['start_duration_X']) → 公式:(结束−开始).total_seconds()/3600,保留2位 77. 停机同上 → 公式同76 78. 保存启停按钮 → Button(text="保存启停数据", ...) → 写table2启停机时间字符串+小数小时 十、运行数据-环保区块(LabelFrame: 环保) 79. 启机NOx超标起止 → DateEntry+Entry → 时长公式:max(0,结束−开始)/3600 80. 停机NOx同上 → 同上 81. 噪声检测 → Label+Entry → 无公式 82. 保存环保按钮 → Button(text="保存环保数据", ...) → 写run_data.nox_exceed+noise 十一、运行数据-缺陷区块(LabelFrame: 缺陷) 83. 跑冒滴漏条数 → Entry(name="leakage_X") → 整数 84. 闭环状态 → Combobox(name="closed_X", values=["是","否"]) → 无公式 85. 保存缺陷按钮 → Button(text="保存缺陷数据", ...) → 写run_data.leakage_count+closed_status 十二、运行数据-计划区块(LabelFrame: 计划) 86. 月计划 → Entry(name="monthly_plan") → 万kWh 87. 年计划 → Entry(name="annual_plan") → 万kWh 88. 保存计划按钮 → Button(text="保存计划数据", ...) → 写run_data.monthly/yearly_plan 十三、运行数据-底部大按钮 89. 保存全部 → Button(text="保存运行数据", style="Accent.TButton", command=save) → 写全表+智能分析 十四、节能数据-电子间空调区块 90. 空调台数 → Entry(name="ac_units_11_13", textvariable=energy_saving_data['ac_units_11_13']) → 节能量=台数×29×小时 91. 空调时长 → Entry(name="ac_hours", ...) → 同上 92. 空调节能量显示 → Label(name="ac_energy_11_13", textvariable=energy_saving_data['ac_energy_11_13']) → 实时公式:台数×29×小时 93. 总空调节能量 → Label(name="ac_energy_total", textvariable=energy_saving_data['ac_energy_total']) → Σ各组空调节能量 十五、节能数据-#11机组辅机区块 94. 滑油泵时长 → Entry(name="unit11_fuel_pump", ...) → 节能量=时长×37kW 95. 辅助油泵时长 → Entry(name="unit11_aux_pump", ...) → 节能量=时长×37kW 96. 顶轴油泵+抽油烟时长 → Entry(name="unit11_jacking_pump", ...) → 节能量=时长×(30+0.75)kW 97. 三项节能量显示 → Label(name="unit11_energy1/2/3", ...) → 实时计算同上三公式 十六、节能数据-#12机组辅机区块 98. 同#11,变量名unit12,功率相同 十七、节能数据-#13机组辅机区块 99. 凝结水泵时长 → Entry(name="unit13_cond_pump", ...) → 节能量=时长×200kW 100. 闭式水泵时长 → Entry(name="unit13_closed_pump", ...) → 节能量=时长×18.5kW 101. 除盐水泵时长 → Entry(name="unit13_demineral_pump", ...) → 节能量=时长×15kW 102. 真空滤油机时长 → Entry(name="unit13_vacuum_filter", ...) → 节能量=时长×120kW 103. 排烟风机时长 → Entry(name="unit13_fan", ...) → 节能量=时长×4kW 104. 五项节能量显示 → Label(name="unit13_energy1/2/3/4/5", ...) → 实时计算同上五公式 十八、节能数据-#14机组辅机区块 105. 同#13,变量名unit14,功率相同 十九、节能数据-总节能量区块 106. 总节能量显示 → Entry(name="total_saving", readonly=True, textvariable=energy_saving_data['total_saving']) → 公式:Σ(空调+全部泵节能量) 107. 保存节能大按钮 → Button(text="保存节能数据", command=save_energy_saving_data) → INSERT energy_saving_data全字段+弹分析窗 二十、设备可靠性数据录入区块 108. 设备选择标签 → Label(text="选择设备:") → 固定15项表:#11燃机…刀闸统计表 109. 添加记录按钮 → Button(text="添加记录") → 弹窗:序Entry+停止日期DateEntry+停止时间Entry(4位冒)+设备状态Combobox(备用/小修/中修)+启动日期DateEntry+启动时间Entry 110. 删除选中按钮 → Button(text="删除选中") → 确认后DELETE再INSERT 111. 保存可靠性按钮 → Button(text="保存数据") → 写device_reliability_data 二十一、数据查询区 112. 运行数据查询页签 → Label(text="运行数据查询") → 过滤:操作类型=运行数据,LIMIT 50 OFFSET (page-1)50 113. 可靠性/节能查询页签 → 同上,换表名 114. 查询按钮 → Button(text="查询") → 后台线程SELECT 115. 分页四按钮 → Button(text="首页/上一页/下一页/末页") → OFFSET公式同上 二十二、智能分析区 116. 趋势图标题 → Label(text="趋势图分析") → 无公式 117. 加载趋势按钮 → Button(text="加载30天趋势") → SQL:近30天`daily_final.日期、全厂合计、全厂上网、发电单耗`→plot(date,全厂合计) 二十三、系统菜单 118. 备份数据库 → Menu(label="备份数据库", command=backup_db) → 保留10份循环 119. 恢复数据库 → Menu(label="恢复数据库", command=restore_db) → 选中最新backup→copy2覆盖 120. 初始化数据库 → Menu(label="初始化数据库", command=init_database) → DROP+CREATE全部表,二次确认 121. 导出统计报表 → Menu(label="导出统计报表", command=export_statistics) → 任意起止汇总:总发电量=Σ(全厂合计),平均日发电量=AVG(全厂合计) 122. 查看日志 → Menu(label="查看日志", command=view_logs) → os.startfile打开logs/error_log_yyyymmdd.txt 所有公式已集中示,界面文字与控件名一一对应,可直接照单验收。 这是你需要做的软件的所有功能,你必须完全实现他不能漏
最新发布
11-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值