MFC窗口调用DestroyWindow()以后,窗体对应的cpp内的变量中的赋值在下次加载该窗口时依然存在 5C

该问题的窗体由父窗口mainWindow和子窗口childWindow组成。
其中mainWindow、childWindow窗口在工程文件中对应的文件分别为

mainWindow.h mainWindow.cpp(父窗口)

childWindow.h childWindow.cpp(子窗口)

其中子窗口由VS窗口向导创建。
在父窗口中按下按钮,子窗口显示,按下子窗口中按钮,赋值然后子窗口关闭,已经确定
子窗口OnClose()时调用DestroyWindow()并且在PostNcDestroy()确认其hWnd已经=NULL
以下是调用代码。

//父窗口调用子窗口代码如下(mainWindow.cpp)
#include childWindow.h;

//某个方法中
{
      childWindow childWindowDlg;
      childWindowDlg.DoModal();
}


//子窗口变量赋值代码如下(childWindow.cpp)
vector<CString> shipcode;
//然后在某个方法中
{
      int shipSize = shipcode.size();
            //然后这里就是问题所在了,第一次启动该窗口时执行该方法时shipSize为0,将此vector赋值以后(如添加了3个"a""b""c");然后将窗口关闭并且确认调用了DestroyWindow()以后,在父窗口中的子窗口窗口调用代码(就是上面的父窗口的代码)再次被调用然后子窗口创建完成后,再次执行此子窗口的方法,发现shipSize为3也就是上一次子窗口被关闭前该变量被赋的值。
}

请问大家该问题怎么解决,我想每次启动子窗口shipSize都为0,本人MFC学习不多,临时需求要写。因为需求关系不能使用QT,希望大家帮帮忙呀。

c++

2个回答

这有啥好纠结的,退出时候把vector清空就是了,clear函数

DestroyWindow()销毁的是窗口,而不是窗口类,变量当然还在
可以这么写
childWindow * childWindowDlg = new childWindowDlg();
childWindowDlg->DoModal();

