summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo2001-01-29 23:40:20 +0000
committerleo2001-01-29 23:40:20 +0000
commit284ee630366231f6a0c893c9b3d3ce1d62b925d6 (patch)
tree73474cfa4884260b75d942c9e3847c4663dbde28
parent07636fc79aa7bcc76746e742925593ff085f076e (diff)
Minifig Wizard fixes
git-svn-id: http://svn.leocad.org/trunk@235 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/glwindow.h6
-rw-r--r--common/project.cpp30
-rw-r--r--win/Figdlg.cpp28
-rw-r--r--win/Leocad.clw4
-rw-r--r--win/Mainfrm.cpp47
-rw-r--r--win/glwindow.cpp39
6 files changed, 95 insertions, 59 deletions
diff --git a/common/glwindow.h b/common/glwindow.h
index 8559c4b..caba367 100644
--- a/common/glwindow.h
+++ b/common/glwindow.h
@@ -7,6 +7,11 @@ class GLWindow
GLWindow (GLWindow *share);
virtual ~GLWindow ();
+ void IncRef ()
+ { m_nRef++; }
+ void DecRef ()
+ { m_nRef--; if (m_nRef == 0) delete this; }
+
bool Create (void* data);
void DestroyContext ();
@@ -38,6 +43,7 @@ class GLWindow
private:
void *m_pData;
GLWindow *m_pShare;
+ int m_nRef;
};
#endif // _GLWINDOW_H_
diff --git a/common/project.cpp b/common/project.cpp
index 92be49d..311ba29 100644
--- a/common/project.cpp
+++ b/common/project.cpp
@@ -4674,34 +4674,36 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam)
case LC_PIECE_MINIFIG:
{
- MinifigWizard wiz (m_ViewList[0]);
+ MinifigWizard *wiz = new MinifigWizard (m_ViewList[0]);
int i;
- if (SystemDoDialog (LC_DLG_MINIFIG, &wiz))
+ wiz->IncRef ();
+
+ if (SystemDoDialog (LC_DLG_MINIFIG, wiz))
{
SelectAndFocusNone(false);
for (i = 0; i < LC_MFW_NUMITEMS; i++)
{
- if (wiz.m_Info[i] == NULL)
- continue;
+ if (wiz->m_Info[i] == NULL)
+ continue;
Matrix mat;
- Piece* pPiece = new Piece(wiz.m_Info[i]);
+ Piece* pPiece = new Piece(wiz->m_Info[i]);
- pPiece->Initialize(wiz.m_Position[i][0], wiz.m_Position[i][1], wiz.m_Position[i][2],
- m_nCurStep, m_nCurFrame, wiz.m_Colors[i]);
+ pPiece->Initialize(wiz->m_Position[i][0], wiz->m_Position[i][1], wiz->m_Position[i][2],
+ m_nCurStep, m_nCurFrame, wiz->m_Colors[i]);
pPiece->CreateName(m_pPieces);
AddPiece(pPiece);
pPiece->Select(true, false, false);
- pPiece->ChangeKey(1, false, false, wiz.m_Rotation[i], LC_PK_ROTATION);
- pPiece->ChangeKey(1, true, false, wiz.m_Rotation[i], LC_PK_ROTATION);
+ pPiece->ChangeKey(1, false, false, wiz->m_Rotation[i], LC_PK_ROTATION);
+ pPiece->ChangeKey(1, true, false, wiz->m_Rotation[i], LC_PK_ROTATION);
pPiece->UpdatePosition(m_bAnimation ? m_nCurFrame : m_nCurStep, m_bAnimation);
pPiece->CalculateConnections(m_pConnections, m_bAnimation ? m_nCurFrame : m_nCurStep,
m_bAnimation, false, true);
- SystemPieceComboAdd(wiz.m_Info[i]->m_strDescription);
+ SystemPieceComboAdd(wiz->m_Info[i]->m_strDescription);
}
float bs[6] = { 10000, 10000, 10000, -10000, -10000, -10000 };
@@ -4730,7 +4732,7 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam)
pGroup->m_fCenter[1] = (bs[1]+bs[4])/2;
pGroup->m_fCenter[2] = (bs[2]+bs[5])/2;
- messenger->Dispatch (LC_MSG_FOCUS_CHANGED, NULL);
+ messenger->Dispatch (LC_MSG_FOCUS_CHANGED, NULL);
UpdateSelection();
UpdateAllViews();
SetModifiedFlag(true);
@@ -4738,8 +4740,10 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam)
}
for (i = 0; i < LC_MFW_NUMITEMS; i++)
- if (wiz.m_Info[i])
- wiz.m_Info[i]->DeRef();
+ if (wiz->m_Info[i])
+ wiz->m_Info[i]->DeRef();
+
+ wiz->DecRef ();
} break;
case LC_PIECE_ARRAY:
diff --git a/win/Figdlg.cpp b/win/Figdlg.cpp
index d40c1ca..60e4298 100644
--- a/win/Figdlg.cpp
+++ b/win/Figdlg.cpp
@@ -70,9 +70,33 @@ BOOL CMinifigDlg::OnInitDialog()
::GetWindowRect (::GetDlgItem(m_hWnd, IDC_PREVIEWSTATIC), &r);
ScreenToClient (&r);
+ HINSTANCE hInst = AfxGetInstanceHandle();
+ WNDCLASS wndcls;
+LRESULT CALLBACK GLWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+#define OPENGL_CLASSNAME _T("LeoCADOpenGLClass")
+#define MINIFIG_CLASSNAME _T("LeoCADMinifigOpenGLClass")
+
+ // check if our class is registered
+ if(!(GetClassInfo (hInst, MINIFIG_CLASSNAME, &wndcls)))
+ {
+ if (GetClassInfo (hInst, OPENGL_CLASSNAME, &wndcls))
+ {
+ // set our class name
+ wndcls.lpszClassName = MINIFIG_CLASSNAME;
+ wndcls.lpfnWndProc = GLWindowProc;
+
+ // register class
+ if (!AfxRegisterClass (&wndcls))
+ AfxThrowResourceException();
+ }
+ else
+ AfxThrowResourceException();
+ }
+
m_pMinifigWnd = new CWnd;
- m_pMinifigWnd->Create (NULL, NULL, WS_BORDER | WS_CHILD | WS_VISIBLE, r, this, 501);
- m_pMinifig->Create (m_pMinifigWnd);
+ m_pMinifigWnd->CreateEx (0, MINIFIG_CLASSNAME, "LeoCAD",
+ WS_BORDER | WS_CHILD | WS_VISIBLE, r, this, 0, m_pMinifig);
for (int i = 0; i < LC_MFW_NUMITEMS; i++)
((CColorPicker*)GetDlgItem (IDC_MF_HATCOLOR+i))->SetColorIndex (m_pMinifig->m_Colors[i]);
diff --git a/win/Leocad.clw b/win/Leocad.clw
index 07d379e..3852d08 100644
--- a/win/Leocad.clw
+++ b/win/Leocad.clw
@@ -2,7 +2,7 @@
[General Info]
Version=1
-LastClass=CMainFrame
+LastClass=CCADView
LastTemplate=CHeaderCtrl
NewFileInclude1=#include "stdafx.h"
NewFileInclude2=#include "leocad.h"
@@ -130,7 +130,7 @@ HeaderFile=Cadview.h
ImplementationFile=Cadview.cpp
Filter=C
VirtualFilter=VWC
-LastObject=CCADView
+LastObject=ID_FILE_PRINT_PREVIEW
[CLS:CColorPicker]
Type=0
diff --git a/win/Mainfrm.cpp b/win/Mainfrm.cpp
index d6819d1..f25fa78 100644
--- a/win/Mainfrm.cpp
+++ b/win/Mainfrm.cpp
@@ -933,51 +933,13 @@ void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
project->HandleNotify(LC_ACTIVATE, bActive ? 1 : 0);
}
-#include "glwindow.h"
#include "view.h"
-
-BOOL GLWindowPreTranslateMessage (GLWindow *wnd, MSG *pMsg);
-
-static LRESULT CALLBACK GLWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- static CMapPtrToPtr WindowMap;
- GLWindow *wnd;
-
- if (uMsg == WM_CREATE)
- {
- View *view = new View (project, NULL);
- view->Create (hwnd);
-
- WindowMap.SetAt (hwnd, view);
- }
-
- wnd = (GLWindow*)WindowMap[hwnd];
-
- if (wnd)
- {
- MSG msg;
- msg.hwnd = hwnd;
- msg.message = uMsg;
- msg.wParam = wParam;
- msg.lParam = lParam;
-
- GLWindowPreTranslateMessage (wnd, &msg);
-
- if (uMsg == WM_DESTROY)
- {
- WindowMap.RemoveKey (hwnd);
- delete wnd;
- }
- }
-
- return DefWindowProc (hwnd, uMsg, wParam, lParam);
-}
+LRESULT CALLBACK GLWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void CMainFrame::OnViewNewView()
{
HINSTANCE hInst = AfxGetInstanceHandle();
WNDCLASS wndcls;
- CWnd *pWnd;
#define OPENGL_CLASSNAME _T("LeoCADOpenGLClass")
#define FLOATING_CLASSNAME _T("LeoCADFloatingOpenGLClass")
@@ -1000,9 +962,10 @@ void CMainFrame::OnViewNewView()
AfxThrowResourceException();
}
- pWnd = new CWnd ();
- pWnd->CreateEx (0, FLOATING_CLASSNAME, "LeoCAD",
+ View *view = new View (project, NULL);
+
+ CreateWindowEx (0, FLOATING_CLASSNAME, "LeoCAD",
WS_VISIBLE | WS_POPUPWINDOW | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 200, 100,
- m_hWnd, (HMENU)0, NULL);
+ m_hWnd, (HMENU)0, hInst, view);
}
diff --git a/win/glwindow.cpp b/win/glwindow.cpp
index 91103ec..6ddf1df 100644
--- a/win/glwindow.cpp
+++ b/win/glwindow.cpp
@@ -81,11 +81,50 @@ BOOL GLWindowPreTranslateMessage (GLWindow *wnd, MSG *pMsg)
return FALSE;
}
+LRESULT CALLBACK GLWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ static CMapPtrToPtr WindowMap;
+ GLWindow *wnd;
+
+ if (uMsg == WM_CREATE)
+ {
+ LPCREATESTRUCT cs = (LPCREATESTRUCT)lParam;
+
+ wnd = (GLWindow*)cs->lpCreateParams;
+ wnd->Create (hwnd);
+ wnd->IncRef ();
+
+ WindowMap.SetAt (hwnd, wnd);
+ }
+
+ wnd = (GLWindow*)WindowMap[hwnd];
+
+ if (wnd)
+ {
+ MSG msg;
+ msg.hwnd = hwnd;
+ msg.message = uMsg;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+
+ GLWindowPreTranslateMessage (wnd, &msg);
+
+ if (uMsg == WM_DESTROY)
+ {
+ WindowMap.RemoveKey (hwnd);
+ wnd->DecRef ();
+ }
+ }
+
+ return DefWindowProc (hwnd, uMsg, wParam, lParam);
+}
+
// ============================================================================
// GLWindow class
GLWindow::GLWindow (GLWindow *share)
{
+ m_nRef = 0;
m_pShare = share;
m_pData = (GLWindowPrivate*) malloc (sizeof (GLWindowPrivate));
memset (m_pData, 0, sizeof (GLWindowPrivate));