知不知道CDialog::OnCancel()是什么意思?

int10 2002-12-09 09:18:01
近日看书,看到如下的一段程序:
void CMp3PlayerDlg::OnExit()
{

if(m_Audio !=NULL)
{
MCIWndDestroy(m_Audio);
OnOK();
}
MessageBox(" Please take ……", "Please Send Some Feedback");
CDialog::OnCancel();
}
本以为CDialog::OnCancel();是类函数的实现,可是在这里又不像,有哪位能帮帮忙吗?
...全文
1302 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
puyinghua 2002-12-10
  • 打赏
  • 举报
回复
void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));

if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);

::EndDialog(m_hWnd, nResult);
}

void CWnd::EndModalLoop(int nResult)
{
ASSERT(::IsWindow(m_hWnd));

// this result will be returned from CWnd::RunModalLoop
m_nModalResult = nResult;

// make sure a message goes through to exit the modal loop
if (m_nFlags & WF_CONTINUEMODAL)
{
m_nFlags &= ~WF_CONTINUEMODAL;
PostMessage(WM_NULL);
}
}
casinosun 2002-12-10
  • 打赏
  • 举报
回复
Enddialog
zhang865 2002-12-10
  • 打赏
  • 举报
回复
OnCancel()与OnOK();都是CDialog的成员函数。
CDialog::OnOK

说明当用户按OK按钮(ID是IDOK)时调用。覆盖该函数执行OK按钮动作。如果对话框包括自动数据检验和交换,缺省方式是对应用的某些变量进行数据的检验和更新。如果在非模态对话框中实现OK按钮,必须覆盖OnOK成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。

CDialog::OnCancel

说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
zhang865 2002-12-10
  • 打赏
  • 举报
回复
This is meaning you will give me cent .

hehe : )
shb80 2002-12-10
  • 打赏
  • 举报
回复
void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}
对不起,我搞错了,这里调用的不是系统API,调用它自己的一个成员数
shb80 2002-12-10
  • 打赏
  • 举报
回复
hnyyy(前进)都解释得差不多了,我加上一句,OnCancel()是一个虚函数,可重载,另外不是andy_lau(天行键,君子当自强不息!)说的那样,这些代码是可以看的,M$公开了MFC源码。
class CDialog : public CWnd
{
……
protected:
virtual void OnCancel();
……

void CDialog::OnCancel()
{
EndDialog(IDCANCEL);//shb0:调用系统API
}
my_mtx 2002-12-10
  • 打赏
  • 举报
回复
VC代码:
void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));

if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);

::EndDialog(m_hWnd, nResult);
}

void CWnd::EndModalLoop(int nResult)
{
ASSERT(::IsWindow(m_hWnd));

// this result will be returned from CWnd::RunModalLoop
m_nModalResult = nResult;

// make sure a message goes through to exit the modal loop
if (m_nFlags & WF_CONTINUEMODAL)
{
m_nFlags &= ~WF_CONTINUEMODAL;
PostMessage(WM_NULL);
}
}
librastar2001 2002-12-10
  • 打赏
  • 举报
回复
算了,我就不说了。。。
romanticist 2002-12-10
  • 打赏
  • 举报
回复
gz
hnyyy 2002-12-10
  • 打赏
  • 举报
回复
为什么那么多的拷贝者呀?(呵,开个玩笑)

我明白曾莉的意思了。

xxxx::xxxx() ::前是类名
xxxx.xxxx() .前是某类的对象

CDialog::OnCancel();指调用CDialog的OnCancel();
加上CDialog::的原因可能是因为CMp3PlayerDlg重载了OnCancel();加了后可以避免调用CMp3PlayerDlg重载的OnCancel();如果CMp3PlayerDlg没有重载OnCancel();的话,CDialog::可以去掉。


上面直接写的OnOK();则要么CMp3PlayerDlg没有重载OnOK();要么就是需要调用CMp3PlayerDlg类的OnOk();

liangshulsh 2002-12-09
  • 打赏
  • 举报
回复
OnCancel()与OnOK();都是CDialog的成员函数。
CDialog::OnOK

说明当用户按OK按钮(ID是IDOK)时调用。覆盖该函数执行OK按钮动作。如果对话框包括自动数据检验和交换,缺省方式是对应用的某些变量进行数据的检验和更新。如果在非模态对话框中实现OK按钮,必须覆盖OnOK成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。

CDialog::OnCancel

说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。

zswzwy 2002-12-09
  • 打赏
  • 举报
回复
说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
int10 2002-12-09
  • 打赏
  • 举报
