简体   繁体   中英

DoModal() Positions Dialog at Far Right of Second Monitor

I want to control the location of a modal dialog. Sorry for the long post, but this is everything that I think could be needed to help with the issue.

I have a dialog window that opens a list when a button is clicked. The Parent is CXEdit and it calls OnFunction(void) which contains the code here:

void CXEdit::OnFunction(void)
{
int     k, n1, n2 ;
LPUDF   u ;
char    name[100],
        *p ;
CFuncList   dlg(xtype) ;
int     j1, j2, j3 ;
CString Fname ;

//  How do I set the modal dialog's position?
dlg.SetWindowPos(NULL, 100, 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

//originally this was the only code
k = dlg.DoModal();
if (k == -1)
    return ;
    ...

When I step through the code, everything works properly, except that on a two-monitor system, the dialog appears on the far right:

在此处输入图片说明

(I'm using VirtualBox configured to simulate two screens).

If I try to enable the dlg.SetWindowPos() line as shown, I get an ASSERT message and debugging shows that I don't have a handle for the dlg (From WINOCC.CPP):

BOOL CWnd::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx,
int cy, UINT nFlags)
{
ASSERT(::IsWindow(m_hWnd));

if (m_pCtrlSite == NULL)
    return ::SetWindowPos(m_hWnd, pWndInsertAfter->GetSafeHwnd(),
        x, y, cx, cy, nFlags);
else
    return m_pCtrlSite->SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);
}

the debugger shows m_hWnd = 0x00000000

Once I step into DoModal(), I'm in MFC code and can't make any changes.

The Class CFuncList is defined off of CDialog:

class CFuncList : public CDialog
{
// Construction
public:
CFuncList(int type, CWnd* pParent = NULL);  // standard constructor

// Dialog Data
//{{AFX_DATA(CFuncList)
enum            { IDD = IDD_SELECT_FUNCTION };
int     paste ;
    // NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// Implementation
public:
int     xtype ;
private:
CRrDoc      *pDoc;  // the ubiquitous document pointer
CListCtrl   *flist ;
int         *plist ;
int         findex ;
int         fselect ;
int         Sort ;
int         LCount ;
void        ActiveFocusCommon(void);
void        EnableButtons(void) ;
int         BuildFunkList(void) ;
void        DisplayList(void) ;
void        SortList() ;
void        ReSort(int n) ;
void        SetSelected() ;
protected:
virtual void    DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual void    OnDestroy();
// Generated message map functions
//{{AFX_MSG(CFuncList)
virtual BOOL    OnInitDialog        ();
virtual void    OnOK                ();
virtual void    OnCancel            ();
LRESULT         OnCommandHelp       (WPARAM wParam, LPARAM lParam);
afx_msg void    OnHelp              ();
afx_msg void    OnItemClick         (NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void    OnItemDoubleClick   (NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void    OnColumnClick       (NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

You can use SetWindowPos in the dialog's OnInitDialog method. This method is executed after the dialog has an HWND but before it becomes visible.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM