|
Hi, All
i have one project, use CFrameWnd.
example:
CMainFrm : public CFrameWnd
CChildFrm : public CFrameWnd
in CMainFrm : load CChildFrm and CChildFrm must be DoModal()
How to make CChildFrm to DoModal()
I use VC 7.0
|
|
|
|
|
DoModal is from CDialog, it has nothing to do with CFrameWnd. Why do you want to call DoModal ?
Take a look at BeginModalState[^] (hum, not a lot of info, I agree ). I think this will do what you are looking for (but I never tested it myself).
You didn't answer my question in your previous thread: how did you do to make it compile under VC6 ?
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
thank all, i have just solved my problem.
i forgot my initial var.
DoModal for Frame have requirement of customer,
in some case, it modalless and Domodal.
|
|
|
|
|
huynhnb wrote: DoModal for Frame have requirement of customer,
in some case, it modalless and Domodal.
It is not because your customer wants to have a modal frame window that you are 'allowed' to call DoModal which is not part of the CFrameWnd class . I'm wondering how you did that. Did you simply make a cast from a CFrameWnd into a CDialog ?
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
Source code :
// Child Frame .H
class CSDIChildFrame : public CFrameWnd
{
DECLARE_DYNCREATE(CSDIChildFrame)
// Attributes
public:
CSDIChildFrame(); // protected constructor used by dynamic creation
// Operations
public:
BOOL m_bClose;
BOOL m_bModal;
int RunModalLoop(DWORD dwFlags);
int DoModal(CWnd *pParentWnd);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSDIChildFrame)
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CSDIChildFrame();
// Generated message map functions
//{{AFX_MSG(CSDIChildFrame)
// NOTE - the ClassWizard will add and remove member functions here.
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnExit();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// Child frame .cpp
// SDIChildFrame.cpp : implementation file
//
#include "stdafx.h"
#include "SDIChildFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSDIChildFrame
IMPLEMENT_DYNCREATE(CSDIChildFrame, CFrameWnd)
CSDIChildFrame::CSDIChildFrame() : m_bClose(FALSE)
{
}
CSDIChildFrame::~CSDIChildFrame()
{
}
BEGIN_MESSAGE_MAP(CSDIChildFrame, CFrameWnd)
//{{AFX_MSG_MAP(CSDIChildFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
ON_COMMAND(ID_MENUITEM32772, OnExit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSDIChildFrame message handlers
int CSDIChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CCreateContext pContext;
return 0;
}
int CSDIChildFrame::DoModal(CWnd *pParentWnd)
{
BOOL bEnableParent, bResult;
HWND hWndParent, hWndTop;
m_bModal = TRUE;
hWndParent = CWnd::GetSafeOwner_(NULL, &hWndTop);
AfxHookWindowCreate(this);
bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
bResult = CFrameWnd::LoadFrame(
IDR_MENU1,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE | WS_VISIBLE,
pParentWnd,
NULL);
if (bResult)
{
DWORD dwFlags = MLF_SHOWONIDLE;
m_nFlags = m_nFlags & WF_CONTINUEMODAL;
if (GetStyle() & DS_NOIDLEMSG)
{
dwFlags |= MLF_NOIDLEMSG;
}
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
}
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL)
::SetActiveWindow(hWndParent);
AfxUnhookWindowCreate(); // just in case
Detach(); // just in case
// re-enable windows
if (::IsWindow(hWndTop))
::EnableWindow(hWndTop, TRUE);
hWndTop = NULL;
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
pApp->EnableModeless(TRUE);
return m_nModalResult;
}
int CSDIChildFrame::RunModalLoop(DWORD dwFlags)
{
ASSERT(::IsWindow(m_hWnd)); // window must be created
ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
HWND hWndParent = ::GetParent(m_hWnd);
m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
// In VC 6.0
MSG* pMsg = &AfxGetThread()->m_msgCur;
// In VC 7.0
// MSG* pMsg = AfxGetCurrentMessage();
// acquire and dispatch messages until the modal state is done
for (;;)
{
/*
ASSERT(ContinueModal());
*/
if (m_bClose)
{
goto ExitModal;
}
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
{
/*
ASSERT(ContinueModal());
*/
if (m_bClose)
{
goto ExitModal;
}
// show the dialog when the message queue goes idle
if (bShowIdle)
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
// call OnIdle while in bIdle state
if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
{
// send WM_ENTERIDLE to the parent
::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
}
if (m_bClose)
{
goto ExitModal;
}
if ((dwFlags & MLF_NOKICKIDLE) ||
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
{
// stop idle processing next time
bIdle = FALSE;
}
}
// phase2: pump messages while available
do
{
/*
ASSERT(ContinueModal());
*/
if (m_bClose)
{
goto ExitModal;
}
// pump message, but quit on WM_QUIT
if (!AfxGetThread()->PumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
// show the window when certain special messages rec'd
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
/*
if (!ContinueModal())
goto ExitModal;
*/
if (m_bClose)
{
goto ExitModal;
}
// reset "no idle" state after pumping "normal" message
if (AfxGetThread()->IsIdleMessage(pMsg))
{
bIdle = TRUE;
lIdleCount = 0;
}
if (m_bClose)
{
goto ExitModal;
}
} while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
}
ExitModal:
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
return m_nModalResult;
}
void CSDIChildFrame::OnExit()
{
// TODO: Add your command handler code here
m_bClose = TRUE;
}
// include in Stdafx.h
#include <afxpriv.h>
// Use
void CMainFrame::OnLoadDoModalFrame()
{
CSDIChildFrame *pChildFrame = new CSDIChildFrame();
pChildFrame ->DoModal(this);
}
|
|
|
|
|
my problem is once we select the listbox item we get the pop up and it will be positioned exactly down that item.once we select another item now pervious popup should close and new popur should open in same as above
please help as quickly as possiblle
|
|
|
|
|
vasusree wrote: the listbox
Which listbox ?
vasusree wrote: the pop up
Which pop-up ?
You have to provide more information if you want help.
(BTW, using 'the' means that you speak about something that is known from the reader, which is not the case here).
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
can you explain please
we select the listbox item we get the pop up
whitesky
|
|
|
|
|
A possible scenario:
- Display your popup as a modeless dialog, keeping a variable for this dialog.
- When you detect a new selection in your list-box, close the dialog, and then recreate it and move to desired position. Or just move it, if already created.
- If you want the popup to disappear automatically when it looses focus, then handle a corresponding message, probably
WM_ACTIVATE or WM_KILLFOCUS .
|
|
|
|
|
if u don't mind do u have any sample code.
or any example in code project
|
|
|
|
|
|
i need this project without using tooltips
|
|
|
|
|
I have sample code.
My mail ID is amar.sutar@gmail.com
Regards
Amar
|
|
|
|
|
Hi !!!
What is an Array Pointer or Pointer to an Array?
Please a little example.
Thx.
By !!!
-:KNOX:-
|
|
|
|
|
|
Hi !!!
Can me someone tell what is a Visitor Design Patter?
Please a little examle.
Thx.
By !!!
-:KNOX:-
|
|
|
|
|
|
Hi, ALl
in VC 6.0 i can use:
MSG* pMsg = &AfxGetThread()->m_msgCur;
build OK.
but in VC 7.0
when i use MSG* pMsg = &AfxGetThread()->m_msgCur;
error C2039: 'm_msgCur' : is not a member of 'CWinThread'
i can not know why?
Who help me?
thank for reading.
|
|
|
|
|
You can use AfxGetCurrentMessage() in VC7.0.
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
in VC 6. I use DoModal() of CDialog to do DoModal() for CFrameWnd
when i use this function in VC 7.0, i have one error.
I will try.
Thank for support.
|
|
|
|
|
What error are you getting . Put some code about how you are calling the mentioned function
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
huynhnb wrote: in VC 6. I use DoModal() of CDialog to do DoModal() for CFrameWnd
I even wonder how it is compiling. Why are you calling DoModal for a CFrameWnd (which as nothing to do with a CDialog) and how did you proceed to do such a think ?
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
Maybe, you should use CWnd::GetCurrentMessage or AfxGetCurrentMessage ?
|
|
|
|
|
I think you can achive the same functionality by calling
CWinThread::GetMainWnd()->GetCurrentMessage() function.
SaRath.
"Don't Do Different things... Do Things Differently..."
Understanding State Pattern in C++
|
|
|
|
|
as I understand HitTest should return the index of CListCtrl's item that been clicked, or -1.
CPoint point;
GetCursorPos(&point);
UINT uFlags;
int nIndex=m_lstLeft.HitTest(point,&uFlags);
nIndex==-1... always
|
|
|
|