How do I create a modeless dialog in a DLL?

dev2004 Messages postés 2 Date d'inscription jeudi 25 mars 2004 Statut Membre Dernière intervention 26 mars 2004 - 26 mars 2004 à 23:56
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 27 mars 2004 à 13:06
Originally posted by: H
I have an MFC C++ dll, which is called from a C executable.
I can create a modal dialog just fine, but I'm having trouble getting a modeless dialog. So far it appears for juct a few milliseconds then goes. I suspect that this is because it's going on the stack instead of the heap.

Anyone out there know a simple answer? A chunk of code would be greatly appreciated as I'm new to all of this.

Thanks,
A voir également:

1 réponse

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
27 mars 2004 à 13:06
in the MFC Dll : one Dialog class :

(the dialog is not destroyed when it receives OnCancel or OnOK, it is oly hidden, the object itself is destroyed in OnPostNCDestroy, the last message received).

"Dlg.h"
#ifndef AFX_DLG_H_INCLUDED_
#define AFX_DLG_H_INCLUDED_

class CDlg : public CDialog
{
public:
CDlg();
BOOL Create(CWnd* pParent = NULL);

// Dialog Data
//{{AFX_DATA(CDlg)
enum { IDD = IDD_DIALOG };
//}}AFX_DATA

// Overrides
//{{AFX_VIRTUAL(CDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
virtual void PostNcDestroy();
//}}AFX_VIRTUAL

// Generated message map functions
protected:
//{{AFX_MSG(CDlg)
virtual void OnCancel();
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

#endif	// AFX_DLG_H_INCLUDED_



"Dlg.cpp"
// Dlg.cpp : implementation file
//

#include "StdAfx.h"
#include "TestDll.h"
#include "Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BEGIN_MESSAGE_MAP(CDlg, CDialog)
//{{AFX_MSG_MAP(CDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CDlg::CDlg()
: CDialog()
{
//{{AFX_DATA_INIT(CDlg)
//}}AFX_DATA_INIT
}

void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlg)
//}}AFX_DATA_MAP
}

BOOL CDlg::Create(CWnd* pParent /*= NULL*/)
{
if(!CDialog::Create(CDlg::IDD, pParent))return FALSE;
return TRUE;
}

void CDlg::OnCancel() 
{
ShowWindow(SW_HIDE);
}

void CDlg::OnOK() 
{
ShowWindow(SW_HIDE);
}

void CDlg::PostNcDestroy() 
{
delete this;
}



in the MFC Dll, on exported function (createDlg)

"ImpExp.h"
#ifndef IMPEXP_H
#define IMPEXP_H

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API extern "C" __declspec(dllexport)
#else
#define TESTDLL_API extern "C" __declspec(dllimport)
#endif

TESTDLL_API HWND __stdcall CreateDlg(HWND hWndParent);

#endif	//  IMPEXP_H


"TestDll.cpp"
#define TESTDLL_EXPORTS
#include "ImpExp.h"
#include "Dlg.h"

TESTDLL_API HWND __stdcall CreateDlg(HWND hWndParent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlg* pDlg = new CDlg();
if(!pDlg->Create(CWnd::FromHandle(hWndParent))) return NULL;
return pDlg->m_hWnd;
}


"Main.cpp" (link with the MFC dll .lib file)
// Main.cpp : Defines the entry point for the application.
//

#include "StdAfx.h"
#include "resource.h"
#include "..\ImpExp.h"

HWND hModelessDlg;

int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
hModelessDlg = CreateDlg(hDlg);
break;
}
case WM_DESTROY :
{
DestroyWindow(hModelessDlg);
break;
}
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:EndDialog(hDlg, IDCANCEL); break;
case IDOK:EndDialog(hDlg, IDOK); break;
case IDC_SHOW:
{
ShowWindow(hModelessDlg, SW_SHOW);
break;
}
case IDC_HIDE:
{
ShowWindow(hModelessDlg, SW_HIDE);
break;
}
}
}
}
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,  int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, DlgProc);
}


the IDD_MAINDIALOG Dialog contains 2 buttons IDC_SHOW and IDC_HIDE.
0
Rejoignez-nous