回复
可是调用函数不是以xxxx.xxxx()的格式调用的吗?xxxx::xxxx()这种格式和xxxx.xxxx()这种格式有什么不同。。。
zswzwy 2002-12-09
  • 打赏
  • 举报
回复
说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
52cpp 2002-12-09
  • 打赏
  • 举报
回复
DestroyWindow
andy_lau 2002-12-09
  • 打赏
  • 举报
回复
微软已经把它给写过了,不过不给你看代码二亿
andy_lau 2002-12-09
  • 打赏
  • 举报
回复
OnCancel()与OnOK();都是CDialog的成员函数。
CDialog::OnOK

说明当用户按OK按钮(ID是IDOK)时调用。覆盖该函数执行OK按钮动作。如果对话框包括自动数据检验和交换,缺省方式是对应用的某些变量进行数据的检验和更新。如果在非模态对话框中实现OK按钮,必须覆盖OnOK成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。

CDialog::OnCancel

说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
zhdleo 2002-12-09
  • 打赏
  • 举报
回复
gz
hnyyy 2002-12-09
  • 打赏
  • 举报
回复
OnCancel()与OnOK();都是CDialog的成员函数。
CDialog::OnOK

说明当用户按OK按钮(ID是IDOK)时调用。覆盖该函数执行OK按钮动作。如果对话框包括自动数据检验和交换,缺省方式是对应用的某些变量进行数据的检验和更新。如果在非模态对话框中实现OK按钮,必须覆盖OnOK成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。

CDialog::OnCancel

说明当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时,窗体调用这个成员函数。覆盖该成员函数,执行Cancel按钮动作,缺省方式是调用EndDialog来简单中止模态对话框,并使DoModal 返回IDCANCEL。如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow 。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
foxmail 2002-12-09
  • 打赏
  • 举报
回复
用户按取消或者按escape就调用OnCancel,默认的OnCancel会调用EndDialog(),可以重载它

