-
January 15th, 2021, 05:47 AM
#1
Reopen the Dialog.
Hi,
As per discussion one month back, I tried to create the MFC dialog from the existing one. But now when trying to test various scenarios, i am facing the issue. Actually, the dialog is created and handle is stored in the global.
Now when I close this window and parent dialog, and reopen, them, (using the global handle, which is non null), i am not seeing the dialog, popping up again.
The codefor the child window is :
Code:
#pragma warning (push, 3)
#include "stdafx.h"
#include "bcvcpch.h"
#include "resource.h"
#include "TACResultAnalysisDlg.h"
#include "TACPlanDlgMgr.h"
#include "TACPlanDataMgr.h"
#include "plmn.h"
#include "FilterComboBox.h"
#include "Filters.h"
#include "RegistryCache.h"
#include "IVectorContainer.h"
#include "DataMgr\DataManager.h"
#include "DataMgr\ILogicalLayerManager.h"
#include "MultiTechCell.h"
#include "TechCellParams.h"
#include "GSMCellParams.h"
#include "ConfigCarrierBase.h"
#include "CellCarrierBase.h"
#include "Is95SectorCarrier.h"
#include "view\distance.h"
#include "distancechanger.h"
#include "3g.hh"
#include "asset.hh"
#include "enterprise.hh"
#include "version.h"
#include "LicenseNames.h"
#include "security.h"
#include "ai_DBCore.h"
#include "CoreSecurity.h"
#include "GlobalTechTypeGuru.h"
#include "GlobalObjectTypeGuru.h"
#include "BO_FilterHelper.h"
#include "progress.h"
#include "WindowPlacementHelper.h"
#include "ai_stdgui.h"
#include "Reporter.h"
#include "..\Core\UserGroupInstance.h"
#include "..\Core\UserGroupManager.h"
#include "..\Core\DBUser.h"
#include "LogicalLayerManager.h"
#include "DataManager.h"
#include "DataMgr\BO_DBHelper.h"
#include "ai_dbguiAFX.h"
#include "ai_msg.h"
#include "sybase.h"
#include <sstream>
#include "view\masterview.h"
#include "RendererTypes.h"
#include <shlobj.h>
//#include "sitedlg.h"
//#include "aicommondlgs.h"
#include "ForeignLanguageSupport.h"
using namespace ForeignLanguageSupport;
#pragma warning (pop)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static const char* INI_FILE_SECTION = "TACResultAnalysisSiteTree";
static const char* INI_FILE_INTFCOLUMNS = "TACResultAnalysisCellDetails";
const int SRC_COL_CENTRAL_SITE = 0;
const int SRC_COL_SITES = 1;
TACResultAnalysisDlg::TACResultAnalysisDlg(CWnd* pParent /*=NULL*/)
: AIMFCDialog(TACResultAnalysisDlg::IDD, pParent),
m_AnalysisFilter(NULL),
m_OWLModule(NULL),
m_OWLWindow(NULL),
m_nOldFilterSelIndex(-1),
m_nOldSiteSelIndex(-1),
m_bSiteListSetup(false),
m_bInFilterControlCreate(false)
{
//{{AFX_DATA_INIT(TACResultAnalysisDlg)
//}}AFX_DATA_INIT
m_oldHeight = 650;
m_oldWidth = 900;
m_minDlgWidth = 0;
m_minDlgHeight = 0;
m_nLastDlgWidth = 0;
m_nLastDlgHeight = 0;
m_DispMode = TGNETWORK_UNKNOWN;
m_nSortedColumn = 0;
m_szSearchText = "";
m_bRenderOn2DView = false;
}
TACResultAnalysisDlg::~TACResultAnalysisDlg()
{
delete m_AnalysisFilter;
delete m_OWLModule;
}
void TACResultAnalysisDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDCANCEL, m_CloseButton);
DDX_Control(pDX, IDC_TAC_SITE_LIST, m_SiteTree);
}
BEGIN_MESSAGE_MAP(TACResultAnalysisDlg, AIMFCDialog)
//{{AFX_MSG_MAP(TACResultAnalysisDlg)
ON_BN_CLICKED(IDCANCEL, OnCloseMessage)
ON_WM_CLOSE()
ON_WM_SIZE()
ON_WM_GETMINMAXINFO()
ON_WM_HELPINFO()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_APPLYTOSITEDB, &TACResultAnalysisDlg::OnBnAppltSiteDB)
END_MESSAGE_MAP()
BOOL TACResultAnalysisDlg::OnInitDialog()
{
CDialog::OnInitDialog();
WindowPlacementHelper::RestorePosition(m_hWnd, GetUniqueName(),0, 0, SW_HIDE);
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect DlgRect;
GetWindowRect(&DlgRect);
m_minDlgWidth = DlgRect.Width();
m_minDlgHeight = DlgRect.Height();
m_DispMode = TgNetType::TGNETWORK_LTE;
LangSpecificSymbolSupport objLSSS;
std::string strsymbol = objLSSS.ReturnSymbol(LanguageSpecificSymbol::SQUARE);
CString strSquare = strsymbol.c_str();
switch (m_DispMode)
{
case TGNETWORK_LTE:
CellColStrings.push_back(CellColData("Central Site [ TAC ]",50));
CellColStrings.push_back(CellColData("List of Sites",50));
break;
}
CString windowText;
if (m_DispMode == TGNETWORK_UNKNOWN)
{
windowText = "No TAC Result in memory";
}
else
{
windowText = GetTechString()+ " TAC Result Analysis";
}
SetWindowTextA (windowText);
m_strIniSiteTree = INI_FILE_SECTION;
m_strIniIntfParams = INI_FILE_INTFCOLUMNS;
m_strIniSiteTree += GetTechString();
ReadFromINI();
m_SiteTree.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE);
for (size_t i = 0; i < CellColStrings.size(); i++)
{
m_SiteTree.InsertColumn((int)i, CellColStrings[i].m_strname, LVCFMT_LEFT, CellColStrings[i].m_defWidth);
}
if(!m_OWLModule)
{
HINSTANCE hInst = AfxGetResourceHandle();
m_OWLModule = new TModule("",hInst);
}
if(!m_OWLWindow)
{
m_OWLWindow = new TWindow(m_hWnd);
}
// Get the TAC list stored in the TACDlgManager
TACPlanDataMgr * pTacData = TACPlanDlgMgr::GetInstance()->GetTacPlanDataMgr();
std::map<int, std::vector<int> > sAssignedTacSites = TACPlanDlgMgr::GetInstance()->GetTACAssignResult();
std::map<std::string, int> sSiteIdToSiteKeyMap = TACPlanDlgMgr::GetInstance()->GetSiteIdToSiteKeyMap();
int nRowIndex(0);
bool bIsfirstCentralsite(false);
for (auto configData : pTacData->GetTACWizData()->m_TacPlanData.GetConfigData())
{
int nIndex(0);
bIsfirstCentralsite = TRUE;
nIndex = m_SiteTree.InsertItem(m_SiteTree.GetItemCount(), (configData.GetCentralSite()+" [ "+std::to_string(configData.GetTAC()).c_str() + " ]"));
for (auto sSiteKey : sAssignedTacSites[configData.GetTAC()])
{
if (bIsfirstCentralsite == FALSE)
nIndex = m_SiteTree.InsertItem(m_SiteTree.GetItemCount(), _T(""));
CString sSiteId;
for (std::map<std::string, int>::const_iterator it = sSiteIdToSiteKeyMap.begin(); it != sSiteIdToSiteKeyMap.end(); ++it)
{
string site;
if (it->second == sSiteKey)
{
site = it->first;
sSiteId = site.c_str();
break;
}
}
m_SiteTree.SetItemText(nIndex, SRC_COL_SITES, sSiteId);
int sCentralSiteId = sSiteIdToSiteKeyMap[std::string(configData.GetCentralSite())];
m_SiteTree.SetItemData(nIndex, (DWORD)(sSiteIdToSiteKeyMap[std::string(configData.GetCentralSite())]));
bIsfirstCentralsite = FALSE;
}
nRowIndex++;
}
return TRUE;
}
CString TACResultAnalysisDlg::GetTechString()
{
return CString(MAIN_NET_TYPE_STRINGS_SWITCH(m_DispMode));
}
void TACResultAnalysisDlg::OnCloseMessage()
{
// Do we need to cleanup site tree ?
WindowPlacementHelper::SavePosition(m_hWnd, GetUniqueName());
WriteToINI();
ShowWindow(SW_HIDE);
//CDialog::OnClose();
//DestroyWindow();
}
///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////OVERRIDES///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
LPCSTR TACResultAnalysisDlg::GetUniqueName()
{
return "Interference Analysis Dialog";
}
void TACResultAnalysisDlg::MoveTheWindow(CWnd* pWnd, int x, int y, bool bStretchX, bool bStretchY)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(rect);
ScreenToClient(rect);
if (!bStretchX && !bStretchY)
{
pWnd->MoveWindow(rect.left+x ,rect.top+y,rect.Width(), rect.Height());
}
else if (bStretchX && !bStretchY)
{
pWnd->MoveWindow(rect.left ,rect.top+y,rect.Width()+x, rect.Height());
}
else if (!bStretchX && bStretchY)
{
pWnd->MoveWindow(rect.left+x ,rect.top ,rect.Width(), rect.Height()+y);
}
else // bStretchX && bStretchY
{
pWnd->MoveWindow(rect.left,rect.top ,rect.Width()+x, rect.Height()+y);
}
}
}
void TACResultAnalysisDlg::ReadFromINI()
{
for (size_t i = 0; i < CellColStrings.size(); i++)
{
CellColStrings[i].m_defWidth = RegistryCache::GetInstance().GetEnterpriseProfileInt(m_strIniSiteTree, CellColStrings[i].m_strname, CellColStrings[i].m_defWidth);
}
}
void TACResultAnalysisDlg::WriteToINI()
{
for (size_t i = 0; i < CellColStrings.size(); i++)
{
RegistryCache::GetInstance().WriteEnterpriseProfileInt(m_strIniSiteTree, CellColStrings[i].m_strname, m_SiteTree.GetColumnWidth((int)i));
}
}
void TACResultAnalysisDlg::NetWorkChanged()
{
}
void TACResultAnalysisDlg::TgNetWorkChanged()
{
}
void TACResultAnalysisDlg::OnReport()
{
}
void TACResultAnalysisDlg::CreateExcelRowFromCtrl(const int row, IAIReporter* reporter, CListCtrl& ListControl)
{
CHeaderCtrl* pHeader = ListControl.GetHeaderCtrl();
CString str;
const int numItems = pHeader->GetItemCount();
for (int i =0; i < numItems; i++)
{
CString str;
str = ListControl.GetItemText(row,i);
reporter->add_cell_string(str, REPORTERFLAGS_UNSPECIFIED);
}
}
// TODO_PDK: As of now results are applied to site DB
// irrespective of "ApplySiteDB" Button is pressed.
// Use the following function, in case of selective application.
void TACResultAnalysisDlg::OnBnAppltSiteDB()
{
POSITION pos = m_SiteTree.GetFirstSelectedItemPosition();
int nItem = m_SiteTree.GetNextSelectedItem(pos);
int nCentralSiteid = (int)m_SiteTree.GetItemData(nItem);
}
The parent dialog is:
Code:
void TACPlanDlgMgr::LaunchTACPlanWiz(TWindow* parent, TgNetType netType, TACPlanDataMgr* pTACPlanDataMgr)
{
// Enter the Wizard
CWnd* wndParent = CWnd::FromHandle(parent->Handle);
AIWindowsDisabler OWLWind(parent);
AIMFCWindowDisabler MFCWind(NULL);
OWLWind.Disable();
MFCWind.DisableMFCWindows();
if (!pTACPlanDataMgr) // we will provide the manager here instead
{
TACWizData wizData;
wizData.SetNetType(netType);
m_pDataMgr = new TACPlanDataMgr(netType, &wizData);
TACPlanWizard TACPlanWizDlg(parent, nullptr, wndParent, 0, m_pDataMgr);
assert(m_pDataMgr);
if (TACPlanWizDlg.DoModal() == ID_WIZFINISH)
{
//TACPlanAnalysis tacPlanAnalysis;
std::list<int> plannedCellkeyList;
MDWORD carrierBitmaskInUse;
TACPlanWizDlg.GetPlannedCellKeyList(plannedCellkeyList, wizData.GetNetType(), carrierBitmaskInUse);
Region planReg = LocPlannerHelper::GetContainingRegion(netType, plannedCellkeyList, 100);
wizData.m_TacPlanData.SetCellKeys(plannedCellkeyList);
wizData.m_TacPlanData.SetNetType(netType);
m_pLogFile = fopen(wizData.m_TacPlanData.GetAlgorithmData().GetLogfileName().c_str(), "a");
if (wizData.m_TacPlanData.GetNbrOption() == TACPlanData::NbrOption::CalcNbr)
{
NbrDialogManager& nbrDlgMgr = NbrDialogManager::GetInstance();
CWnd* pWndNbranalysis = nbrDlgMgr.GetAnalysisWindow();
if (pWndNbranalysis)
{
MFCWind.RemoveWindowFromDisabledList(pWndNbranalysis);
nbrDlgMgr.CloseAnalysisWindow();
}
nbrDlgMgr.LaunchTACNbrWiz(parent, netType, planReg, plannedCellkeyList, carrierBitmaskInUse);
}
//AI_Message::instance()->Add("TAC planner: calculation started.");
if (RunTAC_Algorithm())
{
if(m_pLogFile!=NULL)
fprintf(m_pLogFile, "Running TAC Algo \n");
//AI_Message::instance()->Add("TAC planner: calculation completed.");
}
bool res = CreateTACResultAnalysisDlg();
}
}
else //Array Wizard executing in else condition
{
ASSERT(0); // not_impl
}
OWLWind.Enable();
MFCWind.EnableMFCWindows();
if(m_pLogFile!=NULL)
fclose(m_pLogFile);
}
bool TACPlanDlgMgr::CreateTACResultAnalysisDlg()
{
//get resources from this module
AFX_MANAGE_STATE(AfxGetStaticModuleState())
if (m_pResultAnalysisDialog)
{
WINDOWPLACEMENT windowPlace;
windowPlace.length = sizeof(WINDOWPLACEMENT);
BOOL bOk = ::GetWindowPlacement(m_pResultAnalysisDialog->m_hWnd, &windowPlace);
if (bOk)
{
windowPlace.flags = WPF_SETMINPOSITION;
if (windowPlace.showCmd == SW_SHOWMINIMIZED)
{
::ShowWindow(m_pResultAnalysisDialog->m_hWnd,SW_RESTORE);
}
}
::BringWindowToTop(m_pResultAnalysisDialog->m_hWnd);
return true;
}
else
{
m_pResultAnalysisDialog = new TACResultAnalysisDlg();
if ( m_pResultAnalysisDialog )
{
m_pResultAnalysisDialog->Create(TACResultAnalysisDlg::IDD, GetLocationPlannersMainFrameWindow() );
m_pResultAnalysisDialog->ShowWindow(SW_SHOW);
return true;
}
}
return false;
}
When rerun, again after the close the red portion executes, as the handle is non null, but window never gets displayed
-
January 15th, 2021, 07:53 AM
#2
Re: Reopen the Dialog.
What if you add (the block in blue)?
Code:
if (m_pResultAnalysisDialog)
{
WINDOWPLACEMENT windowPlace;
windowPlace.length = sizeof(WINDOWPLACEMENT);
BOOL bOk = ::GetWindowPlacement(m_pResultAnalysisDialog->m_hWnd, &windowPlace);
if (bOk)
{
windowPlace.flags = WPF_SETMINPOSITION;
if (windowPlace.showCmd == SW_SHOWMINIMIZED)
{
::ShowWindow(m_pResultAnalysisDialog->m_hWnd,SW_RESTORE);
}
else
{
::ShowWindow(m_pResultAnalysisDialog->m_hWnd, SW_SHOW);
}
}
::BringWindowToTop(m_pResultAnalysisDialog->m_hWnd);
return true;
}
Last edited by VictorN; January 15th, 2021 at 07:57 AM.
Victor Nijegorodov
-
January 15th, 2021, 08:01 AM
#3
Re: Reopen the Dialog.
Thanks a lot Victor i tried it is not working.
Code:
if (m_pResultAnalysisDialog)
{
WINDOWPLACEMENT windowPlace;
windowPlace.length = sizeof(WINDOWPLACEMENT);
BOOL bOk = ::GetWindowPlacement(m_pResultAnalysisDialog->m_hWnd, &windowPlace);
if (bOk)
{
windowPlace.flags = WPF_SETMINPOSITION;
if (windowPlace.showCmd == SW_SHOWMINIMIZED)
{
::ShowWindow(m_pResultAnalysisDialog->m_hWnd,SW_RESTORE);
}
else
{
::ShowWindow(m_pResultAnalysisDialog->m_hWnd, SW_SHOW);
}
}
::BringWindowToTop(m_pResultAnalysisDialog->m_hWnd);
basically, the bOk is false, so doesnot go inside if (boK)
-
January 15th, 2021, 08:06 AM
#4
Re: Reopen the Dialog.
Basically i was relooking into code, and wondering, after the CLOSE, the window is destroyed, but the handle is still having not deleted. Is it wrong ? So tried the following it works, but not sure whether it is correct as per MFC
Code:
void TACResultAnalysisDlg::OnCloseMessage()
{
// Do we need to cleanup site tree ?
WriteToINI();
CDialog::OnClose();
DestroyWindow();
TACPlanDlgMgr::GetInstance()->CloseAnalysisDialog();
}
And in TACPlanDlgMgr.h
void CloseAnalysisDialog()
{
delete m_pResultAnalysisDialog;
m_pResultAnalysisDialog = NULL;
}
So with this everytime a new window is created and InitDialog is called.
If we just hide and show, the contents maynot get updated, because the InitDialog maynot get called again
-
January 15th, 2021, 08:53 AM
#5
Re: Reopen the Dialog.
What overly complicated code. Create a modeless dialog. Make its parent window the main app window. Store the pointer to it in the AfxApp (so you can access it from anywhere). Expose a method that hides/shows the dialog. Inside this method, you call UpdateData(..) to refresh the data as well as hide or show the dialog, and/or any resizing.
You call it anywhere inside the code with GetAfxApp()-GetMyFancyModelessDlg().Show(TRUE);
Note: the GetAfxApp() call may not be the correct name of the built-in method.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|