static void Application_processMessageQueue() { while(!messageQueue.empty()) { Message message = messageQueue.takeFirst(); if(message.type == Message::Type::ListView_OnActivate) { ListView* listView = (ListView*)message.object; if(listView->onActivate) listView->onActivate(); } } }
static LRESULT CALLBACK Shared_windowProc(WindowProc windowProc, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { Object* object = (Object*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if(object == nullptr) return DefWindowProc(hwnd, msg, wparam, lparam); Window& window = dynamic_cast<Window*>(object) ? *(Window*)object : *((Widget*)object)->Sizable::state.window; bool process = true; if(!pWindow::modal.empty() && !pWindow::modal.find(&window.p)) process = false; if(applicationState.quit) process = false; if(process == false) return DefWindowProc(hwnd, msg, wparam, lparam); switch(msg) { case WM_CTLCOLORBTN: case WM_CTLCOLORSTATIC: { Object* object = (Object*)GetWindowLongPtr((HWND)lparam, GWLP_USERDATA); if(object == nullptr) break; if(dynamic_cast<HexEdit*>(object) || dynamic_cast<LineEdit*>(object) || dynamic_cast<TextEdit*>(object)) { //text edit controls, when disabled, use CTLCOLORSTATIC instead of CTLCOLOREDIT //override this behavior: we do not want read-only edit controls to use the parent window background color return windowProc(hwnd, WM_CTLCOLOREDIT, wparam, lparam); } else if(!GetParentWidget((Sizable*)object) && window.p.brush) { SetBkColor((HDC)wparam, window.p.brushColor); return (INT_PTR)window.p.brush; } break; } case WM_DRAWITEM: { unsigned id = LOWORD(wparam); HWND control = GetDlgItem(hwnd, id); Object* object = (Object*)GetWindowLongPtr(control, GWLP_USERDATA); if(object == nullptr) break; if(dynamic_cast<TabFrame*>(object)) { ((TabFrame*)object)->p.onDrawItem(lparam); return TRUE; } break; } case WM_COMMAND: { unsigned id = LOWORD(wparam); HWND control = GetDlgItem(hwnd, id); Object* object = control ? (Object*)GetWindowLongPtr(control, GWLP_USERDATA) : pObject::find(id); if(object == nullptr) break; if(dynamic_cast<Item*>(object)) { ((Item*)object)->p.onActivate(); return FALSE; } if(dynamic_cast<CheckItem*>(object)) { ((CheckItem*)object)->p.onToggle(); return FALSE; } if(dynamic_cast<RadioItem*>(object)) { ((RadioItem*)object)->p.onActivate(); return FALSE; } if(dynamic_cast<Button*>(object)) { ((Button*)object)->p.onActivate(); return FALSE; } if(dynamic_cast<CheckButton*>(object)) { ((CheckButton*)object)->p.onToggle(); return FALSE; } if(dynamic_cast<CheckLabel*>(object)) { ((CheckLabel*)object)->p.onToggle(); return FALSE; } if(dynamic_cast<ComboButton*>(object) && HIWORD(wparam) == CBN_SELCHANGE) { ((ComboButton*)object)->p.onChange(); return FALSE; } if(dynamic_cast<LineEdit*>(object) && HIWORD(wparam) == EN_CHANGE) { ((LineEdit*)object)->p.onChange(); return FALSE; } if(dynamic_cast<RadioButton*>(object)) { ((RadioButton*)object)->p.onActivate(); return FALSE; } if(dynamic_cast<RadioLabel*>(object)) { ((RadioLabel*)object)->p.onActivate(); return FALSE; } if(dynamic_cast<TextEdit*>(object) && HIWORD(wparam) == EN_CHANGE) { ((TextEdit*)object)->p.onChange(); return FALSE; } break; } case WM_NOTIFY: { unsigned id = LOWORD(wparam); HWND control = GetDlgItem(hwnd, id); Object* object = (Object*)GetWindowLongPtr(control, GWLP_USERDATA); if(object == nullptr) break; if(dynamic_cast<ListView*>(object) && ((LPNMHDR)lparam)->code == LVN_ITEMACTIVATE) { ((ListView*)object)->p.onActivate(lparam); break; } if(dynamic_cast<ListView*>(object) && ((LPNMHDR)lparam)->code == LVN_ITEMCHANGED) { ((ListView*)object)->p.onChange(lparam); break; } if(dynamic_cast<ListView*>(object) && ((LPNMHDR)lparam)->code == NM_CUSTOMDRAW) { return ((ListView*)object)->p.onCustomDraw(lparam); } if(dynamic_cast<TabFrame*>(object) && ((LPNMHDR)lparam)->code == TCN_SELCHANGE) { ((TabFrame*)object)->p.onChange(); break; } break; } case WM_APP + AppMessage::ListView_onActivate: { ListView* listView = (ListView*)lparam; if(listView && listView->onActivate) listView->onActivate(); break; } case WM_HSCROLL: case WM_VSCROLL: { Object* object = nullptr; if(lparam) { object = (Object*)GetWindowLongPtr((HWND)lparam, GWLP_USERDATA); } else { unsigned id = LOWORD(wparam); HWND control = GetDlgItem(hwnd, id); object = (Object*)GetWindowLongPtr(control, GWLP_USERDATA); } if(object == nullptr) break; if(dynamic_cast<HorizontalScroller*>(object)) { ((HorizontalScroller*)object)->p.onChange(wparam); return TRUE; } if(dynamic_cast<VerticalScroller*>(object)) { ((VerticalScroller*)object)->p.onChange(wparam); return TRUE; } if(dynamic_cast<HorizontalSlider*>(object)) { ((HorizontalSlider*)object)->p.onChange(); return TRUE; } if(dynamic_cast<VerticalSlider*>(object)) { ((VerticalSlider*)object)->p.onChange(); return TRUE; } break; } } return windowProc(hwnd, msg, wparam, lparam); }