总​结​O​n​O​K​(​)​、​O​n​C​a​n​c​e​l​(​)​、​O​n​C​l​o​s​e​(​)​、​O​n​D​e​s​t​r​o​y​(​)​之​间​的​区​别

本文详细解析了MFC中对话框与窗口管理的核心函数,包括OnOK、OnCancel、OnClose及OnDestroy的区别与联系。阐述了这些函数如何在不同场景下工作,以及它们在应用程序退出过程中的具体作用。

 

第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。

第二,OnClose()和OnDestroy()  在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始) 

 (1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose() 

 (2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象 

 (3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy() 

 (4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环 

可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。

第三,OnOK()、OnCancel()()、OnClose()、OnDestroy() 

 CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;    

 CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;    

 OnClose()是响应   WM_CLOSE   的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。 

CDialog::EndDialog()-------->OnDestroy()                  OnClose()-------->OnDestroy()  EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,但两种机制都必须经过OnDestroy()

### 表达式理解 这个数学表达式 $\sum_{i = 0}^{n}\min_{\mu_j\in C}(\|x_i - \mu_j\|^2)$ 描述的是一个求和操作。 - 对于每一个 $x_i$($i$ 从 $0$ 到 $n$),需要在集合 $C$ 中找到一个 $\mu_j$,使得向量 $x_i$ 与 $\mu_j$ 之的欧几里得距离的平方 $\|x_i - \mu_j\|^2$ 最小。这里 $\|x_i - \mu_j\|^2$ 是欧几里得距离平方的计算公式,若 $x_i=(x_{i1},x_{i2},\cdots,x_{id})$ 和 $\mu_j = (\mu_{j1},\mu_{j2},\cdots,\mu_{jd})$ 是 $d$ 维向量,则 $\|x_i - \mu_j\|^2=\sum_{k = 1}^{d}(x_{ik}-\mu_{jk})^2$。 - 然后将所有这些最小的距离平方值累加起来,得到最终的果。 ### 求解步骤 以下是求解该表达式的详细步骤: 1. 初始化一个变量 `sum_value` 为 0,用于存储最终的求和果。 2. 遍历 $i$ 从 0 到 $n$: - 对于当前的 $x_i$,初始化一个变量 `min_distance_squared` 为一个非常大的值(如正无穷)。 - 遍历集合 $C$ 中的每一个 $\mu_j$: - 计算 $\|x_i - \mu_j\|^2$ 的值。 - 如果计算得到的距离平方小于 `min_distance_squared`,则更新 `min_distance_squared` 为当前计算得到的距离平方。 - 将 `min_distance_squared` 累加到 `sum_value` 中。 3. 返回 `sum_value` 作为最终果。 ### Python 代码实现 ```python import numpy as np def calculate_sum(x, C): sum_value = 0 for x_i in x: min_distance_squared = np.inf for mu_j in C: distance_squared = np.linalg.norm(x_i - mu_j) ** 2 if distance_squared < min_distance_squared: min_distance_squared = distance_squared sum_value += min_distance_squared return sum_value # 示例数据 x = np.array([[1, 2], [3, 4], [5, 6]]) C = np.array([[0, 0], [2, 2], [4, 4]]) result = calculate_sum(x, C) print("求和果:", result) ``` ### 复杂度分析 - **时复杂度**:该算法的时复杂度为 $O((n + 1)\times|C|)$,其中 $n+1$ 是 $x$ 中元素的数量,$|C|$ 是集合 $C$ 中元素的数量。 - **空复杂度**:空复杂度为 $O(1)$,只使用了常数级的额外空
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值