www.pudn.com > HumanAnimation.rar > MAINFRM.CPP
// MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "Triangle.h" #include "MainFrm.h" #include "TriangleView.h" #include "body.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_COMMAND_EX(CG_ID_VIEW_FRAMEDIALOGBAR, OnBarCheck) ON_UPDATE_COMMAND_UI(CG_ID_VIEW_FRAMEDIALOGBAR, OnUpdateControlBarMenu) ON_COMMAND_EX(CG_ID_VIEW_INFOBAR, OnBarCheck) ON_UPDATE_COMMAND_UI(CG_ID_VIEW_INFOBAR, OnUpdateControlBarMenu) ON_WM_CREATE() ON_COMMAND_EX(CG_ID_VIEW_SKELETENDIALOGBAR, OnBarCheck) ON_UPDATE_COMMAND_UI(CG_ID_VIEW_SKELETENDIALOGBAR, OnUpdateControlBarMenu) //{{AFX_MSG_MAP(CMainFrame) ON_WM_PALETTECHANGED() ON_WM_QUERYNEWPALETTE() ON_NOTIFY(TVN_SELCHANGED, IDC_BODYTREE, OnSelchangedTree) ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay) ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) ON_BN_CLICKED(IDC_BUTTON_ADDGROUP, OnButtonAddGroup) ON_BN_CLICKED(IDC_BUTTON_DELGROUP, OnButtonDelGroup) ON_BN_CLICKED(IDC_BUTTON_ADDFRAME, OnButtonAddFrame) ON_BN_CLICKED(IDC_BUTTON_DELFRAME, OnButtonDelFrame) ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext) ON_BN_CLICKED(IDC_BUTTON_PREV, OnButtonPrev) ON_BN_CLICKED(IDC_BUTTON_FIRST, OnButtonFirst) ON_BN_CLICKED(IDC_BUTTON_LAST, OnButtonLast) ON_COMMAND(ID_TOGGLE_ATTRIBUTEBAR, OnToggleAttributebar) ON_UPDATE_COMMAND_UI(ID_TOGGLE_ATTRIBUTEBAR, OnUpdateToggleAttributebar) ON_COMMAND(ID_TOGGLE_MANIPULATEBAR, OnToggleManipulatebar) ON_UPDATE_COMMAND_UI(ID_TOGGLE_MANIPULATEBAR, OnUpdateToggleManipulatebar) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() static char *BodyTypes[] = { "body ", "upper_body ", "head ", "shoulder ", "left_arm ", "right_arm ", "left_upper_arm ", "right_upper_arm ", "left_lower_arm ", "right_lower_arm ", "left_hand ", "right_hand ", "lower_body ", "left_leg ", "right_leg ", "left_upper_leg ", "right_upper_leg ", "left_lower_leg ", "right_lower_leg ", "left_foot ", "right_foot ", "left_elbow ", "right_elbow ", "left_wrist ", "right_wrist ", "left_knee ", "right_knee ", "left_ankle ", "right_ankle " }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { m_pView = NULL; body_id = BODY; } CMainFrame::~CMainFrame() { } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // the CREATESTRUCT cs return CFrameWnd::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) { CView* pView = GetActiveView(); if (pView) { // OnPaletteChanged is not public, so send a message. pView->SendMessage(WM_PALETTECHANGED, (WPARAM)(pFocusWnd->GetSafeHwnd()), (LPARAM)0); } } BOOL CMainFrame::OnQueryNewPalette() { CView* pView = GetActiveView(); if (pView) { return pView->SendMessage(WM_QUERYNEWPALETTE, (WPARAM)0, (LPARAM)0); } return FALSE; } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndManipulateBar.Create(this) || !m_wndManipulateBar.LoadToolBar(IDR_MANIPULATEBAR)) { TRACE0("Failed to create toolbar\n"); return -1; } m_wndManipulateBar.SetBarStyle(m_wndManipulateBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndManipulateBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndManipulateBar); if (!m_wndAttributeBar.Create(this) || !m_wndAttributeBar.LoadToolBar(IDR_ATTRIBUTEBAR)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } m_wndAttributeBar.SetBarStyle(m_wndAttributeBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndAttributeBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndAttributeBar); // TODO: Add a menu item that will toggle the visibility of the // dialog bar named "Skeleten Dialog Bar": // 1. In ResourceView, open the menu resource that is used by // the CMainFrame class // 2. Select the View submenu // 3. Double-click on the blank item at the bottom of the submenu // 4. Assign the new item an ID: CG_ID_VIEW_SKELETENDIALOGBAR // 5. Assign the item a Caption: Skeleten Dialog Bar // TODO: Change the value of CG_ID_VIEW_SKELETENDIALOGBAR to an appropriate value: // 1. Open the file resource.h // CG: The following block was inserted by the 'Dialog Bar' component { // Initialize dialog bar m_wndSkeletenDialogBar if (!m_wndSkeletenDialogBar.Create(this, CG_IDD_SKELETENDIALOGBAR, CBRS_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE, CG_ID_VIEW_SKELETENDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndSkeletenDialogBar\n"); return -1; // fail to create } m_wndSkeletenDialogBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndSkeletenDialogBar); } CTreeCtrl *pTreeCtrl = (CTreeCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_BODYTREE); TV_INSERTSTRUCT temp; temp.hParent = NULL; temp.hInsertAfter = TVI_LAST; temp.item.mask = TVIF_TEXT; temp.item.hItem = NULL; temp.item.state = 0; temp.item.stateMask = 0; temp.item.cchTextMax = 12; temp.item.iSelectedImage = 0; temp.item.cChildren = 0; temp.item.lParam = 0; temp.item.pszText = "body"; body = pTreeCtrl->InsertItem(&temp); temp.hParent = body; temp.item.pszText = "upper_body"; upper_body = pTreeCtrl->InsertItem(&temp); temp.hParent = body; temp.item.pszText = "lower_body"; lower_body = pTreeCtrl->InsertItem(&temp); temp.hParent = upper_body; temp.item.pszText = "head"; head = pTreeCtrl->InsertItem(&temp); temp.hParent = upper_body; temp.item.pszText = "shoulder"; shoulder = pTreeCtrl->InsertItem(&temp); temp.hParent = upper_body; temp.item.pszText = "left_arm"; left_arm = pTreeCtrl->InsertItem(&temp); temp.hParent = upper_body; temp.item.pszText = "right_arm"; right_arm = pTreeCtrl->InsertItem(&temp); temp.hParent = lower_body; temp.item.pszText = "left_leg"; left_leg = pTreeCtrl->InsertItem(&temp); temp.hParent = lower_body; temp.item.pszText = "right_leg"; right_leg = pTreeCtrl->InsertItem(&temp); temp.hParent = left_arm; temp.item.pszText = "left_upper_arm"; left_upper_arm = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "left_lower_arm"; left_lower_arm = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "left_hand"; left_hand = pTreeCtrl->InsertItem(&temp); temp.hParent = right_arm; temp.item.pszText = "right_upper_arm"; right_upper_arm = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "right_lower_arm"; right_lower_arm = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "right_hand"; right_hand = pTreeCtrl->InsertItem(&temp); temp.hParent = left_leg; temp.item.pszText = "left_upper_leg"; left_upper_leg = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "left_lower_leg"; left_lower_leg = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "left_foot"; left_foot = pTreeCtrl->InsertItem(&temp); temp.hParent = right_leg; temp.item.pszText = "right_upper_leg"; right_upper_leg = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "right_lower_leg"; right_lower_leg = pTreeCtrl->InsertItem(&temp); temp.item.pszText = "right_foot"; right_foot = pTreeCtrl->InsertItem(&temp); CSpinButtonCtrl *pSpin; pSpin = (CSpinButtonCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_SPIN_BODYTYPE); pSpin->SetRange(0, 1); pSpin->SetPos(0); pSpin = (CSpinButtonCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_SPIN_ORIENTATIONX); pSpin->SetRange(0, 1); pSpin->SetPos(0); pSpin = (CSpinButtonCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_SPIN_ORIENTATIONY); pSpin->SetRange(0, 1); pSpin->SetPos(0); pSpin = (CSpinButtonCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_SPIN_POSITIONY); pSpin->SetRange(0, 1); pSpin->SetPos(0); CString str = "Body Type : "; str += (LPCTSTR)BodyTypes[body_id]; m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_BODYTYPE, (LPCTSTR)str); // TODO: Add a menu item that will toggle the visibility of the // dialog bar named "Frame Dialog Bar": // 1. In ResourceView, open the menu resource that is used by // the CMainFrame class // 2. Select the View submenu // 3. Double-click on the blank item at the bottom of the submenu // 4. Assign the new item an ID: CG_ID_VIEW_FRAMEDIALOGBAR // 5. Assign the item a Caption: Frame Dialog Bar // TODO: Change the value of CG_ID_VIEW_FRAMEDIALOGBAR to an appropriate value: // 1. Open the file resource.h // CG: The following block was inserted by the 'Dialog Bar' component { // Initialize dialog bar m_wndFrameDialogBar if (!m_wndFrameDialogBar.Create(this, CG_IDD_FRAMEDIALOGBAR, CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE, CG_ID_VIEW_FRAMEDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndFrameDialogBar\n"); return -1; // fail to create } m_wndFrameDialogBar.EnableDocking(CBRS_ALIGN_BOTTOM | CBRS_ALIGN_TOP); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndFrameDialogBar); } m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); return 0; } void CMainFrame::SetRoot(void) { CTreeCtrl *pTreeCtrl = (CTreeCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_BODYTREE); pTreeCtrl->SelectItem(pTreeCtrl->GetRootItem()); } void CMainFrame::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { CTreeCtrl *pTreeCtrl = (CTreeCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_BODYTREE); NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; HTREEITEM hNewItem; HTREEITEM hOldItem; CString str = "Body Type : "; hOldItem = pNMTreeView->itemOld.hItem; hNewItem = pNMTreeView->itemNew.hItem; if(hNewItem != NULL) { if(hNewItem == body) { body_id = BODY; }else if(hNewItem == upper_body) { body_id = UPPER_BODY; }else if(hNewItem == lower_body) { body_id = LOWER_BODY; }else if(hNewItem == left_arm) { body_id = LEFT_ARM; }else if(hNewItem == right_arm) { body_id = RIGHT_ARM; }else if(hNewItem == left_leg) { body_id = LEFT_LEG; }else if(hNewItem == right_leg) { body_id = RIGHT_LEG; }else if(hNewItem == left_upper_arm) { body_id = LEFT_UPPER_ARM; }else if(hNewItem == right_upper_arm) { body_id = RIGHT_UPPER_ARM; }else if(hNewItem == left_lower_arm) { body_id = LEFT_LOWER_ARM; }else if(hNewItem == right_lower_arm) { body_id = RIGHT_LOWER_ARM; }else if(hNewItem == left_hand) { body_id = LEFT_HAND; }else if(hNewItem == right_hand) { body_id = RIGHT_HAND; }else if(hNewItem == left_upper_leg) { body_id = LEFT_UPPER_LEG; }else if(hNewItem == right_upper_leg) { body_id = RIGHT_UPPER_LEG; }else if(hNewItem == left_lower_leg) { body_id = LEFT_LOWER_LEG; }else if(hNewItem == right_lower_leg) { body_id = RIGHT_LOWER_LEG; }else if(hNewItem == left_foot) { body_id = LEFT_FOOT; }else if(hNewItem == right_foot) { body_id = RIGHT_FOOT; }else if(hNewItem == head) { body_id = HEAD; }else if(hNewItem == shoulder) { body_id = SHOULDER; } m_pView->SetActiveBody(body_id); str += (LPCTSTR)BodyTypes[body_id]; m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_BODYTYPE, (LPCTSTR)str); } *pResult = 0; } void CMainFrame::SetCurrentBodyToTree(int body_id) { CTreeCtrl *pTreeCtrl = (CTreeCtrl*)m_wndSkeletenDialogBar.GetDlgItem(IDC_BODYTREE); switch(body_id) { case BODY: pTreeCtrl->SelectItem(body); break; case UPPER_BODY: pTreeCtrl->SelectItem(upper_body); break; case HEAD: pTreeCtrl->SelectItem(head); break; case SHOULDER: pTreeCtrl->SelectItem(shoulder); break; case LEFT_ARM: pTreeCtrl->SelectItem(left_arm); break; case RIGHT_ARM: pTreeCtrl->SelectItem(right_arm); break; case LEFT_UPPER_ARM: pTreeCtrl->SelectItem(left_upper_arm); break; case RIGHT_UPPER_ARM: pTreeCtrl->SelectItem(right_upper_arm); break; case LEFT_LOWER_ARM: pTreeCtrl->SelectItem(left_lower_arm); break; case RIGHT_LOWER_ARM: pTreeCtrl->SelectItem(right_lower_arm); break; case LEFT_HAND: pTreeCtrl->SelectItem(left_hand); break; case RIGHT_HAND: pTreeCtrl->SelectItem(right_hand); break; case LOWER_BODY: pTreeCtrl->SelectItem(lower_body); break; case LEFT_LEG: pTreeCtrl->SelectItem(left_leg); break; case RIGHT_LEG: pTreeCtrl->SelectItem(right_leg); break; case LEFT_UPPER_LEG: pTreeCtrl->SelectItem(left_upper_leg); break; case RIGHT_UPPER_LEG: pTreeCtrl->SelectItem(right_upper_leg); break; case LEFT_LOWER_LEG: pTreeCtrl->SelectItem(left_lower_leg); break; case RIGHT_LOWER_LEG: pTreeCtrl->SelectItem(right_lower_leg); break; case LEFT_FOOT: pTreeCtrl->SelectItem(left_foot); break; case RIGHT_FOOT: pTreeCtrl->SelectItem(right_foot); break; } } void CMainFrame::SpinScroll(int ID, UINT updown) { CString str = "Body Type : "; switch(ID) { case IDC_SPIN_BODYTYPE: if(updown == UP) { body_id--; if(body_id < BODY) { body_id = BODY; } }else { body_id++; if(body_id > RIGHT_FOOT) { body_id = RIGHT_FOOT; } } str += (LPCTSTR)BodyTypes[body_id]; m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_BODYTYPE, (LPCTSTR)str); m_pView->SetActiveBody(body_id); SetCurrentBodyToTree(body_id); break; case IDC_SPIN_ORIENTATIONX: if(updown == UP) { m_pView->ManipulateBody(-0.01f, 0.0f); }else { m_pView->ManipulateBody(0.01f, 0.0f); } m_pView->Invalidate(FALSE); break; case IDC_SPIN_ORIENTATIONY: if(updown == UP) { m_pView->ManipulateBody(0.0f, -0.001f); }else { m_pView->ManipulateBody(0.0f, 0.001f); } m_pView->Invalidate(FALSE); break; case IDC_SPIN_POSITIONY: if(updown == UP) { m_pView->TranslateBody(-1.0f); }else { m_pView->TranslateBody(1.0f); } m_pView->Invalidate(FALSE); break; } } void CMainFrame::UpdateOrientation(int body_id, float x, float y) { CString str; if(body_id != BODY && body_id != LEFT_ARM && body_id != RIGHT_ARM && body_id != LEFT_LEG && body_id != RIGHT_LEG) { str.GetBuffer(40); str.Format("Orientation X : %f", x); m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_ORIENTATIONX, (LPCTSTR)str); str.Empty(); str.GetBuffer(40); str.Format("Orientation Y : %f", y); m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_ORIENTATIONY, (LPCTSTR)str); }else { str.GetBuffer(40); str.Format("Orientation X : None"); m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_ORIENTATIONX, (LPCTSTR)str); str.Empty(); str.GetBuffer(40); str.Format("Orientation Y : None"); m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_ORIENTATIONY, (LPCTSTR)str); } } void CMainFrame::UpdatePosition(float height) { CString str; str.GetBuffer(40); str.Format("Height : %f", height); m_wndSkeletenDialogBar.SetDlgItemText(IDC_STATIC_POSITIONY, (LPCTSTR)str); } void CMainFrame::UpdateFrame(int iCurrentFrame, int iMaxFrame) { CString str; str.GetBuffer(40); str.Format("Frame : %d / %d", iCurrentFrame, iMaxFrame); m_wndFrameDialogBar.SetDlgItemText(IDC_STATIC_FRAME, (LPCTSTR)str); } void CMainFrame::UpdatePlaySpeedInfo(int iPlaySpeed) { CString str; str.GetBuffer(40); str.Format("Play Speed : %d/30", iPlaySpeed); m_wndFrameDialogBar.SetDlgItemText(IDC_STATIC_PLAYSPEED, (LPCTSTR)str); } void CMainFrame::AddGroupString(CString *str) { CListBox *pListBox = (CListBox*)m_wndFrameDialogBar.GetDlgItem(IDC_LIST_ANIMGROUP); pListBox->AddString(*str); } void CMainFrame::DelGroupString(CString *str) { CListBox *pListBox = (CListBox*)m_wndFrameDialogBar.GetDlgItem(IDC_LIST_ANIMGROUP); int index = pListBox->FindStringExact(0, (LPCTSTR)*str); if(index == LB_ERR) { AfxMessageBox("Error occur : Test"); }else { pListBox->DeleteString(index); } } void CMainFrame::SetCurrentAnim(CString *str) { CListBox *pListBox = (CListBox*)m_wndFrameDialogBar.GetDlgItem(IDC_LIST_ANIMGROUP); int index = pListBox->FindStringExact(0, (LPCTSTR)*str); if(index == LB_ERR) { AfxMessageBox("Error occur : Set"); }else { pListBox->SetCurSel(index); } } void CMainFrame::PlaySpeed(int updown) { m_pView->PlaySpeed(updown); } void CMainFrame::GetCurrentAnim(CString *str) { } void CMainFrame::ListBoxChange(int i, CString& str) { m_pView->ChangeCurrentAnimation(i, str); } void CMainFrame::ChangeGroupName() { m_pView->ChangeGroupName(); } void CMainFrame::OnButtonPlay() { m_pView->FramePlay(); } void CMainFrame::OnButtonStop() { m_pView->FrameStop(); } void CMainFrame::OnButtonAddGroup() { m_pView->FrameAddGroup(); } void CMainFrame::OnButtonDelGroup() { m_pView->FrameDelGroup(); } void CMainFrame::OnButtonAddFrame() { m_pView->FrameAddFrame(); } void CMainFrame::OnButtonDelFrame() { m_pView->FrameDelFrame(); } void CMainFrame::OnButtonNext() { m_pView->FrameNext(); } void CMainFrame::OnButtonPrev() { m_pView->FramePrev(); } void CMainFrame::OnButtonFirst() { m_pView->FrameFirst(); } void CMainFrame::OnButtonLast() { m_pView->FrameLast(); } void CMainFrame::OnToggleAttributebar() { if(m_wndAttributeBar.IsWindowVisible() == TRUE) { m_wndAttributeBar.ShowWindow(SW_HIDE); }else { m_wndAttributeBar.ShowWindow(SW_SHOW); } Invalidate(TRUE); } void CMainFrame::OnUpdateToggleAttributebar(CCmdUI* pCmdUI) { if(m_wndAttributeBar.IsWindowVisible() == TRUE) { pCmdUI->SetCheck(TRUE); }else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnToggleManipulatebar() { if(m_wndManipulateBar.IsWindowVisible() == TRUE) { m_wndManipulateBar.ShowWindow(SW_HIDE); }else { m_wndManipulateBar.ShowWindow(SW_SHOW); } Invalidate(TRUE); } void CMainFrame::OnUpdateToggleManipulatebar(CCmdUI* pCmdUI) { if(m_wndManipulateBar.IsWindowVisible() == TRUE) { pCmdUI->SetCheck(TRUE); }else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting if (IsIconic()) { // Erase the icon background when placed over other app window DefWindowProc(WM_ICONERASEBKGND, (WORD)dc.m_hDC, 0L); // Center the icon CRect rc; GetClientRect(&rc); rc.left = (rc.right - ::GetSystemMetrics(SM_CXICON))/2; rc.top = (rc.bottom - ::GetSystemMetrics(SM_CYICON))/2; // Draw the icon dc.DrawIcon(rc.left, rc.top, m_hIcon); } }