nativedlg and some interface changes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@17216 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2002-09-16 04:56:00 +00:00
parent 923b48fc63
commit 243116066d
4 changed files with 318 additions and 336 deletions

View File

@@ -33,22 +33,41 @@
// ---------------------------------------------------------------------------
extern wxWindow* wxWndHook;
extern MRESULT wxDlgProc(HWND hWnd, UINT message,
MPARAM wParam, MPARAM lParam);
extern MRESULT wxDlgProc( HWND hWnd
,UINT message
,MPARAM wParam
,MPARAM lParam
);
// ===========================================================================
// implementation
// ===========================================================================
bool wxWindow::LoadNativeDialog(wxWindow* parent, wxWindowID& id)
bool wxWindow::LoadNativeDialog (
wxWindow* pParent
, wxWindowID& vId
)
{
m_windowId = id;
wxWndHook = this;
wxWindow* pChild = NULL;
HWND hWndOwner;
HWND hWndNext = NULLHANDLE;
HENUM hEnum;
m_hWnd = 0; // TODO (WXHWND)::CreateDialog((HINSTANCE)wxGetInstance(),
// MAKEINTRESOURCE(id),
// parent ? (HWND)parent->GetHWND() : 0,
// (DLGPROC) wxDlgProc);
if (pParent)
hWndOwner = GetHwndOf(pParent);
else
hWndOwner = HWND_DESKTOP;
m_windowId = vId;
wxWndHook = this;
m_hWnd = ::WinLoadDlg( HWND_DESKTOP
,hWndOwner
,(PFNWP)wxDlgProc
,NULL
,(ULONG)131 // Caption dialog from the resource file
,(PVOID)this
);
wxWndHook = NULL;
if ( !m_hWnd )
@@ -56,237 +75,216 @@ bool wxWindow::LoadNativeDialog(wxWindow* parent, wxWindowID& id)
SubclassWin(GetHWND());
if ( parent )
parent->AddChild(this);
if (pParent)
pParent->AddChild(this);
else
wxTopLevelWindows.Append(this);
// Enumerate all children
HWND hWndNext = NULLHANDLE;
// TODO hWndNext = ::GetWindow((HWND) m_hWnd, GW_CHILD);
wxWindow* child = NULL;
if (hWndNext)
child = CreateWindowFromHWND(this, (WXHWND) hWndNext);
while (hWndNext != (HWND) NULL)
{
// TODO: hWndNext = ::GetWindow(hWndNext, GW_HWNDNEXT);
if (hWndNext)
child = CreateWindowFromHWND(this, (WXHWND) hWndNext);
}
//
// Enumerate the children
//
hEnum = ::WinBeginEnumWindows(GetHwndOf(pParent));
while ((hWndNext = ::WinGetNextWindow(hEnum)) != NULLHANDLE)
pChild = CreateWindowFromHWND( this
,(WXHWND)hWndNext
);
::WinEndEnumWindows(hEnum);
return TRUE;
}
} // end of wxWindow::LoadNativeDialog
bool wxWindow::LoadNativeDialog(wxWindow* parent, const wxString& name)
bool wxWindow::LoadNativeDialog (
wxWindow* pParent
, const wxString& rsName
)
{
SetName(name);
HWND hWndOwner;
if (pParent)
hWndOwner = GetHwndOf(pParent);
else
hWndOwner = HWND_DESKTOP;
SetName(rsName);
wxWndHook = this;
m_hWnd = 0; //TODO: (WXHWND)::CreateDialog((HINSTANCE) wxGetInstance(),
// name.c_str(),
// parent ? (HWND)parent->GetHWND() : 0,
// (DLGPROC)wxDlgProc);
m_hWnd = ::WinLoadDlg( HWND_DESKTOP
,hWndOwner
,(PFNWP)wxDlgProc
,NULL
,(ULONG)131 // Caption dialog from the resource file
,(PVOID)this
);
wxWndHook = NULL;
if ( !m_hWnd )
if (!m_hWnd)
return FALSE;
SubclassWin(GetHWND());
if ( parent )
parent->AddChild(this);
if (pParent)
pParent->AddChild(this);
else
wxTopLevelWindows.Append(this);
// FIXME why don't we enum all children here?
return TRUE;
}
} // end of wxWindow::LoadNativeDialog
// ---------------------------------------------------------------------------
// look for child by id
// ---------------------------------------------------------------------------
wxWindow* wxWindow::GetWindowChild1(wxWindowID id)
wxWindow* wxWindow::GetWindowChild1 (
wxWindowID vId
)
{
if ( m_windowId == id )
if (m_windowId == vId)
return this;
wxWindowList::Node *node = GetChildren().GetFirst();
while ( node )
{
wxWindow* child = node->GetData();
wxWindow* win = child->GetWindowChild1(id);
if ( win )
return win;
wxWindowList::Node* pNode = GetChildren().GetFirst();
node = node->GetNext();
while (pNode)
{
wxWindow* pChild = pNode->GetData();
wxWindow* pWin = pChild->GetWindowChild1(vId);
if (pWin)
return pWin;
pNode = pNode->GetNext();
}
return NULL;
}
} // end of wxWindow::GetWindowChild1
wxWindow* wxWindow::GetWindowChild(wxWindowID id)
wxWindow* wxWindow::GetWindowChild (
wxWindowID vId
)
{
wxWindow* win = GetWindowChild1(id);
if ( !win )
wxWindow* pWin = GetWindowChild1(vId);
if (!pWin)
{
HWND hWnd = 0; // TODO: ::GetDlgItem((HWND) GetHWND(), id);
HWND hWnd = 0; // TODO: ::GetDlgItem((HWND) GetHWND(), id);
if (hWnd)
{
wxWindow* child = CreateWindowFromHWND(this, (WXHWND) hWnd);
if (child)
wxWindow* pChild = CreateWindowFromHWND( this
,(WXHWND)hWnd
);
if (pChild)
{
child->AddChild(this);
return child;
pChild->AddChild(this);
return pChild;
}
}
}
return NULL;
}
} // end of wxWindow::GetWindowChild
// ---------------------------------------------------------------------------
// create wxWin window from a native HWND
// ---------------------------------------------------------------------------
wxWindow* wxWindow::CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd)
wxWindow* wxWindow::CreateWindowFromHWND (
wxWindow* pParent
, WXHWND hWnd
)
{
wxString str(wxGetWindowClass(hWnd));
str.UpperCase();
wxString sStr(wxGetWindowClass(hWnd));
long lId = wxGetWindowId(hWnd);
long lStyle = ::WinQueryWindowULong((HWND)hWnd
,QWL_STYLE
);
wxWindow* pWin = NULL;
long id = wxGetWindowId(hWnd);
long style = 0; // TODO: GetWindowLong((HWND) hWnd, GWL_STYLE);
sStr.UpperCase();
wxWindow* win = NULL;
// TODO:
/*
if (str == wxT("BUTTON"))
if (sStr == wxT("BUTTON"))
{
int style1 = (style & 0xFF);
if ((style1 == BS_3STATE) || (style1 == BS_AUTO3STATE) || (style1 == BS_AUTOCHECKBOX) ||
(style1 == BS_CHECKBOX))
if (lStyle == BS_AUTOCHECKBOX)
{
win = new wxCheckBox;
pWin = new wxCheckBox;
}
else if ((style1 == BS_AUTORADIOBUTTON) || (style1 == BS_RADIOBUTTON))
else if (lStyle == BS_AUTORADIOBUTTON)
{
win = new wxRadioButton;
pWin = new wxRadioButton;
}
else if (style & BS_BITMAP)
else if (lStyle & BS_BITMAP || lStyle == BS_USERBUTTON)
{
// TODO: how to find the bitmap?
win = new wxBitmapButton;
wxLogError(wxT("Have not yet implemented bitmap button as BS_BITMAP button."));
pWin = new wxBitmapButton;
}
else if (style1 == BS_OWNERDRAW)
else if (lStyle == BS_PUSHBUTTON)
{
// TODO: how to find the bitmap?
// TODO: can't distinguish between bitmap button and bitmap static.
// Change implementation of wxStaticBitmap to SS_BITMAP.
// PROBLEM: this assumes that we're using resource-based bitmaps.
// So maybe need 2 implementations of bitmap buttons/static controls,
// with a switch in the drawing code. Call default proc if BS_BITMAP.
win = new wxBitmapButton;
pWin = new wxButton;
}
else if ((style1 == BS_PUSHBUTTON) || (style1 == BS_DEFPUSHBUTTON))
else if (lStyle == SS_GROUPBOX)
{
win = new wxButton;
}
else if (style1 == BS_GROUPBOX)
{
win = new wxStaticBox;
pWin = new wxStaticBox;
}
else
{
wxLogError(wxT("Don't know what kind of button this is: id = %d"),
id);
wxLogError(wxT("Don't know what kind of button this is: id = %ld"),
lId);
}
}
else if (str == wxT("COMBOBOX"))
else if (sStr == wxT("COMBOBOX"))
{
win = new wxComboBox;
pWin = new wxComboBox;
}
// TODO: Problem if the user creates a multiline - but not rich text - text control,
// since wxWin assumes RichEdit control for this. Should have m_isRichText in
// wxTextCtrl. Also, convert as much of the window style as is necessary
// for correct functioning.
// Could have wxWindow::AdoptAttributesFromHWND(WXHWND)
// to be overridden by each control class.
else if (str == wxT("EDIT"))
else if (sStr == wxT("EDIT"))
{
win = new wxTextCtrl;
pWin = new wxTextCtrl;
}
else if (str == wxT("LISTBOX"))
else if (sStr == wxT("LISTBOX"))
{
win = new wxListBox;
pWin = new wxListBox;
}
else if (str == wxT("SCROLLBAR"))
else if (sStr == wxT("SCROLLBAR"))
{
win = new wxScrollBar;
pWin = new wxScrollBar;
}
else if (str == wxT("MSCTLS_UPDOWN32"))
else if (sStr == wxT("MSCTLS_UPDOWN32"))
{
win = new wxSpinButton;
pWin = new wxSpinButton;
}
else if (str == wxT("MSCTLS_TRACKBAR32"))
else if (sStr == wxT("MSCTLS_TRACKBAR32"))
{
// Need to ascertain if it's horiz or vert
win = new wxSlider;
pWin = new wxSlider;
}
else if (str == wxT("STATIC"))
else if (sStr == wxT("STATIC"))
{
int style1 = (style & 0xFF);
if ((style1 == SS_LEFT) || (style1 == SS_RIGHT) || (style1 == SS_SIMPLE))
win = new wxStaticText;
else if (style1 == SS_BITMAP)
if (lStyle == SS_TEXT)
pWin = new wxStaticText;
else if (lStyle == SS_ICON)
{
win = new wxStaticBitmap;
// Help! this doesn't correspond with the wxWin implementation.
wxLogError(wxT("Please make SS_BITMAP statics into owner-draw buttons."));
pWin = new wxStaticBitmap;
}
}
else
{
wxString msg(wxT("Don't know how to convert from Windows class "));
msg += str;
wxLogError(msg);
}
*/
if (win)
{
parent->AddChild(win);
win->SetEventHandler(win);
win->SetHWND(hWnd);
win->SetId(id);
win->SubclassWin(hWnd);
win->AdoptAttributesFromHWND();
win->SetupColours();
wxString sMsg(wxT("Don't know how to convert from Windows class "));
return win;
sMsg += sStr;
wxLogError(sMsg);
}
if (pWin)
{
pParent->AddChild(pWin);
pWin->SetEventHandler(pWin);
pWin->SetHWND(hWnd);
pWin->SetId(lId);
pWin->SubclassWin(hWnd);
pWin->AdoptAttributesFromHWND();
pWin->SetupColours();
return pWin;
}
else
return NULL;
}
} // end of wxWindow::CreateWindowFromHWND
//
// Make sure the window style (etc.) reflects the HWND style (roughly)
void wxWindow::AdoptAttributesFromHWND(void)
//
void wxWindow::AdoptAttributesFromHWND()
{
HWND hWnd = (HWND) GetHWND();
// TODO:
/*
long style = GetWindowLong((HWND) hWnd, GWL_STYLE);
if (style & WS_VSCROLL)
m_windowStyle |= wxVSCROLL;
if (style & WS_HSCROLL)
m_windowStyle |= wxHSCROLL;
*/
}
// Does nothing under OS/2
} // end of wxWindow::AdoptAttributesFromHWND