foomow
茂大叔独立游戏开发 MFC啊,现在还有人用么?VS2019都默认不安装了……貌似问题不在这里,能不能有更完整点的代码啊?
5 个月之前 回复
qq_30088223
Akira45 情况还是一样,变量值依然在的
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
窗口DestroyWindow时异常!
在运行DestroyWindow消毁窗口时,出现断言异常rn位置在DestroyWindow函数中,文件wincore.cpp的1008行:rnif (hWndOrig != NULL)rnrn // Note that 'this' may have been deleted at this point,rn // (but only if pWnd != NULL)rn if (pWnd != NULL)rn rn // Should have been detached by OnNcDestroyrn#ifdef _DEBUGrn ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);rn#endifrn rn elsern rn#ifdef _DEBUGrn ASSERT(m_hWnd == hWndOrig);// 异常点rn#endifrn // Detach after DestroyWindow called just in casern Detach();rn rnrnrn这个异常在DEBUG版本中出现,其它的程序中也使用了CWnd类,但是在DestroyWindow时,都是正常的,只有这个程序会出现在这个问题。rn请问各位,这个断言异常出现的原因是什么?怎样才能避免这种情况出现?
MFC DestroyWindow窗口对象和窗口句柄的销毁
考虑单窗口情况:   假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:   1. 手工调用pWnd->DestroyWindow();   2. DestroyWindow会发送WM_DESTROY;   3. WM_DESTROY对应的消息处理函数是OnDestroy();   4. DestroyWindow会发送
自己Create的窗口是否要调用DestroyWindow()
比如在TAB中的子窗口rn //创建子窗口rn m_dlg_adobe.Create( DLG_APPLICATION , GetDlgItem( TAB_APPLICATION) ) ;rn m_dlg_media.Create( DLG_APPLICATION_MEDIA , GetDlgItem( TAB_APPLICATION)) ;rn //Tab中加入两个标签rn m_tab_application.InsertItem( 0 , "Adobe Acorbat Reader") ;rn m_tab_application.InsertItem( 1 , "MediaPlayer" ) ;rn //取得Tab的大小rn CRect rect ;rn m_tab_application.GetClientRect( &rect ) ;rn rect.top += 20 ;rn rect.left += 4 ;rn rect.bottom -= 4 ;rn rect.right -= 4 ;rn //称动窗口rn m_dlg_adobe.MoveWindow(&rect) ;rn m_dlg_media.MoveWindow( &rect ) ;rn m_dlg_adobe.ShowWindow( TRUE ) ;rnrnrn象这样的窗口要不要自己去调用DestroyWindow()rnrn找不到相关的文档说明..rnrn还有,,在Windows98下,当窗口打开多了,就会出现资源不足的情况出现,大概只能有180个窗口(dialog)即子窗口和主窗口都算就再也不能继续打开了.一般不是内存的问题.因为我的内存是:1G的..对于此大家不知有何高见?
MFC中调用Console窗口
第一种方法: void InitConsoleWindow() { int nCrt = 0; FILE* fp; AllocConsole(); nCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); fp = _fdopen(nCrt, "w"); *stdout = *fp; s
手动调用DestroyWindow时导致的窗口两次被销毁
我自己写了一个函数,里面调用DestroyWindow来销毁了。 但是WM_CLOSE的响应没有重写,所以按下close后,系统又重新送出了DestroyWindow的消息,所以窗口被销毁了两次。从而导致HDC已经被销毁过。 最后重写WM_CLOSE解决。 case WM_CLOSE: {      PostQuitMessage(0);      return 0; } 只让cl
窗口类成员变量的调用
我想在窗口类CLOGON中调用Cregister窗口类中的成员变量CString namelib, 这里我在Cregister窗口类中已经对namelib进行赋值了,现在想在CLOGON中调用这个变量的值。我的做法是把name设置成了静态成员变量,可是出现了一个连接错误如下:rnLOGON.obj : error LNK2001: unresolved external symbol "public: static class CString Cregister::namelib" (?namelib@Cregister@@2VCString@@A)rnregister.obj : error LNK2001: unresolved external symbol "public: static class CString Cregister::namelib" (?namelib@Cregister@@2VCString@@A)rnrn是不是应该对静态成员变量进行初始化,我试过了一些方法也没解决,我该怎么做呢?
MFC 窗口调用问题
在MFC单文档工程中通过Create创建了一个新的对话框视图在文档中显示出来,当点击工具条中的某个按钮,希望改变这个对话框中某个控件使其变为不可用,调用方式为:创建该对话框类的对象,然后通过对象直接设置为不可用。程序编译没有错误,可是运行到这个地方就出错,不知如何才能正确使用,希望各位指教。
mfc窗口调用问题
我利用mfc编的是一个学生学籍管理系统,想在运行时不是调用默认的MY DIALOG窗体,而是想调用登陆窗体,请问各位大侠怎么实现~~~谢谢大家,在线等~!
MFC窗口调用
帮助初学者了解如何使用MFC,以及如何自己使用MFC去做简单的界面。
关于DESTROYWINDOW函数和窗口的问题
我在创建mfc应用程序,想利用DestroyWindow();这个函数来实现主框架窗口的退出,在rnvoid CMainFrame::OnExit() rnrn // TODO: Add your command handler code herern DestroyWindow();rn rnrn的时候功能可以实现,但是在对话框的一个按钮控件中实现应用程序的退出的时候也是利用上面的方法,rn但是不好用,是不是因为对话框窗口是弹出窗口,Destroywindow();只是对主框架窗口才会起作用。rn我觉得主框架窗口和对话框窗口都是MFC的窗口,为什么会有这样的区别呢?请具体解答一下
MFC——在视图窗口加载背景图片
1.若是文档视图程序的话,在视图类的OnDraw(CDC* pDC)函数中调用pDC-&gt;TextOut()函数,就像平常输出文字一样。若是嫌文字的背景颜色破坏了图像,可以在输出文字之前调用pDC-&gt;SetBkMode(TRANSPARENT); 2.若是在对话框应用程序中,就在对话框类的OnPaint()函数中创建一个局部对象CPaintDC dc(this);然后dc.TextOut...
为何窗口依然一闪而过
我在程序里已经写了rn#includernrnrngetch();rnrn可是为什么依旧是运行时窗口一闪就消失,看不到结果啊rn
在asp.net中调用数据窗口,给数据窗口的日期字段赋值
dwOcx.SetItem(1, "fsrq", new Date("<%=DateTime.Now%>"));这是我在.net中的写法,字段fsrq在PB中是时间类型(datetime),赋值后还是空的,string类型的没有问题。
窗口赋值
如果对弹出窗口赋值.rnSGroup oPen = new SGroup(this);rnoPen.Show();rn赋值代码是写在这个下面.rn或者写在打开下面呢.rn才学习,请指教.
MFC 中当前窗口对象的m_hWnd变量。
MFC 中当前窗口对象的m_hWnd变量。
如何实现 创建一个窗口,如果该窗口已经存在就显示该窗体?
每次 启动程序(注意是启动程序) ,我用 CreateMutex 判断该窗体是否存在,我的想法是使用ShowWindow 显示窗口,可在此处如何取已存在窗口的句柄?rn请高手帮忙
自己写的cpp,如何调用MFC窗口的控件?
如题,我尝试将窗口的头文件添加进自己写的cpp中,但是会报错,会显示enum IDD = IDD_VOD_DIALOG ;这个会报错,显示没有定义,我尝试添加“Resource.h”进文件,但依旧报错。老大和我说可以传参数来解决这个问题,但是不怎么会,或者有没有其他办法啊?
变量没有赋值,依然运行?
[code=C/C++]#includernmain()rnrnchar ch;rnch>96&&ch<123?printf("Lower Letter\n"):printf("Error\n");rn[/code]rnrn这样一段代码为什么还能运行?rnrn注:ch没有赋值!rnrn[code=C/C++]#includernmain()rnrnchar ch;rnch=getchar();rnch>96&&ch<123?printf("Lower Letter\n"):printf("Error\n");rn[/code]rnrn功能:当输入的字符为小写时,输出Lower Letter;其他字符则输出Error。
窗口加载时等待动画
开始想要用gif格式的动画图片作为等待图片
窗口加载时刷新多一次
在head加下面一段js ,就ok了          function fresh()  {  if(location.href.indexOf("?reload=true")    {     location.href+="?reload=true";     }  }  setTimeout("fresh()",0)
窗口加载时的排列问题
MDI子窗体,打开时怎么才能使第二个窗体在第一个窗体的右下方(只偏移一点),依次类推,下一个窗体都在上一个窗体的右下方(打开的顺序是不固定的),而且单击菜单栏后,以前打开的窗体可以显示在最前面。rn我现在只能用form.show,都不能用form,show 1之类的,系统提示mdi子窗体不能时有模式的
如何在dll中创建窗口,并调用该窗口
注入dll到一个软件中,如何启动dll中的窗口涅?
pb中调用拨号网络窗口时存在的问题
在98中运行下面的语句正确rnrnWinExec('rundll32.exe rnaui.dll,RnaDial '+'我 的 连 接 ',9)rnrn可在2000中运行,提示找不到rnaui.dll,我也查了一下,在2000中确实没有这个DLLrnrn那在2000中应该如何编写这条语句呢。请高手帮忙
MFC调用窗口Tab控件
CDialogShowLog dialogfilelist;rnrndialogfilelist.m_tabCtrl.InsertItem(0,"123");rnrn请问一下,我想给tab控件添加标题,为什么这样会报错?CDialogShowLog类我之前已经定义了,而且我也添加了m_tabCtrl变量
C#调用MFC 窗口 DLL
MFC DLL 创建一个窗口类,加public和AFX_EXT_CLASS MFC DLL属性 注意 MFC的使用:在共享DLL中使用MFC 公共语言运行时支持:公共语言运行时支持(/clr) 在预处理器中添加_AFXEXT 在项目名称.cpp里添加要输出的函数 注意第一行AFX_MANAGE_STATE(AfxGetStaticModuleState(
MFC调用DOS窗口显示信息
AllocConsole Function 为主调进程分配一个新的控制台。     语法 C++ :     BOOL WINAPI AllocConsole(void);     参数:   无     返回值 :如果函数成功,返回值是非零值;如果函数失败,返回值是零值。     备注:   一个进程仅能关联一个控制台,所以该函数在主调进程已经具有控制台时将会失败。       一
请问 MFC 窗口调用问题
请问如何在当前按纽的 Click 事件下调用另一个窗口 ?谢谢
MFC绘图_OSG窗口调用
之前在新浪博客上写过几篇图形学方面的博客,但是可能不是专门为显示代码而设计,很多代码的显示,在
mfc中的切分窗口
MFC的动态切分窗口  1. 分类    动态切分- 在程序运行时,由用户根据需要实时的切分窗口.最大切分数量是2*2个    动态切分的视图窗口使用的是同一个视图类.    静态切分 - 在程序编写时,由程序员确定的窗口切分,最大切分数量是16*16个.      而且,静态切分的每个视图窗口,可以使用不同的视图类    2. 相关类     CSplitterWnd类 - 提供
MFC中窗口重绘
2013-12-12 MFC提供了三个函数用于窗口重绘   ( 在刷新窗口时经常要调用重绘函数) InvalidateRect(&Rect) Invalidate() UpdateWindow() 当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和 WM_NCPAINT    (通知非客户区有变化) WM_NVPAINT  
MFC中创建窗口?
我想实现一个类似CToolTipCtrl的功能,我想在需要的时候弹出一个提示框,不需要得时候隐藏这个提示框,但CToolTipCtrl控件好像要与其它控件绑定才能用,所以我想自己创建一个窗口,然后在这个窗口中输出一些文字,请问该如何实现?rnrn下面是我摘的代码,但是运行时却产生一个ASSERT错误,也不知原因在哪,还希望高手指导一下。rnrn[code=C/C++]rnvoid CTestDlg::OnBtnShow() rnrn // TODO: Add your control notification handler code here rn CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,rn 0,(HBRUSH) (COLOR_BTNFACE+1), 0);rn rn if (!CWnd::CreateEx(0, szClassName, _T(""), WS_VISIBLE|WS_POPUP, 0, 0, 100, 100,rn this->GetSafeHwnd(), 0, NULL))rn return; rnrn[/code]
mfc中的窗口问题
在mfc中,怎么才能让用户不能改变窗口的大小,是不能用鼠标拖动。
双窗口各异.cpp
1.创建两个窗口,分别显示在屏幕上。 2.用drawimage,显示图片。
MFC中的OpenGL窗口
建立一个基于对话框的工程(名称:OpenGL)并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib 为对话框添加picture control 控件,ID:IDC_RENDER主要程序:// OpenGLDlg.cpp : implementation file//#include "stdafx.h"#include "OpenGL.h
MFC中切分窗口
MFC中切分窗口MFC中切分窗口MFC中切分窗口MFC中切分窗口
MFC中窗口创建
(1):加载菜单 (2):调用CreateEx函数,注册窗口类并创建窗口           a:调用PreCreateWindow函数,设计并注册窗口类           b:调用AfxHookWindowCreate函数                利用WIN32的API函数SetWindowsHookEx在程序埋下一个类型为WHCBT的钩子                将自己
C#调试时变量窗口
请问在C#中调试的时候,那个变量窗口在哪里打开?rn
MFC中的窗口
MFC 窗口:  重叠窗口(Overlapped),弹出窗口(Popup),子窗口(Child)    MFC窗口不对窗口进行直接的控制,而在API环境中却是可以的。如果不能在API环境中实现某项功能,那么  肯定也不能在MFC环境中实现。举例来说,MFC库的CWnd可以创建一个窗口,但它只是过去在API环境中使用  API调用的封装。    创建MFC窗口是复杂的,首
MFC创建窗口时的问题
最近在学习使用MFC,想要创建一个窗口,结果运行以后不显示窗口,但是任务管理器中有这个程序。。。。我好郁闷啊,不知道哪的问题,哪位大哥帮忙找一下啊,谢谢了。代码如下: (只有一个cpp文件,用的是VC7.1中文版,建立的是个空项目,往里面添加的cpp文件)rnrn#include rn#include rnrnLRESULT CALLBACK WinSunProc(rnHWND hwnd, rnUINT uMsg, rnWPARAM wParam, rnLPARAM lParam rn); rnrnrnrnint WINAPI WinMain(rnHINSTANCE hInstance, rnHINSTANCE hPrevInstance, rnLPSTR lpCmdLine, rnint nShowCmd rn)rn rnWNDCLASS wndclass;rnwndclass.cbClsExtra = 0;rnwndclass.cbWndExtra = 0;rnwndclass.hbrBackground=(HBRUSH)(GetStockObject(BLACK_BRUSH));rnwndclass.hCursor = LoadCursor(NULL ,IDC_CROSS);rnwndclass.hIcon = LoadIcon(NULL ,IDI_ERROR);rnwndclass.hInstance = hInstance;rnwndclass.lpfnWndProc = WinSunProc;rnwndclass.lpszClassName = "My window";rnwndclass.lpszMenuName=NULL;rnwndclass.style = CS_HREDRAW | CS_VREDRAW; rnRegisterClass(&wndclass);rnrnHWND hWnd;rnhWnd = CreateWindow("My window" ,"my MFC" , WS_OVERLAPPEDWINDOW | WS_VISIBLE,rn0 ,0 ,600 ,400 ,NULL ,NULL ,hInstance ,NULL);rnrnShowWindow(hWnd ,SW_SHOWNORMAL);rnUpdateWindow(hWnd);rnrnMSG msg;rnwhile (GetMessageA(&msg ,NULL ,0 ,0))rnrnTranslateMessage(&msg);rnDispatchMessageA(&msg);rnrnrnreturn 0;rnrnrnrnLRESULT CALLBACK WinSunProc(rnHWND hwnd, rnUINT uMsg, rnWPARAM wParam, rnLPARAM lParam rn)rnrnswitch (uMsg)rnrncase WM_PAINT:rnHDC hdc;rnPAINTSTRUCT ps;rnhdc = BeginPaint(hwnd ,&ps);rnTextOut(hdc ,0 ,50 ,"wm_paint !!" ,strlen("wm_paint !!"));rnEndPaint(hwnd ,&ps);rnbreak;rncase WM_CHAR:rnchar szChar[20];rnsprintf(szChar ,"char is %d !!" ,wParam);rnMessageBox(hwnd ,szChar ,"WM_CHAR" ,0);rnbreak;rncase WM_CLOSE:rnif (IDYES == MessageBox(hwnd ,"是否真的结束 !!" ,"close" ,0))rnrn//SendMessage(HWND ,WM_DESTROY ,wParam ,lParam);rnDestroyWindow(hwnd);rnrnbreak;rncase WM_DESTROY:rnPostQuitMessage(0);rnbreak;rncase WM_LBUTTONDOWN:rnMessageBox(hwnd ,"mouse clicked !!" ,"WM_LBUTTONDOWN" ,0);rnHDC hDc;rnhDc = GetDC(hwnd);rnTextOut(hDc ,0 ,0 ,"wm_lbuttondown" ,strlen("wm_lbuttondown"));rnReleaseDC(hwnd ,hDc);rnbreak;rndefault:rnDefWindowProc(hwnd ,uMsg ,wParam ,lParam);rnbreak;rnrnreturn 0;rnrn
窗口加载
网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代码的时候,可以确保要操作的对象已经加载完成。 二.通过window.onload来执行脚本代码。 第一种方式感觉比较凌乱(其实推荐使用),往往我们需要将脚本代码放在一个更为合适的地方,那么windo...
相关热词 c#panel增加滚动条 c#中生成的dll文件 c# 模板类 c# 截取txt文本内容 c# 内存 占用 c#时间格式化 不带- c#替换字符串中指定位置 c# rdlc 动态报表 c# 获取txt编码格式 c#事件主动调用