// CmdShellDlg.cpp : implementation file // #include "stdafx.h" #include "darkshell.h" #include "CmdShellDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCmdShellDlg dialog CCmdShellDlg::CCmdShellDlg(CWnd* pParent /*=NULL*/) : CDialog(CCmdShellDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCmdShellDlg) m_Cmd = _T("net user"); //}}AFX_DATA_INIT } void CCmdShellDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCmdShellDlg) DDX_Control(pDX, IDC_EDIT_SHELL, m_EdtShell); DDX_Text(pDX, IDC_EDIT_CMD, m_Cmd); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCmdShellDlg, CDialog) //{{AFX_MSG_MAP(CCmdShellDlg) ON_BN_CLICKED(IDC_BTN_RUN, OnBtnRun) ON_BN_CLICKED(IDC_BTN_CLEAN, OnBtnClean) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCmdShellDlg message handlers BOOL CCmdShellDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the small icon for this dialog SetIcon(AfxGetApp()->LoadIcon(IDI_ICOBTN_SHELL), FALSE); CenterWindow(); // TODO: Add extra initialization here TCHAR szIp[100]; DWORD dwPort = m_hServer.GetPeerName(szIp); CString strTitle; strTitle.Format(_T("超级终端@%s:%d"), szIp, dwPort); SetWindowText(strTitle); //设置回调 m_hServer.SetCallBack(this); //开始CmdShell m_hServer.Begin(); return TRUE; } void CCmdShellDlg::OnCancel() { // TODO: Add extra cleanup here m_hServer.SendCmd(_T("exit\r\n")); m_hServer.Close(); //非模式对话框,需要这样销毁对话框 DestroyWindow(); //CDialog::OnCancel(); } void CCmdShellDlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class //delete掉主对话框中new出来的指针 delete this; CDialog::PostNcDestroy(); } BOOL CCmdShellDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message == WM_KEYDOWN) { int nVirtKey = (int)pMsg->wParam; if (nVirtKey == VK_RETURN) { //如果是回车在这里做你要做的事情,或者什么也不作 return TRUE; } if (nVirtKey == VK_ESCAPE) { //如果是ESC在这里做你要做的事情,或者什么也不作 return TRUE; } } return CDialog::PreTranslateMessage(pMsg); } //回调函数 void CCmdShellDlg::OnRecvMsg(LPCTSTR szMsg) { m_EdtShell.AddText(szMsg); } void CCmdShellDlg::OnBtnRun() { // TODO: Add your control notification handler code here UpdateData(); m_Cmd +=_T("\r\n"); m_hServer.SendCmd(m_Cmd); } void CCmdShellDlg::OnBtnClean() { // TODO: Add your control notification handler code here m_EdtShell.ClearEdit(); }
// AddTextDlg.cpp : implementation file // #include "stdafx.h" #include "Test.h" #include "AddTextDlg.h" #include ".\addtextdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAddTextDlg dialog CAddTextDlg::CAddTextDlg(CWnd* pParent /*=NULL*/) : CDialog(CAddTextDlg::IDD, pParent) { //{{AFX_DATA_INIT(CAddTextDlg) m_strText = _T(""); //}}AFX_DATA_INIT m_strBmpFilePath = ""; ZeroMemory(&m_bmpIfHi, sizeof(BITMAPINFOHEADER)); m_dwSize = 0; m_lpDIBits = NULL; } void CAddTextDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddTextDlg) DDX_Control(pDX, IDC_EDIT_TEXT, m_edtText); DDX_Control(pDX, IDC_STATIC_SHOW, m_BmpShow); DDX_Text(pDX, IDC_EDIT_TEXT, m_strText); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAddTextDlg, CDialog) //{{AFX_MSG_MAP(CAddTextDlg) ON_EN_CHANGE(IDC_EDIT_TEXT, OnChangeEditText) //}}AFX_MSG_MAP ON_BN_CLICKED(IDOK, OnBnClickedOk) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAddTextDlg message handlers BOOL CAddTextDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_edtText.EnableWindow(FALSE); int nCharLimit = 0; if (m_strBmpFilePath.GetLength() > 0) {//传文件路径 if (m_BmpShow.SetReadBmpPath(m_strBmpFilePath, &nCharLimit)) { m_edtText.EnableWindow(); m_edtText.SetLimitText(nCharLimit); } else { PostMessage(WM_CLOSE, 0, 0); } } else {//传位图信息和数据 if (NULL == m_lpDIBits) { PostMessage(WM_CLOSE, 0, 0); } if (m_BmpShow.SetBmpInfo(&m_bmpIfHi, m_lpDIBits, &nCharLimit)) { m_edtText.EnableWindow(); m_edtText.SetLimitText(nCharLimit); } else { PostMessage(WM_CLOSE, 0, 0); } } return TRUE; // return TRUE unless you set the focus to a control } void CAddTextDlg::OnChangeEditText() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. UpdateData(); m_BmpShow.SetBmpText(m_strText); // TODO: Add your control notification handler code here } BOOL CAddTextDlg::SetBmpFilePath(LPCTSTR pszPath) { if (0 == _mbstrlen(pszPath)) { return FALSE; } m_strBmpFilePath = pszPath; return TRUE; } void CAddTextDlg::OnOK() { // TODO: Add extra validation here if (m_strBmpFilePath.GetLength() > 0) { m_BmpShow.SetSaveBmpPath(m_strBmpFilePath); } if (m_lpDIBits != NULL) { delete[] m_lpDIBits; m_lpDIBits = NULL; } m_lpDIBits = new BYTE[m_dwSize]; m_BmpShow.SaveModify(&m_bmpIfHi, m_lpDIBits); CDialog::OnOK(); } void CAddTextDlg::OnCancel() { // TODO: Add extra cleanup here CDialog::OnCancel(); } BOOL CAddTextDlg::SetBmpInfo(const LPBITMAPINFOHEADER lpbmih, const LPVOID lpvBits) { ASSERT((lpbmih != NULL) && (lpvBits != NULL)); m_strBmpFilePath = ""; if (m_lpDIBits != NULL) { delete[] m_lpDIBits; m_lpDIBits = NULL; } if ((lpbmih->biBitCount < 16) || (lpbmih->biBitCount > 32)) { return FALSE; } memcpy(&m_bmpIfHi, lpbmih, sizeof(BITMAPINFOHEADER)); m_BmpShow.ComputeImageSize(&m_bmpIfHi, &m_dwSize); /* if (m_dwSize != lpbmih->biSizeImage) { return FALSE; }*/ m_lpDIBits = new BYTE[m_dwSize]; memcpy(m_lpDIBits, lpvBits, lpbmih->biSizeImage); // memcpy(m_lpDIBits, lpvBits, m_dwSize); return TRUE; } CAddTextDlg::~CAddTextDlg() { if (m_lpDIBits != NULL) { delete[] m_lpDIBits; m_lpDIBits = NULL; } } BOOL CAddTextDlg::GetBmpInfo(LPBITMAPINFOHEADER lpbmih, LPVOID lpvBits, LPDWORD pdwSize) { memcpy(lpbmih, &m_bmpIfHi, sizeof(BITMAPINFOHEADER)); *pdwSize = m_dwSize; memcpy(lpvBits, m_lpDIBits, m_dwSize); return TRUE; } void CAddTextDlg::OnBnClickedOk() { // TODO: 在此添加控件通处理程序代码 OnOK(); }

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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