【求思路-急】CGridCtrl网格的一个问题

sophy520eangel 2011-06-27 02:45:36
最近负责功能一个软件模块的开发,模块中使用了开源的CGridCtrl控件 ,然后现在发现了一个问题:

假设原先单元格值为100,当我单击网格单元的时候,网格单元是高亮的这个时候我输入一个我自己想要的值(200)到网格中,此时,我再点击UI上别的控件,原先的单元格还是处于高亮并没有失去焦点,这个时候我发现我原先输入200的单元格中数据是显示的数据是改变了,但是当我获取该单元格数据的时候发现我获取的还是100,也就是在我输入200后单元格并没有失去焦点,触发通知消息,使我获取的值为200?

不知道描述的是否清晰,现在很纠结,有什么办法可以在我输入值后,让底层的值也更新如上变成我设置的200(在单元格编辑后仍高亮,未失去焦点情况下)

说下我自己的方法吧:我开始是在NOTIDY中让编辑的网格失去焦点的,但是发现不行,尝试别在别的函数地方让网格单元失去焦点也不行,都失败,不知道为什么,不知道该控件是否有相应的这样消息呢? (没有熟读源码 )

在这里求解,有过类似经历的,希望给个解决思路 === 在线等
...全文
222 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhao1756 2011-07-13
  • 打赏
  • 举报
回复
很明显你是在失去焦点时候把输入的值存起来,你可以改成当值改变的时候就存值
赵4老师 2011-06-29
  • 打赏
  • 举报
回复
mk:@MSITStore:C:\MSDN98\98VS\2052\period96.chm::/periodic/msj/F1/D8/S1DCC.htm
赵4老师 2011-06-29
  • 打赏
  • 举报
回复
The CFocusDlg Class

The application's functionality centers on the CFocusDlg class and its implementation of four message handlers (discussed below). Normal data exchange (DDX) and validation (DDV) using the routines provided by MFC take place in OnInitialUpdate(), when the dialog box is first displayed, and when the user chooses the OK button to accept the input. This is default behavior provided by ClassWizard when member variables are connected to dialog-box controls and can be examined in the dialog class DoDataExchange() function.

Validating control contents when switching focus from one control to the next is done by handling the EN_KILLFOCUS notification sent by the edit control that is losing focus. The idea here is to check the contents and, if they are not valid, to display the message box, inform the user, and then set the focus back to the control from which it came. Unfortunately, some difficulties arise when trying to set the focus (or display the message boxes) within a killfocus message handler. At this point, Windows is in an indeterminate state as it is moving focus from one control to the other. This is a bad place to do the validation and SetFocus() call.

The solution here is to post a user-defined message to the dialog box (parent) and do the validation and SetFocus() there, thus waiting for a safer time to do the work. (See "CFocusDlg::OnEditLostFocus()" in the file FOCUSDLG.CPP and "WM_EDITLOSTFOCUS user-defined message" in the file FOCUSDLG.H.)

赵4老师 2011-06-29
  • 打赏
  • 举报
回复
MSDN98里面搜的:
CBN_KILLFOCUS
The CBN_KILLFOCUS notification message is sent when a combo box loses the keyboard focus. The parent window of the combo box receives this notification message through the WM_COMMAND message.

CBN_KILLFOCUS
idComboBox = (int) LOWORD(wParam); // identifier of combo box
hwndComboBox = (HWND) lParam; // handle to combo box

QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winuser.h.

See Also
Combo Boxes Overview, Combo Box Messages, CBN_SETFOCUS, WM_COMMAND


sophy520eangel 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hustlaofan 的回复:]

CBN_KILLFOCUS
[/Quote]

能否具体点或者给个伪代码。。。
sophy520eangel 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

莫非要用SetForegroundWindow?
[/Quote]

测试发现没有用
hustlaofan 2011-06-27
  • 打赏
  • 举报
回复
CBN_KILLFOCUS
赵4老师 2011-06-27
  • 打赏
  • 举报
回复
莫非要用SetForegroundWindow?
sophy520eangel 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fjbuilding 的回复:]
我只用过MFC的CMFCPropertyGridCtrl,它确实是使用Notify消息来确定一个用户改变数据的动作的。当然如你所说,这个Notify消息的触发必须满足一个条件,就是GridCtrl失去焦点。

貌似我当时是让GridCtrl充满整个父对话框的^^(不是办法的办法)

我觉得实在不行的话可以这样,在“UI上别的控件”代码前面添加一些代码,用SendMessage向GridCt……
[/Quote]

现在使用的GRID就是我重写的,不过你说的这个方法我但是没有试过,原先想在单击事件上做下功夫,可是不行,不过试下你这个方法·
sophy520eangel 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 babilife 的回复:]
看最新版本的...
直接在源码上改
[/Quote]

