DoModal()在第二个监视器的最右侧定位对话框

时间:2014-12-02 19:09:04

标签: c++ mfc modal-dialog

我想控制模态对话框的位置。对于长篇文章感到抱歉,但这是我认为可能需要帮助解决问题的所有内容。

我有一个对话框窗口,可以在单击按钮时打开列表。 Parent是CXEdit,它调用OnFunction(void),其中包含代码:

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 ;
    ...

当我单步执行代码时,一切正常,除了在双显示器系统上,对话框出现在最右边:

enter image description here

(我正在使用VirtualBox配置来模拟两个屏幕)。

如果我尝试启用如图所示的dlg.SetWindowPos()行,我会收到一条ASSERT消息并且调试显示我没有dlg的句柄(来自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);
}

调试器显示m_hWnd = 0x00000000

一旦我进入DoModal(),我使用的是MFC代码,无法进行任何更改。

类CFuncList是由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()
};

1 个答案:

答案 0 :(得分:1)

您可以在对话框的OnInitDialog方法中使用SetWindowPos。在对话框具有HWND之后但在它变为可见之前执行此方法。