[python-win32] win32ui and resources for dialogs
Michael Morisak
mmorisak at risc.uni-linz.ac.at
Wed Jan 10 11:50:36 CET 2007
Michael Morisak schrieb:
> Hi
>
>
> I have the following Situation:
>
> I have a dialog resource in an dll and I want to open a modal dialog
> with this resource.
>
> dlg= pywin.mfc.dialog.Dialog(myDialogID)
> dlg.DoModal()
>
> works but the problem is that i would set the Parent of the Dialog
> in MFC the CDialog Constructor allows to pass a Parent (which i need):
>
> explicit CDialog(
> UINT /nIDTemplate/,
> CWnd* /pParentWnd/ = NULL
> );
>
> but i really do not know how to do this with python-win32
>
> thanx for the help and the great work done in python.win32
>
> c.u.
>
>
>
>
ok i could fix this by opening the dialog in my C++ extension and
writing the whole dialog in c++
but now a have a different problem
when I did the dialog in c++ i found out that in my case the dialog only
works if I add
AFX_MANAGE_STATE(AfxGetStaticModuleState());
so i opened the dialog the following way:
static PyObject* createConnectOptionsDlg(PyObject *self, PyObject *args)
{
HWND hwnd;
PyObject* settings;
CWnd* parent;
CDialog* dlg;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!PyArg_ParseTuple(args,"iO",&hwnd,&settings))
return NULL;
parent= CWnd::FromHandle(hwnd);
dlg= new CConnectOptionsDlg(parent,settings);
int res= dlg->DoModal();
delete dlg;
return Py_BuildValue("i", res);
}
w0rks fine :)
I found out that I need this AFX_MANAGE_STATE(AfxGetStaticModuleState());
because it is a python c++ extension which is used in an ComObject I
created in python which is some
automation for SolidEdge
I read in the article (sorry only in german):
http://www.hki.uni-koeln.de/teach/ss06/PS_C++/tag23/21/kap17.htm
that if you do mfc stuff in an dll you need to add
AFX_MANAGE_STATE(AfxGetStaticModuleState()) to every exported function
that uses MFC
This information really helped me a lot!
After adding this line it started working (SolidEdge did not crash anymore)
Now I have a different situation:
I need to do the following lines:
self.dlg = win32ui.CreateDialog(SolidEdge.PySolidEdge.IDD_LayerStyle)
self.dlg.CreateWindow(self.pagewin)
self.dlg.ShowWindow(win32con.SW_SHOWNORMAL)
self.dlg.HookMessage(self.layerListSelChangeMsgHandler, win32con.WM_COMMAND)
the problem is that in principle this works fine
but SolidEdge crashes after CreateWindow
My suspicion is that i need:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
in CreateWindow
i tried to add this to the source of python-win32
but i refuses to compile with some link issue
Does anybody know what i could do about this problem
I do not want to write this whole dlg in c++ since i would have to do a
lot of COM in this dialog then
thx
Michael
--
Michael Morisak
RISC Software GmbH -- Johannes Kepler Universitaet Linz
IT-Center, Hauptstrasse 119 phone: ++43 7236 3343-251
4232 Hagenberg, Austria fax: ++43 7236 3343-250
More information about the Python-win32
mailing list