我想控制模态对话框的位置。对于长篇文章感到抱歉,但这是我认为可能需要帮助解决问题的所有内容。
我有一个对话框窗口,可以在单击按钮时打开列表。 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 ;
...
当我单步执行代码时,一切正常,除了在双显示器系统上,对话框出现在最右边:
(我正在使用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()
};
答案 0 :(得分:1)
您可以在对话框的OnInitDialog方法中使用SetWindowPos。在对话框具有HWND之后但在它变为可见之前执行此方法。