void mxTab::add (mxWidget *widget, const char *text) { TC_ITEM ti; ti.mask = TCIF_TEXT | TCIF_PARAM; ti.pszText = (LPSTR) text; ti.lParam = (LPARAM) widget; TabCtrl_InsertItem ((HWND) getHandle (), TabCtrl_GetItemCount ((HWND) getHandle ()), &ti); mxTab_resizeChild ((HWND) getHandle ()); }
void mxWidget::setBounds (int x, int y, int w, int h) { char str[128]; GetClassName (d_this->d_hwnd, str, 128); if (!strcmp (str, "COMBOBOX")) MoveWindow (d_this->d_hwnd, x, y, w, h + 100, TRUE); else MoveWindow (d_this->d_hwnd, x, y, w, h, TRUE); if (!strcmp (str, WC_TABCONTROL)) mxTab_resizeChild (d_this->d_hwnd); }
static LRESULT CALLBACK WndProc (HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { static bool bDragging = FALSE; switch (uMessage) { case WM_SETFOCUS: case WM_KILLFOCUS: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if ( window ) { mxEvent event; event.event = mxEvent::Focus; event.widget = NULL; event.action = (uMessage == WM_SETFOCUS); RecursiveHandleEvent( window, &event ); return 0; } } break; case WM_ACTIVATE: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if ( window ) { mxEvent event; event.event = mxEvent::Activate; event.widget = NULL; event.action = (LOWORD( wParam ) != WA_INACTIVE); RecursiveHandleEvent( window, &event ); return 0; } } break; case WM_COMMAND: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (LOWORD (wParam) > 0 && window) { WORD wNotifyCode = (WORD) HIWORD (wParam); HWND hwndCtrl = (HWND) lParam; mxEvent event; CHAR className[128]; GetClassName (hwndCtrl, className, 128); if (!strcmpi (className, "edit")) { if (wNotifyCode != EN_CHANGE) break; } else if (!strcmpi (className, "combobox")) { if (wNotifyCode != CBN_SELCHANGE) break; } else if (!strcmpi (className, "listbox")) { if (wNotifyCode != LBN_SELCHANGE) break; } event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong ((HWND) lParam, GWL_USERDATA); event.action = (int) LOWORD (wParam); RecursiveHandleEvent( window, &event ); } } break; case WM_NOTIFY: { if (isClosing) break; NMHDR *nmhdr = (NMHDR *) lParam; mxEvent event; #if 0 //if ( nmhdr->idFrom > 0 ) { mxWidget *temp = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); if ( temp && temp->getType() == MX_TREEVIEW ) { NMTREEVIEW *nmt = ( NMTREEVIEW * )nmhdr; HTREEITEM hItem = TreeView_GetSelection (nmhdr->hwndFrom); char sz[ 256 ]; sprintf( sz, "tree view receiving notify %i : %s action %i old %p new %p selection %p\n", nmhdr->code, translatecode( nmhdr->code ), nmt->action, nmt->itemOld, nmt->itemNew, hItem ); OutputDebugString( sz ); } } #endif if (nmhdr->code == TVN_SELCHANGED) { if (nmhdr->idFrom > 0) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); event.action = (int) nmhdr->idFrom; RECT rc; HTREEITEM hItem = TreeView_GetSelection (nmhdr->hwndFrom); TreeView_GetItemRect (nmhdr->hwndFrom, hItem, &rc, TRUE); event.x = (int) rc.left; event.y = (int) rc.bottom; RecursiveHandleEvent( window, &event ); } } else if (nmhdr->code == LVN_ITEMCHANGED) { if (nmhdr->idFrom > 0) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); event.action = (int) nmhdr->idFrom; RecursiveHandleEvent( window, &event ); } } else if (nmhdr->code == NM_RCLICK) { if (nmhdr->idFrom > 0) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); event.action = (int) nmhdr->idFrom; event.flags = mxEvent::RightClicked; if ( event.widget ) { if ( event.widget->getType () == MX_TREEVIEW ) { RECT rc; HTREEITEM hItem = TreeView_GetSelection (nmhdr->hwndFrom); TreeView_GetItemRect (nmhdr->hwndFrom, hItem, &rc, TRUE); event.x = (int) rc.left; event.y = (int) rc.bottom; } } RecursiveHandleEvent( window, &event ); } } else if (nmhdr->code == NM_DBLCLK) { if (nmhdr->idFrom > 0) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); event.action = (int) nmhdr->idFrom; event.flags = mxEvent::DoubleClicked; if (event.widget ) { if ( event.widget->getType () == MX_TREEVIEW ) { RECT rc; HTREEITEM hItem = TreeView_GetSelection (nmhdr->hwndFrom); TreeView_GetItemRect (nmhdr->hwndFrom, hItem, &rc, TRUE); event.x = (int) rc.left; event.y = (int) rc.bottom; } } RecursiveHandleEvent( window, &event ); return TRUE; } } else if (nmhdr->code == TCN_SELCHANGING) { TC_ITEM ti; int index = TabCtrl_GetCurSel (nmhdr->hwndFrom); if (index >= 0) { ti.mask = TCIF_PARAM; TabCtrl_GetItem (nmhdr->hwndFrom, index, &ti); mxWindow *window = (mxWindow *) ti.lParam; if (window) window->setVisible (false); } } else if (nmhdr->code == TCN_SELCHANGE) { mxTab_resizeChild (nmhdr->hwndFrom); if (nmhdr->idFrom > 0) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); event.event = mxEvent::Action; event.widget = (mxWidget *) GetWindowLong (nmhdr->hwndFrom, GWL_USERDATA); event.action = (int) nmhdr->idFrom; RecursiveHandleEvent( window, &event ); } } } break; case WM_SIZE: { mxEvent event; mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { event.event = mxEvent::Size; event.width = (int) LOWORD (lParam); event.height = (int) HIWORD (lParam); window->handleEvent (&event); } } break; case WM_WINDOWPOSCHANGED: { mxEvent event; mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { event.event = mxEvent::PosChanged; WINDOWPOS *wp = ( WINDOWPOS * )lParam; event.x = wp->x; event.y = wp->y; event.width = wp->cx; event.height = wp->cy; window->handleEvent (&event); } } break; case WM_ERASEBKGND: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { if (window->getType () == MX_GLWINDOW) return 0; if (window->getType () == MX_MATSYSWINDOW) return 0; if ( !isClosing && !window->PaintBackground() ) { return 0; } } } break; case WM_HSCROLL: case WM_VSCROLL: { mxWidget *widget = (mxWidget *) GetWindowLong ((HWND) lParam, GWL_USERDATA); if (!widget) { break; } if (widget->getType() != MX_SCROLLBAR && widget->getType() != MX_SLIDER) { break; } switch (LOWORD (wParam)) { case TB_LINEUP: // SB_LINEUP SB_LINELEFT break; case TB_LINEDOWN: // SB_LINEDOWN SB_LINERIGHT break; case TB_PAGEUP: // SB_PAGEUP SB_PAGELEFT break; case TB_PAGEDOWN: // SB_PAGEDOWN SB_PAGERIGHT break; case TB_THUMBPOSITION: // SB_THUMBPOSITION break; case TB_THUMBTRACK: // SB_THUMBTRACK break; case TB_TOP: // SB_TOP SB_LEFT break; case TB_BOTTOM: // SB_BOTTOM SB_RIGHT break; case TB_ENDTRACK: // SB_ENDSCROLL break; default: break; } switch (LOWORD (wParam)) { case TB_LINEUP: // SB_LINEUP SB_LINELEFT case TB_LINEDOWN: // SB_LINEDOWN SB_LINERIGHT case TB_PAGEUP: // SB_PAGEUP SB_PAGELEFT case TB_PAGEDOWN: // SB_PAGEDOWN SB_PAGERIGHT case TB_THUMBPOSITION: // SB_THUMBPOSITION case TB_THUMBTRACK: // SB_THUMBTRACK case TB_TOP: // SB_TOP SB_LEFT case TB_BOTTOM: // SB_BOTTOM SB_RIGHT case TB_ENDTRACK: // SB_ENDSCROLL { mxEvent event; event.event = mxEvent::Action; event.widget = widget; event.action = widget->getId (); event.modifiers = LOWORD (wParam); event.height = HIWORD( wParam ); mxWindow *window = widget->getParent (); if ( event.action > 0 ) { RecursiveHandleEvent( window, &event ); } } break; } } break; case WM_PAINT: { if ( !isClosing ) { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { window->redraw (); } } } break; case WM_PARENTNOTIFY: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { if ( wParam == WM_LBUTTONDOWN || wParam == WM_MBUTTONDOWN || wParam == WM_RBUTTONDOWN /*|| wParam & WM_XBUTTONDOWN*/ ) { mxEvent event; event.event = mxEvent::ParentNotify; event.x = (short)LOWORD (lParam); event.y = (short)HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if ( wParam == WM_LBUTTONDOWN ) event.buttons |= mxEvent::MouseLeftButton; if ( wParam == WM_RBUTTONDOWN ) event.buttons |= mxEvent::MouseRightButton; if ( wParam == WM_MBUTTONDOWN ) event.buttons |= mxEvent::MouseMiddleButton; window->handleEvent (&event); RecursiveHandleEvent( window, &event ); return 0; } } } break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { bDragging = TRUE; SetCapture (hwnd); mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::MouseDown; event.x = (short)LOWORD (lParam); event.y = (short)HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if (uMessage == WM_MBUTTONDOWN) event.buttons |= mxEvent::MouseMiddleButton; else if (uMessage == WM_RBUTTONDOWN) event.buttons |= mxEvent::MouseRightButton; else event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_LBUTTON) event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_RBUTTON) event.buttons |= mxEvent::MouseRightButton; if (wParam & MK_MBUTTON) event.buttons |= mxEvent::MouseMiddleButton; if (wParam & MK_CONTROL) event.modifiers |= mxEvent::KeyCtrl; if (wParam & MK_SHIFT) event.modifiers |= mxEvent::KeyShift; window->handleEvent (&event); } } break; case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::MouseUp; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if (uMessage == WM_MBUTTONUP) event.buttons |= mxEvent::MouseMiddleButton; else if (uMessage == WM_RBUTTONUP) event.buttons |= mxEvent::MouseRightButton; else event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_LBUTTON) event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_RBUTTON) event.buttons |= mxEvent::MouseRightButton; if (wParam & MK_MBUTTON) event.buttons |= mxEvent::MouseMiddleButton; if (wParam & MK_CONTROL) event.modifiers |= mxEvent::KeyCtrl; if (wParam & MK_SHIFT) event.modifiers |= mxEvent::KeyShift; window->handleEvent (&event); } bDragging = FALSE; ReleaseCapture (); } break; case WM_MOUSEMOVE: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; if (bDragging) event.event = mxEvent::MouseDrag; else event.event = mxEvent::MouseMove; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if (wParam & MK_LBUTTON) event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_RBUTTON) event.buttons |= mxEvent::MouseRightButton; if (wParam & MK_MBUTTON) event.buttons |= mxEvent::MouseMiddleButton; if (wParam & MK_CONTROL) event.modifiers |= mxEvent::KeyCtrl; if (wParam & MK_SHIFT) event.modifiers |= mxEvent::KeyShift; window->handleEvent (&event); } } break; case WM_NCLBUTTONDOWN: case WM_NCMBUTTONDOWN: case WM_NCRBUTTONDOWN: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::NCMouseDown; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if (uMessage == WM_NCMBUTTONDOWN) event.buttons |= mxEvent::MouseMiddleButton; else if (uMessage == WM_NCRBUTTONDOWN) event.buttons |= mxEvent::MouseRightButton; else event.buttons |= mxEvent::MouseLeftButton; window->handleEvent (&event); } } break; case WM_NCLBUTTONUP: case WM_NCMBUTTONUP: case WM_NCRBUTTONUP: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::NCMouseUp; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); event.buttons = 0; event.modifiers = 0; if (uMessage == WM_NCMBUTTONUP) event.buttons |= mxEvent::MouseMiddleButton; else if (uMessage == WM_NCRBUTTONUP) event.buttons |= mxEvent::MouseRightButton; else event.buttons |= mxEvent::MouseLeftButton; window->handleEvent (&event); } } break; case WM_NCMOUSEMOVE: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::NCMouseMove; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); event.buttons = 0; event.modifiers = 0; window->handleEvent (&event); } } break; case WM_KEYDOWN: case WM_SYSKEYDOWN: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::KeyDown; event.key = (int) wParam; if ( window->handleEvent (&event) ) return 0; } } break; case WM_CHAR: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::Char; event.key = (int) wParam; if ( window->handleEvent (&event) ) return 0; } } break; case WM_SYSCHAR: return 0; break; case WM_KEYUP: case WM_SYSKEYUP: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::KeyUp; event.key = (int) wParam; if ( window->handleEvent (&event) ) return 0; } } break; case WM_MOUSEWHEEL: { mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; memset( &event, 0, sizeof( event ) ); event.event = mxEvent::MouseWheeled; event.x = (short) LOWORD (lParam); event.y = (short) HIWORD (lParam); if (wParam & MK_LBUTTON) event.buttons |= mxEvent::MouseLeftButton; if (wParam & MK_RBUTTON) event.buttons |= mxEvent::MouseRightButton; if (wParam & MK_MBUTTON) event.buttons |= mxEvent::MouseMiddleButton; if (wParam & MK_CONTROL) event.modifiers |= mxEvent::KeyCtrl; if (wParam & MK_SHIFT) event.modifiers |= mxEvent::KeyShift; event.height = (short)HIWORD( wParam );; RecursiveHandleEvent( window, &event ); } } break; case WM_TIMER: { if (isClosing) break; mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::Timer; window->handleEvent (&event); } } break; case WM_CLOSE: if (g_mainWindow) { if ((void *) hwnd == g_mainWindow->getHandle ()) { mx::quit (); } else { ShowWindow (hwnd, SW_HIDE); mxWindow *window = (mxWindow *) GetWindowLong (hwnd, GWL_USERDATA); if (window) { mxEvent event; event.event = mxEvent::Close; window->handleEvent( &event ); } } } //else // shouldn't happen //DestroyWindow (hwnd); return 0; /* case WM_DESTROY: if (g_mainWindow) { if ((void *) hwnd == g_mainWindow->getHandle ()) mx::quit (); } break; */ } return DefWindowProc (hwnd, uMessage, wParam, lParam); }