Files
wxWidgets/src/os2/nativdlg.cpp
2004-11-28 18:39:30 +00:00

291 lines
7.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: nativdlg.cpp
// Purpose: Native dialog loading code (part of wxWindow)
// Author: David Webster
// Modified by:
// Created: 10/12/99
// RCS-ID: $Id$
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include <stdio.h>
#include "wx/wx.h"
#endif
#include "wx/os2/private.h"
#include "wx/spinbutt.h"
// ---------------------------------------------------------------------------
// global functions
// ---------------------------------------------------------------------------
extern wxWindow* wxWndHook;
extern MRESULT EXPENTRY wxDlgProc( HWND hWnd
,UINT message
,MPARAM wParam
,MPARAM lParam
);
// ===========================================================================
// implementation
// ===========================================================================
bool wxWindow::LoadNativeDialog (
wxWindow* pParent
, wxWindowID& vId
)
{
wxWindow* pChild = NULL;
HWND hWndOwner;
HWND hWndNext = NULLHANDLE;
HENUM hEnum;
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 )
return FALSE;
SubclassWin(GetHWND());
if (pParent)
pParent->AddChild(this);
else
wxTopLevelWindows.Append(this);
//
// 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* pParent
, const wxString& rsName
)
{
HWND hWndOwner;
if (pParent)
hWndOwner = GetHwndOf(pParent);
else
hWndOwner = HWND_DESKTOP;
SetName(rsName);
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)
return FALSE;
SubclassWin(GetHWND());
if (pParent)
pParent->AddChild(this);
else
wxTopLevelWindows.Append(this);
return TRUE;
} // end of wxWindow::LoadNativeDialog
// ---------------------------------------------------------------------------
// look for child by id
// ---------------------------------------------------------------------------
wxWindow* wxWindow::GetWindowChild1 (
wxWindowID vId
)
{
if (m_windowId == vId)
return this;
wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
while (node)
{
wxWindow* pChild = node->GetData();
wxWindow* pWin = pChild->GetWindowChild1(vId);
if (pWin)
return pWin;
node = node->GetNext();
}
return NULL;
} // end of wxWindow::GetWindowChild1
wxWindow* wxWindow::GetWindowChild (
wxWindowID vId
)
{
wxWindow* pWin = GetWindowChild1(vId);
if (!pWin)
{
HWND hWnd = 0; // TODO: ::GetDlgItem((HWND) GetHWND(), id);
if (hWnd)
{
wxWindow* pChild = CreateWindowFromHWND( this
,(WXHWND)hWnd
);
if (pChild)
{
pChild->AddChild(this);
return pChild;
}
}
}
return NULL;
} // end of wxWindow::GetWindowChild
// ---------------------------------------------------------------------------
// create wxWin window from a native HWND
// ---------------------------------------------------------------------------
wxWindow* wxWindow::CreateWindowFromHWND (
wxWindow* pParent
, WXHWND hWnd
)
{
wxString sStr(wxGetWindowClass(hWnd));
long lId = wxGetWindowId(hWnd);
long lStyle = ::WinQueryWindowULong((HWND)hWnd
,QWL_STYLE
);
wxWindow* pWin = NULL;
sStr.UpperCase();
if (sStr == wxT("BUTTON"))
{
if (lStyle == BS_AUTOCHECKBOX)
{
pWin = new wxCheckBox;
}
else if (lStyle == BS_AUTORADIOBUTTON)
{
pWin = new wxRadioButton;
}
else if (lStyle & BS_BITMAP || lStyle == BS_USERBUTTON)
{
pWin = new wxBitmapButton;
}
else if (lStyle == BS_PUSHBUTTON)
{
pWin = new wxButton;
}
else if (lStyle == SS_GROUPBOX)
{
pWin = new wxStaticBox;
}
else
{
wxLogError(wxT("Don't know what kind of button this is: id = %ld"),
lId);
}
}
else if (sStr == wxT("COMBOBOX"))
{
pWin = new wxComboBox;
}
else if (sStr == wxT("EDIT"))
{
pWin = new wxTextCtrl;
}
else if (sStr == wxT("LISTBOX"))
{
pWin = new wxListBox;
}
else if (sStr == wxT("SCROLLBAR"))
{
pWin = new wxScrollBar;
}
else if (sStr == wxT("MSCTLS_UPDOWN32"))
{
pWin = new wxSpinButton;
}
else if (sStr == wxT("MSCTLS_TRACKBAR32"))
{
pWin = new wxSlider;
}
else if (sStr == wxT("STATIC"))
{
if (lStyle == SS_TEXT)
pWin = new wxStaticText;
else if (lStyle == SS_ICON)
{
pWin = new wxStaticBitmap;
}
}
else
{
wxString sMsg(wxT("Don't know how to convert from Windows class "));
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()
{
// Does nothing under OS/2
} // end of wxWindow::AdoptAttributesFromHWND