看了最新版的,可是依然没有找到合适的方法
fjbuilding 2011-06-27
  • 打赏
  • 举报
回复



我只用过MFC的CMFCPropertyGridCtrl,它确实是使用Notify消息来确定一个用户改变数据的动作的。当然如你所说,这个Notify消息的触发必须满足一个条件,就是GridCtrl失去焦点。

貌似我当时是让GridCtrl充满整个父对话框的^^(不是办法的办法)

我觉得实在不行的话可以这样,在“UI上别的控件”代码前面添加一些代码,用SendMessage向GridCtrl发送Notify消息不就行了。

实在不行的话,可以在“UI上别的控件”代码前面像这样添加:
CMyGridCtrl *pMyGridCtrl = (CMyGridCtrl *)GetDlgItem(IDC_XXXX);//那个CGridCtrl的ID
pMyGridCtrl->MyNotify();

接着在MyNotify()里面更新数据值。不过这样做需要你继承CGridCtrl,自己写CMyGridCtrl。
至善者善之敌 2011-06-27
  • 打赏
  • 举报
回复
看最新版本的...
直接在源码上改
eye_119_eye 2011-06-27
  • 打赏
  • 举报
回复
开源的CGridCtrl控件 还真没用过
就想叫yoko 2011-06-27
  • 打赏
  • 举报
回复
去VC区问问看~
打开链接下载源码: https://pan.quark.cn/s/c43e5bd27521 标题中的“AMD and Nvidia GOP update 1.9.6.rar”表示这是一个包含了AMD与Nvidia显卡的GOP(Graphics Output Protocol)驱动程序升级至1.9.6版本的压缩文件。该更新主要针对显卡在UEFI(统一可扩展固件接口)环境下的图形输出性能进行优化,并致力于提升系统的稳定性。在描述中提及“显卡附加UEFI引导工具,最新版”,表明此次更新内含了一个专为UEFI BIOS环境设计的显卡引导工具,或许表现为一个自启动脚本或程序,例如GOPupd.bat。通过这一工具,用户能够在UEFI模式下对显卡进行精确的配置和初始化,从而保障操作系统能够最大化地发挥显卡的效能。必需的组件包括“colorama-0.4.3”,这是一个在Windows平台上用于管理颜色控制序列的Python模块,可能在更新过程中用于生成彩色命令行显示,以增强用户交互的直观性。此外,“Visual C++Redistributable”是微软提供的运行时支持库,旨在确保基于C++编译的应用程序能够正常运行,此处可能用于更新工具或相关依赖模块。标签“uefi bios”突显了该更新与UEFI BIOS系统的紧密关联,暗示其将作用于计算机的启动序列及硬件初始化过程。压缩包内的文件清单如下: 1. GOPupd.bat - 很有可能是负责执行GPU UEFI引导更新的核心脚本。 2. #Nvidia_ROM_Info.bat 和 #AMD_ROM_Info.bat - 这两个文档可能用于采集Nvidia与AMD显卡的ROM数据,以辅助识别显卡型号并执行适配性验证。 3....
代码下载地址: https://pan.quark.cn/s/a2e2c95e6128 意法半导体(STMicroelectronics)研发的STM32H750是一款性能优越的微控制器,属于STM32H7系列,拥有卓越的处理性能以及多元化的外设接口。在此项工作中,我们将研究如何借助STM32H750达成串口空闲中断(IDLE interrupt)的运用、借助DMA完成UART(通用异步收发传输器)的数据传输,并且探究如何运用STM32CubeMX配置并构建MDK5(Keil uVision5)项目。串口空闲中断是串口通信中的一个核心功能,当串口在一段时间内没有进行数据交换时,会引发该中断。这种功能在需要实时监测串口状态的应用场合中非常有价值,比如,在等待特定指令或需要降低能耗的情况下。在STM32H750中,设定串口空闲中断通常包含以下几个环节: 1. 串口设置:在STM32CubeMX中选定相应的UART接口,并激活中断功能。 2. 中断优先级设定:按照应用需设定中断优先级。 3. 中断服务函数注册:在程序代码中定义中断服务函数以应对中断事件。 4. 启用串口空闲中断:在初始化代码中激活串口的IDLE位,使能中断。 DMA(Direct Memory Access)传输是一种高效的数据传输机制,它允许外设直接与内存进行交互,无需CPU的介入,从而减轻了CPU的工作负担。在STM32H750中,我们可以运用DMA配合UART来接收数据: 1. DMA配置:在STM32CubeMX中为UART选择合适的DMA通道,并设定传输特性。 2. UART配置:将UART设置为DMA模式,并指定接收缓冲区的地址。 3. 中断配置:开启DMA传输完成中断,以便在数据接收完...

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