//******************************************************************************* LRESULT CBCGPGanttView::OnNotifyChartDblClickHeader (WPARAM wParam, LPARAM lParam) { CPoint point; POINTSTOPOINT (point, lParam); return (LRESULT)OnChartDoubleClickHeader ((UINT)wParam, point); }
// Helper to dispatch messages to the Desktop Window Manager for processing LRESULT cef_dark_aero_window::DwpCustomFrameProc(UINT message, WPARAM wParam, LPARAM lParam, bool* pfCallDefWindowProc) { LRESULT lr = 0L; *pfCallDefWindowProc = CDwmDLL::DwmDefWindowProc(mWnd, message, wParam, lParam, &lr) == 0; switch (message) { case WM_CREATE: if (HandleCreate()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_ACTIVATE: if (HandleActivate()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_PAINT: if (HandlePaint()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_NCCALCSIZE: if (HandleNcCalcSize((BOOL)(wParam != 0), reinterpret_cast<NCCALCSIZE_PARAMS*>(lParam), &lr)) { *pfCallDefWindowProc = false; } break; case WM_NCHITTEST: if (lr == 0) { // Handle hit testing in the NCA if not handled by DwmDefWindowProc. POINT pt; POINTSTOPOINT(pt, lParam); lr = HandleNcHitTest(&pt); if (lr != HTNOWHERE) { *pfCallDefWindowProc = false; } } break; } return lr; }
/* * Handler for dialog windows */ static LRESULT CALLBACK mwDialogProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { PMWDLGDATA pData; LRESULT retV = 0; DLGPROC lpFnDlg = DLG_DLGPROC(hWnd); if (lpFnDlg) retV = lpFnDlg(hWnd, Msg, wParam, lParam); if (!retV) retV = DefDlgProc(hWnd, Msg, wParam, lParam); // Some messages return the value of DLGPROC if (!dlgReturnLValue(Msg)) return retV; if (!retV) { switch (Msg) { case WM_NCDESTROY: pData = DLG_PMWDLGDATA(hWnd); if (pData) { HWND hPar = GetParent(hWnd); dlgDestroyInitFont(hWnd, pData); free(pData); SetWindowLong(hWnd, DWL_DLGDATA, 0); SetWindowLong(hWnd, DWL_DLGPROC, 0); if (hPar) SetActiveWindow(hPar); } else EPRINTF("WARN: mwDialogProc: WM_NCDESTROY without dlgParams\n"); break; case WM_CLOSE: EndDialog (hWnd, 0); return 0; case WM_SETFONT: pData = DLG_PMWDLGDATA(hWnd); if (pData == NULL) return 0; dlgDestroyInitFont(hWnd, pData); pData->hFnt = (HFONT) wParam; if (LOWORD(lParam) != 0) InvalidateRect(hWnd, NULL, TRUE); return TRUE; case WM_GETFONT: pData = DLG_PMWDLGDATA(hWnd); if (pData == NULL) return 0; return (LPARAM) pData->hFnt; case WM_SETFOCUS: dlgSaveCtrlFocus(hWnd, (HWND) wParam); dlgRestoreCtrlFocus(hWnd); return 0; case WM_SHOWWINDOW: if (!wParam) dlgSaveCtrlFocus(hWnd, GetFocus()); break; case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) dlgSaveCtrlFocus(hWnd, GetFocus()); else dlgRestoreCtrlFocus(hWnd); return 0; case WM_NCHITTEST: { POINT curpt; POINTSTOPOINT(curpt, lParam); if (PtInRect(&hWnd->clirect, curpt)) return HTNOWHERE; return DefWindowProc(hWnd, Msg, wParam, lParam); } } return DefWindowProc(hWnd, Msg, wParam, lParam); } return DLG_MSGRESULT(hWnd); }
// // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu. // WM_PAINT - Paint the main window. // WM_DESTROY - post a quit message and return. // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; bool initSuccess = false; switch (message) { case WM_CREATE: // Initialize the RichEdit manager object. g_pFCSampleAppManager = new CFCSampleAppRichEditManager(hWnd, hInst); if (g_pFCSampleAppManager) { // Initializes the Ribbon framework. initSuccess = InitializeFramework(hWnd); } if (!initSuccess) { return -1; } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_DESTROY: // Tears down the Ribbon framework. DestroyFramework(); // Delete the RichEdit manager object. if (g_pFCSampleAppManager) { delete g_pFCSampleAppManager; g_pFCSampleAppManager = NULL; } PostQuitMessage(0); break; case WM_SIZE: // Resize the RichEdit control. g_pFCSampleAppManager->Resize(); break; case WM_NOTIFY: { LPNMHDR phdr = (LPNMHDR) lParam; if (phdr->code == EN_SELCHANGE && phdr->hwndFrom == g_pFCSampleAppManager->GetRichEditWnd()) { // Selection changed in RichEdit control, invalidate the ribbon. return (SUCCEEDED(g_pFramework->InvalidateUICommand(IDC_CMD_FONTCONTROL, UI_INVALIDATIONS_ALLPROPERTIES, 0))); } break; } case WM_CONTEXTMENU: { POINT pt; POINTSTOPOINT(pt, lParam); // Show the context menu at given point. if (ShowMiniToolbar(pt)) { // Handled the message. break; } // Did not handle the message so call the default window procedure. __fallthrough; } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
static LRESULT CALLBACK DialogBoxSubclassProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int i; EnterCriticalSection(&csDlgBoxSubclass); for (i = 0; i<dlgBoxSubclassCount; i++) if (dlgBoxSubclass[i].hwndDlg == hwndDlg) break; if (i == dlgBoxSubclassCount) { LeaveCriticalSection(&csDlgBoxSubclass); return 0; } WNDPROC pfnWndProc = dlgBoxSubclass[i].pfnOldWndProc; DWORD flags = dlgBoxSubclass[i].flags; if (msg == WM_NCDESTROY) { struct DlgBoxSubclassData *buf; MoveMemory(dlgBoxSubclass + i, dlgBoxSubclass + i + 1, sizeof(struct DlgBoxSubclassData)*(dlgBoxSubclassCount - i - 1)); dlgBoxSubclassCount--; buf = (struct DlgBoxSubclassData*)mir_realloc(dlgBoxSubclass, sizeof(struct DlgBoxSubclassData)*dlgBoxSubclassCount); if (buf != NULL) dlgBoxSubclass = buf; else if (!dlgBoxSubclassCount) dlgBoxSubclass = NULL; } LeaveCriticalSection(&csDlgBoxSubclass); switch (msg) { case WM_INITMENUPOPUP: if (flags&DBSDF_MINIMIZABLE || flags&DBSDF_MAXIMIZABLE) { HMENU hMenu = GetSystemMenu(hwndDlg, FALSE); if ((HMENU)wParam != hMenu) break; int isMin = IsIconic(hwndDlg); int isMax = IsZoomed(hwndDlg); EnableMenuItem(hMenu, SC_RESTORE, MF_BYCOMMAND | (isMin || isMax) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_MINIMIZE, MF_BYCOMMAND | (flags&DBSDF_MINIMIZABLE && !isMin) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | (flags&DBSDF_MAXIMIZABLE && !isMax) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | (GetWindowLongPtr(hwndDlg, GWL_STYLE)&WS_THICKFRAME && !isMin && !isMax) ? MF_ENABLED : MF_GRAYED); } break; case WM_MOUSEMOVE: // TrackMouseEvent() would disturb too much if (!settingAutoTipDelay) break; if (cursorPos == lParam) break; cursorPos = lParam; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEWHEEL: if (!settingAutoTipDelay) break; if (msg != WM_MOUSEMOVE && !idMouseMoveTimer) break; if (openedAutoTip && IsWindow(hwndHelpDlg)) DestroyWindow(hwndHelpDlg); openedAutoTip = 0; hwndMouseMoveDlg = hwndDlg; if (hwndHelpDlg == NULL) idMouseMoveTimer = SetTimer(NULL, idMouseMoveTimer, settingAutoTipDelay, NoMouseMoveForDelayTimerProc); break; case WM_CAPTURECHANGED: if ((HWND)lParam == hwndDlg) break; case WM_SHOWWINDOW: case WM_WINDOWPOSCHANGING: case WM_MOVING: case WM_SIZING: case WM_CANCELMODE: case WM_CHILDACTIVATE: case WM_MOUSEACTIVATE: case WM_ACTIVATEAPP: case WM_ACTIVATE: if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; break; case WM_SYSCOMMAND: if ((UINT)wParam == SC_CONTEXTHELP_DIALOG) { // alt. "What's this dialog?" if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; if (hwndHelpDlg == NULL) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) break; } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hwndDlg); return 0; } break; case WM_CONTEXTMENU: { POINT pt; struct FindChildAtPointData fcap; // workaround for badly coded plugins that do display a context menu // and pass the message to DefWindowProc afterwards (doing a "break;"). if (GetTickCount() - GetMessageTime()>10) return 0; if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; ZeroMemory(&fcap, sizeof(fcap)); POINTSTOPOINT(pt, MAKEPOINTS(lParam)); // ChildWindowFromPoint() messes up with group boxes fcap.hwnd = NULL; fcap.pt = pt; EnumChildWindows(hwndDlg, FindChildAtPointEnumProc, (LPARAM)&fcap); HWND hwndCtl = fcap.hwnd; if (hwndCtl == NULL) { ScreenToClient(hwndDlg, &pt); hwndCtl = ChildWindowFromPointEx(hwndDlg, pt, CWP_SKIPINVISIBLE); if (hwndCtl == NULL) break; POINTSTOPOINT(pt, MAKEPOINTS(lParam)); } { LONG_PTR flags = (LONG_PTR)GetProp(hwndCtl, PROP_CONTEXTSTATE); if (flags&PROPF_MENUDISABLED) break; else if (!(flags&PROPF_MENUFORCED)) { int type = GetControlType(hwndCtl); // showing a context menu on these looks silly (multi components) if (type == CTLTYPE_TOOLBAR || type == CTLTYPE_LISTVIEW || type == CTLTYPE_TREEVIEW || type == CTLTYPE_STATUSBAR || type == CTLTYPE_CLC) break; } } if (IsRealChild(hwndDlg, hwndCtl)) { HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, SC_CONTEXTHELP, (hwndCtl == hwndDlg) ? TranslateT("&What's this dialog?") : TranslateT("&What's this?")); if (TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_HORPOSANIMATION | TPM_VERPOSANIMATION | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, pt.x, pt.y, hwndDlg, NULL)) { if (hwndHelpDlg == NULL) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) { DestroyMenu(hMenu); break; } } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hwndCtl); } DestroyMenu(hMenu); } return 0; } case WM_HELP: { HELPINFO *hi = (HELPINFO*)lParam; if (hi->iContextType != HELPINFO_WINDOW) break; // fix for SHBrowseForFolder() dialog, which sends unhandled help to parent if (!IsRealChild(hwndDlg, (HWND)hi->hItemHandle)) break; if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; if (!IsWindow(hwndHelpDlg)) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) break; } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hi->hItemHandle); // we need to eat the next WM_LBUTTONDOWN (if invoked by mouse) if (GetKeyState(GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON) & 0x8000 && hEatNextMouseHook == NULL) hEatNextMouseHook = SetWindowsHookEx(WH_MOUSE, EatNextMouseButtonUpHookProc, NULL, GetCurrentThreadId()); return TRUE; } case WM_NCDESTROY: if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; EnumChildWindows(hwndDlg, RemovePropForAllChildsEnumProc, (LPARAM)PROP_CONTEXTSTATE); { TCHAR text[64]; mir_sntprintf(text, _countof(text), _T("unhooked window 0x%X for context help\n"), hwndDlg); OutputDebugString(text); } SetWindowLongPtr(hwndDlg, GWLP_WNDPROC, (LONG_PTR)pfnWndProc); break; } return CallWindowProc(pfnWndProc, hwndDlg, msg, wParam, lParam); }
// WindowProc handles dispatching of messages and routing back to the base class or to Windows LRESULT cef_dark_aero_window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { bool callDefWindowProc = true; switch (message) { case WM_MEASUREITEM: if (HandleMeasureItem((LPMEASUREITEMSTRUCT)lParam)) return 0L; break; case WM_DRAWITEM: if (HandleDrawItem((LPDRAWITEMSTRUCT)lParam)) return 0L; break; case WM_SETICON: mWindowIcon = 0; { RECT rectIcon; ComputeWindowIconRect(rectIcon); InvalidateRect(&rectIcon); } break; } // First let the DesktopWindowManager handle the message and tell us if // we should pass the message to the default window proc LRESULT lr = DwpCustomFrameProc(message, wParam, lParam, &callDefWindowProc); switch(message) { case WM_SETTINGCHANGE: HandleSettingChange((UINT)wParam, (LPCWSTR)lParam); break; case WM_NCACTIVATE: case WM_ACTIVATE: if (mReady) { UpdateNonClientArea(); } break; case WM_NCMOUSELEAVE: // NOTE: We want anyone else interested in this message // to be notified. Otherwise the default implementation // may be in the wrong state HandleNcMouseLeave(); break; case WM_NCMOUSEMOVE: { POINT pt; POINTSTOPOINT(pt, lParam); if (HandleNcMouseMove((UINT)wParam, &pt)) return 0L; } break; case WM_NCLBUTTONDOWN: { POINT pt; POINTSTOPOINT(pt, lParam); if (HandleNcLeftButtonDown((UINT)wParam, &pt)) return 0L; } break; case WM_NCLBUTTONUP: { POINT pt; POINTSTOPOINT(pt, lParam); if (HandleNcLeftButtonUp((UINT)wParam, &pt)) return 0L; } break; } // call DefWindowProc? if (!callDefWindowProc) { return lr; } lr = cef_window::WindowProc(message, wParam, lParam); if (!mReady) return lr; switch (message) { case WM_GETMINMAXINFO: HandleGetMinMaxInfo((LPMINMAXINFO) lParam); break; case WM_SETTEXT: case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: case WM_MOVE: case WM_SIZE: case WM_SIZING: case WM_EXITSIZEMOVE: UpdateNonClientArea(); if (message == WM_WINDOWPOSCHANGED) { RECT rect; ComputeMenuBarRect(rect); InvalidateRect(&rect, TRUE); } break; case WM_EXITMENULOOP: mMenuActiveIndex = -1; break; case WM_ACTIVATEAPP: mIsActive = (BOOL)wParam; UpdateNonClientArea(); break; } return lr; }
// WindowProc handles dispatching of messages and routing back to the base class or to Windows LRESULT cef_dark_window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_SETTINGCHANGE: // NOTE: We want anyone else interested in this message // to be notified of a setting change even if we handle // the message. Otherwise the default implementation // may be in the wrong state HandleSettingChange((UINT)wParam, (LPCWSTR)lParam); break; case WM_NCMOUSELEAVE: // NOTE: We want anyone else interested in this message // to be notified. Otherwise the default implementation // may be in the wrong state HandleNcMouseLeave(); break; case WM_NCMOUSEMOVE: if (HandleNcMouseMove((UINT)wParam)) return 0L; break; case WM_NCLBUTTONDOWN: if (HandleNcLeftButtonDown((UINT)wParam)) return 0L; break; case WM_NCLBUTTONUP: { POINT pt; POINTSTOPOINT(pt, lParam); if (HandleNcLeftButtonUp((UINT)wParam, &pt)) return 0L; } break; case WM_NCCREATE: if (HandleNcCreate()) return 0L; break; case WM_NCPAINT: if (HandleNcPaint((HRGN)wParam)) return 0L; break; case WM_NCDESTROY: if (HandleNcDestroy()) return 0L; break; case WM_NCHITTEST: { POINT pt; POINTSTOPOINT(pt, lParam); return HandleNcHitTest(&pt); } break; case WM_MEASUREITEM: if (HandleMeasureItem((LPMEASUREITEMSTRUCT)lParam)) return TRUE; break; case WM_DRAWITEM: if (HandleDrawItem((LPDRAWITEMSTRUCT)lParam)) return TRUE; break; case WM_SETICON: mWindowIcon = 0; break; case WM_SETTEXT: case WM_ACTIVATE: case WM_NCACTIVATE: // Turn off redraw because the // DefaultWindowProc will paint over top of // our frame and cause the title bar to flicker if (!IsIconic()){ SetRedraw(FALSE); } break; } LRESULT lr = cef_window::WindowProc(message, wParam, lParam); // post default message processing switch (message) { case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: case WM_MOVE: case WM_SIZE: case WM_SIZING: case WM_EXITSIZEMOVE: UpdateNonClientArea(); break; } // special case -- since we turned off redraw for these // messages to reduce flicker, we need to turn redraw // on now and force updating the non-client area switch (message) { case WM_SETTEXT: case WM_ACTIVATE: case WM_NCACTIVATE: if (!IsIconic()){ SetRedraw(TRUE); UpdateNonClientArea(); if (message != WM_SETTEXT) { DoRepaintClientArea(); } } break; } return lr; }
//OptionsDialog class functions BOOL OptionsDialogType::DialogProcedure(UINT msg, WPARAM wParam, LPARAM lParam) { BOOL Result = FALSE; switch(msg) { case WM_INITDIALOG: InitDialog(); Result = TRUE; break; case WM_DESTROY: DestroyDialog(); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_FILENAME: switch(HIWORD(wParam)) { case EN_KILLFOCUS: FilenameChanged(); break; case EN_CHANGE: if (GetFocus() == (HWND)lParam) SetChanged(); break; } break; case IDC_BROWSE: if (HIWORD(wParam) == BN_CLICKED) { if (BrowseForSmileyPacks(GetSelProto())) { UpdateControls(true); SetChanged(); } } break; case IDC_SMLOPTBUTTON: if (HIWORD(wParam) == BN_CLICKED) ShowSmileyPreview(); break; case IDC_USESTDPACK: if (HIWORD(wParam) == BN_CLICKED) { PopulateSmPackList(); SetChanged(); } break; case IDC_PLUGENABLED: if (HIWORD(wParam) == BN_CLICKED) { BOOL en = IsDlgButtonChecked(m_hwndDialog, IDC_PLUGENABLED) == BST_UNCHECKED; EnableWindow(GetDlgItem(m_hwndDialog, IDC_SMLBUT), en); SetChanged(); } break; case IDC_ADDCATEGORY: if (HIWORD(wParam) == BN_CLICKED) { AddCategory(); } break; case IDC_DELETECATEGORY: if (HIWORD(wParam) == BN_CLICKED) { if (tmpsmcat.DeleteCustomCategory(GetSelProto())) { PopulateSmPackList(); SetChanged(); } } break; case IDC_SPACES: case IDC_SCALETOTEXTHEIGHT: case IDC_APPENDSPACES: case IDC_SMLBUT: case IDC_SCALEALLSMILEYS: case IDC_IEVIEWSTYLE: case IDC_ANIMATESEL: case IDC_ANIMATEDLG: case IDC_INPUTSMILEYS: case IDC_DCURSORSMILEY: case IDC_DISABLECUSTOM: case IDC_HQSCALING: if (HIWORD(wParam) == BN_CLICKED) SetChanged(); break; case IDC_SELCLR: if (HIWORD(wParam) == CPN_COLOURCHANGED) SetChanged(); break; case IDC_MAXCUSTSMSZ: case IDC_MINSMSZ: if (HIWORD(wParam) == EN_CHANGE && GetFocus() == (HWND)lParam) SetChanged(); break; } break; case UM_CHECKSTATECHANGE: UserAction((HTREEITEM)lParam); break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: ApplyChanges(); break; } break; case IDC_CATEGORYLIST: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { TVHITTESTINFO ht = {0}; DWORD dwpos = GetMessagePos(); POINTSTOPOINT(ht.pt, MAKEPOINTS(dwpos)); MapWindowPoints(HWND_DESKTOP, ((LPNMHDR)lParam)->hwndFrom, &ht.pt, 1); TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom, &ht); if (TVHT_ONITEM & ht.flags) FilenameChanged(); if (TVHT_ONITEMSTATEICON & ht.flags) PostMessage(m_hwndDialog, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem); } case TVN_KEYDOWN: if (((LPNMTVKEYDOWN) lParam)->wVKey == VK_SPACE) PostMessage(m_hwndDialog, UM_CHECKSTATECHANGE, 0, (LPARAM)TreeView_GetSelection(((LPNMHDR)lParam)->hwndFrom)); break; case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lParam; if (pnmtv->itemNew.state & TVIS_SELECTED) UpdateControls(); } break; } break; } break; } return Result; }
/* handle a non-client message for a scrollbar*/ void MwHandleNCMessageScrollbar(HWND hwnd, UINT msg, WPARAM hitcode, LPARAM lParam) { int pos = SBS_UNKNOWN; BOOL vertbar = VSCROLLBARVISIBLE(hwnd); BOOL horzbar = HSCROLLBARVISIBLE(hwnd); int * pStat; POINT pt; RECT rc; static BOOL bDraw; static int downPos = SBS_UNKNOWN;// static int sbCode; int newThumbPos; int itemMoveable,itemCount,itemVisible,moveRange;//jmt:2k0819 int moveTop,moveBottom,moveLeft,moveRight;//jmt:2k0819 POINTSTOPOINT(pt, lParam); for (;;) { /* use for() to allow break statement*/ if (hitcode == HTVSCROLL && vertbar) { pStat = &hwnd->vscroll.status; rc = hwnd->vscroll.rc; rc.bottom = rc.top + mwSYSMETRICS_CYVSCROLL; if (PtInRect(&rc, pt)) { pos = SBS_UPARROW; break; } rc.bottom = hwnd->vscroll.rc.bottom; rc.top = rc.bottom - mwSYSMETRICS_CYVSCROLL; if (PtInRect(&rc, pt)) { pos = SBS_DOWNARROW; break; } pos = SBS_VERTTHUMB; } else if (hitcode == HTHSCROLL && horzbar) { pStat = &hwnd->hscroll.status; rc = hwnd->hscroll.rc; rc.right = rc.left + mwSYSMETRICS_CXHSCROLL; if (PtInRect(&rc, pt)) { pos = SBS_LEFTARROW; break; } rc.right = hwnd->hscroll.rc.right; rc.left = rc.right - mwSYSMETRICS_CXHSCROLL; if (PtInRect(&rc, pt)) { pos = SBS_RIGHTARROW; break; } pos = SBS_HORZTHUMB; } else return; break; } if (pos == SBS_UNKNOWN) return; *pStat &= ~SBS_MASK; /* remove stray mouse states*/ if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819 *pStat |= pos; else *pStat &= ~pos; if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819 bDraw=TRUE; if (bDraw) MwPaintNCScrollbars(hwnd, NULL); if (pos == SBS_UPARROW || pos == SBS_LEFTARROW)//jmt:2k0820 { if (hwnd->vscroll.curPos != hwnd->vscroll.minPos) sbCode = SB_LINEUP; } else if (pos == SBS_DOWNARROW || pos == SBS_RIGHTARROW)//jmt:2k0820 { if (hwnd->vscroll.curPos != hwnd->vscroll.maxPos) sbCode = SB_LINEDOWN; } else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB)// { sbCode = SB_THUMBTRACK;// } switch(msg) { case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDBLCLK://jmt:2k0819 downPos = pos; #if MWCLIENT InvalidateRect(hwnd,NULL,TRUE); #endif break; case WM_NCMOUSEMOVE://jmt:2k0819 if (hitcode == HTVSCROLL && vertbar) { if (sbCode == SB_THUMBTRACK && downPos == SBS_VERTTHUMB)// { //jmt(2k0819): new algorithm for SB_THUMBTRACK rc = hwnd->vscroll.rc; moveTop = rc.top + mwSYSMETRICS_CYVSCROLL; moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL; moveRange = moveBottom - moveTop; itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1; itemVisible = hwnd->vscroll.pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveTop,itemMoveable,moveRange,newThumbPos); //# if ( newThumbPos >= hwnd->vscroll.minPos && newThumbPos <= hwnd->vscroll.maxPos) SendMessage (hwnd, WM_VSCROLL, SB_THUMBTRACK, newThumbPos); break; } } if (hitcode == HTHSCROLL && horzbar) { if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB)// { //jmt(2k0819): new algorithm for SB_THUMBTRACK rc = hwnd->hscroll.rc; moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL; moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL; moveRange = moveRight - moveLeft; itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1; itemVisible = hwnd->hscroll.pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveLeft,itemMoveable,moveRange,newThumbPos); //# if ( newThumbPos >= hwnd->hscroll.minPos && newThumbPos <= hwnd->hscroll.maxPos) SendMessage (hwnd, WM_HSCROLL, SB_THUMBTRACK, newThumbPos); break; } } break; case WM_NCLBUTTONUP://jmt:2k0819 bDraw=FALSE; downPos = SBS_UNKNOWN;// if (sbCode==SB_THUMBTRACK) { if (hitcode == HTVSCROLL && vertbar) { //jmt(2k0819): new algorithm for SB_THUMBTRACK rc = hwnd->vscroll.rc; moveTop = rc.top + mwSYSMETRICS_CYVSCROLL; moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL; moveRange = moveBottom - moveTop; itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1; itemVisible = hwnd->vscroll.pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveTop,itemMoveable,moveRange,newThumbPos); //# if ( newThumbPos >= hwnd->vscroll.minPos && newThumbPos <= hwnd->vscroll.maxPos) SendMessage (hwnd, WM_VSCROLL, SB_THUMBTRACK, newThumbPos); break; } if (hitcode == HTHSCROLL && horzbar) { //jmt(2k0819): new algorithm for SB_THUMBTRACK rc = hwnd->hscroll.rc; moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL; moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL; moveRange = moveRight - moveLeft; itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1; itemVisible = hwnd->hscroll.pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveLeft,itemMoveable,moveRange,newThumbPos); //# if ( newThumbPos >= hwnd->hscroll.minPos && newThumbPos <= hwnd->hscroll.maxPos) SendMessage (hwnd, WM_HSCROLL, SB_THUMBTRACK, newThumbPos); break; } } else//jmt:2k0820 { if (hitcode == HTVSCROLL && vertbar) SendMessage (hwnd, WM_VSCROLL, sbCode, 0); if (hitcode == HTHSCROLL && horzbar) SendMessage (hwnd, WM_HSCROLL, sbCode, 0); } break; } }
INT_PTR CALLBACK DlgProcNudgeOpt(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { static bool iInitDone = true; switch(msg) { case WM_INITDIALOG: iInitDone = false; TranslateDialogDefault(hwnd); CreateImageList(hwnd); PopulateProtocolList(hwnd); UpdateControls(hwnd); iInitDone = true; break; case WM_DESTROY: { HIMAGELIST hImList = TreeView_GetImageList(GetDlgItem(hwnd, IDC_PROTOLIST), TVSIL_NORMAL); if (hImList) { TreeView_SetImageList(GetDlgItem(hwnd, IDC_PROTOLIST), NULL, TVSIL_NORMAL); // Avoiding Access Violation in CommonControls DLL ImageList_Destroy(hImList); } break; } case WM_COMMAND: { WORD wNotifyCode = HIWORD(wParam); switch(LOWORD(wParam)) { case IDC_PREVIEW: Preview(); break; case IDC_USEBYPROTOCOL: GlobalNudge.useByProtocol = (IsDlgButtonChecked(hwnd,IDC_USEBYPROTOCOL)==BST_CHECKED); PopulateProtocolList(hwnd); UpdateControls(hwnd); SendMessage(GetParent(hwnd),PSM_CHANGED,0,0); break; case IDC_AUTORESEND: if (ActualNudge)// fix NULL pointer then no nudge support protocols { ActualNudge->autoResend = (IsDlgButtonChecked(hwnd,IDC_AUTORESEND)==BST_CHECKED); EnableWindow(GetDlgItem(hwnd,IDC_RESENDDELAY),ActualNudge->autoResend); } SendMessage(GetParent(hwnd),PSM_CHANGED,0,0); break; case IDC_CHECKST0: case IDC_CHECKST1: case IDC_CHECKST2: case IDC_CHECKST3: case IDC_CHECKST4: case IDC_CHECKST5: case IDC_CHECKST6: case IDC_CHECKST7: case IDC_CHECKST8: case IDC_CHECKST9: case IDC_CHECKPOP: case IDC_OPENMESSAGE: case IDC_CHECKCLIST: case IDC_CHECKCHAT: case IDC_CHECKSTATUS: case IDC_IGNORE: case IDC_OPENCONTACTLIST: SendMessage(GetParent(hwnd),PSM_CHANGED,0,0); break; case IDC_RESENDDELAY: case IDC_SENDTEXT: case IDC_RECVTEXT: case IDC_SENDTIME: case IDC_RECVTIME: if(iInitDone && (wNotifyCode == EN_CHANGE)) SendMessage(GetParent(hwnd),PSM_CHANGED,0,0); break; } break; } case WM_SHOWWINDOW: break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch(((LPNMHDR)lParam)->code) { case PSN_APPLY: { BOOL Translated; GlobalNudge.sendTimeSec = GetDlgItemInt(hwnd,IDC_SENDTIME,&Translated,FALSE); GlobalNudge.recvTimeSec = GetDlgItemInt(hwnd,IDC_RECVTIME,&Translated,FALSE); GlobalNudge.resendDelaySec = GetDlgItemInt(hwnd,IDC_RESENDDELAY,&Translated,FALSE); if(GlobalNudge.resendDelaySec > 10 ) GlobalNudge.resendDelaySec = 10; if(GlobalNudge.resendDelaySec < 1 ) GlobalNudge.resendDelaySec = 1; if (ActualNudge)// fix NULL pointer then no nudge support protocols { ActualNudge->shakeClist = (IsDlgButtonChecked(hwnd,IDC_CHECKCLIST)==BST_CHECKED); ActualNudge->shakeChat = (IsDlgButtonChecked(hwnd,IDC_CHECKCHAT)==BST_CHECKED); ActualNudge->openMessageWindow = (IsDlgButtonChecked(hwnd,IDC_OPENMESSAGE)==BST_CHECKED); ActualNudge->openContactList = (IsDlgButtonChecked(hwnd,IDC_OPENCONTACTLIST)==BST_CHECKED); ActualNudge->useIgnoreSettings = (IsDlgButtonChecked(hwnd,IDC_IGNORE)==BST_CHECKED); ActualNudge->showStatus = (IsDlgButtonChecked(hwnd,IDC_CHECKSTATUS)==BST_CHECKED); ActualNudge->showPopup = (IsDlgButtonChecked(hwnd,IDC_CHECKPOP)==BST_CHECKED); ActualNudge->statusFlags = ((IsDlgButtonChecked(hwnd,IDC_CHECKST0)==BST_CHECKED) ? NUDGE_ACC_ST0 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST1)==BST_CHECKED) ? NUDGE_ACC_ST1 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST2)==BST_CHECKED) ? NUDGE_ACC_ST2 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST3)==BST_CHECKED) ? NUDGE_ACC_ST3 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST4)==BST_CHECKED) ? NUDGE_ACC_ST4 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST5)==BST_CHECKED) ? NUDGE_ACC_ST5 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST6)==BST_CHECKED) ? NUDGE_ACC_ST6 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST7)==BST_CHECKED) ? NUDGE_ACC_ST7 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST8)==BST_CHECKED) ? NUDGE_ACC_ST8 : 0) | ((IsDlgButtonChecked(hwnd,IDC_CHECKST9)==BST_CHECKED) ? NUDGE_ACC_ST9 : 0) ; GetDlgItemText(hwnd,IDC_SENDTEXT,ActualNudge->senText,TEXT_LEN); GetDlgItemText(hwnd,IDC_RECVTEXT,ActualNudge->recText,TEXT_LEN); ActualNudge->Save(); } GlobalNudge.Save(); } } case IDC_PROTOLIST: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { TVHITTESTINFO ht = {0}; DWORD dwpos = GetMessagePos(); POINTSTOPOINT(ht.pt, MAKEPOINTS(dwpos)); MapWindowPoints(HWND_DESKTOP, ((LPNMHDR)lParam)->hwndFrom, &ht.pt, 1); TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom, &ht); /*if (TVHT_ONITEM & ht.flags) CheckChange(hwnd,ht.hItem);*/ if (TVHT_ONITEMSTATEICON & ht.flags) CheckChange(hwnd,ht.hItem); } case TVN_KEYDOWN: if (((LPNMTVKEYDOWN) lParam)->wVKey == VK_SPACE) CheckChange(hwnd, TreeView_GetSelection(((LPNMHDR)lParam)->hwndFrom)); break; case TVN_SELCHANGED: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lParam; if (pnmtv->itemNew.state & TVIS_SELECTED) UpdateControls(hwnd); } break; } break; } break; } return FALSE; }
/* * This procedure implements the messages passed by the window * manager for default processing on behalf of the window. */ LRESULT WINAPI DefWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; RECT rc; DWORD dwStyle; HBRUSH hbr; HPEN hpen, holdpen; PAINTSTRUCT ps; POINT curpt; int x, y; HWND wp; HWND oldActive; COLORREF crCaption; LPNCCALCSIZE_PARAMS lpnc; CHAR szTitle[64]; static POINT startpt; switch(msg) { case WM_NCCALCSIZE: /* calculate client rect from passed window rect in rgrc[0]*/ lpnc = (LPNCCALCSIZE_PARAMS)lParam; dwStyle = GetWindowLong(hwnd, GWL_STYLE); if(dwStyle & WS_BORDER) { if((dwStyle & WS_CAPTION) == WS_CAPTION) { InflateRect(&lpnc->rgrc[0], -mwSYSMETRICS_CXFRAME, -mwSYSMETRICS_CYFRAME); lpnc->rgrc[0].top += mwSYSMETRICS_CYCAPTION + 1; } else InflateRect(&lpnc->rgrc[0], -1, -1); } break; case WM_NCPAINT: /* repaint all non-client area*/ dwStyle = GetWindowLong(hwnd, GWL_STYLE); if(dwStyle & WS_BORDER) { hdc = GetWindowDC(hwnd); GetWindowRect(hwnd, &rc); if((dwStyle & WS_CAPTION) == WS_CAPTION) { /* draw 2-line 3d border around window*/ Draw3dOutset(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); InflateRect(&rc, -2, -2); /* draw 1-line inset inside border*/ hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE)); holdpen = SelectObject(hdc, hpen); SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom); InflateRect(&rc, -1, -1); /* fill caption*/ rc.bottom = rc.top + mwSYSMETRICS_CYCAPTION; crCaption = GetActiveWindow()==hwnd? GetSysColor(COLOR_ACTIVECAPTION): GetSysColor(COLOR_INACTIVECAPTION); hbr = CreateSolidBrush(crCaption); FillRect(hdc, &rc, hbr); DeleteObject(hbr); /* draw 1 line under caption*/ MoveToEx(hdc, rc.left, rc.bottom, NULL); LineTo(hdc, rc.right, rc.bottom); DeleteObject(SelectObject(hdc, holdpen)); /* draw caption text*/ if(GetWindowText(hwnd, szTitle, sizeof(szTitle))) { SetBkMode(hdc, TRANSPARENT); /* set background color even though * transparent in case GdArea is used * to draw text which compares * gr_foreground != gr_background * when transparent... */ SetBkColor(hdc, crCaption); SetTextColor(hdc, GetActiveWindow()==hwnd? GetSysColor(COLOR_CAPTIONTEXT): GetSysColor(COLOR_INACTIVECAPTIONTEXT)); SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); GetWindowRect(hwnd, &rc); TextOut(hdc, rc.left+4, rc.top+2, szTitle, strlen(szTitle)); } /* draw close box*/ GetCloseBoxRect(hwnd, &rc); /*DrawDIB(hdc, rc.right-XSIZE_CLOSEBOX-3, rc.top+3, &image_close4);*/ Draw3dBox(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, GetSysColor(COLOR_BTNHIGHLIGHT), GetSysColor(COLOR_WINDOWFRAME)); InflateRect(&rc, -1, -1); hbr = CreateSolidBrush( GetSysColor(COLOR_BTNFACE)); FillRect(hdc, &rc, hbr); DeleteObject(hbr); InflateRect(&rc, -1, -1); MoveToEx(hdc, rc.left, rc.top, NULL); LineTo(hdc, rc.right-1, rc.bottom-1); MoveToEx(hdc, rc.left, rc.bottom-1, NULL); LineTo(hdc, rc.right-1, rc.top); } else { SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom); } ReleaseDC(hwnd, hdc); } break; case WM_NCHITTEST: /* if system is dragging a window, always return caption*/ if(dragwp) return HTCAPTION; /* Determine what part of the window the mouse is over*/ POINTSTOPOINT(curpt, lParam); if(PtInRect(&hwnd->clirect, curpt)) return HTCLIENT; if(PtInRect(&hwnd->vscroll.rc, curpt)) return HTVSCROLL; if(PtInRect(&hwnd->hscroll.rc, curpt)) return HTHSCROLL; dwStyle = GetWindowLong(hwnd, GWL_STYLE); if((dwStyle & WS_CAPTION) == WS_CAPTION) { GetCloseBoxRect(hwnd, &rc); if(PtInRect(&rc, curpt)) return HTCLOSE; GetWindowRect(hwnd, &rc); InflateRect(&rc, -2, -2); rc.bottom = rc.top + mwSYSMETRICS_CYCAPTION; if(PtInRect(&rc, curpt)) return HTCAPTION; GetWindowRect(hwnd, &rc); InflateRect(&rc, -2, -2); rc.top += mwSYSMETRICS_CYCAPTION; if(PtInRect(&rc, curpt)) return HTCLIENT; return HTBORDER; } return HTNOWHERE; case WM_NCLBUTTONDOWN: /* Handle default actions for mouse down on window*/ if(wParam == HTCLOSE) { SendMessage(hwnd, WM_CLOSE, 0, 0L); break; } /* set focus on mouse down, repaint if necessary*/ oldActive = GetActiveWindow(); if(wParam == HTCLIENT || wParam == HTVSCROLL || wParam == HTHSCROLL) /* activate and raise window if in client area*/ /* kaffe port requires this commented out*/ SetForegroundWindow(hwnd); else { /* otherwise just change focus window, same z order*/ /* this will activate it's top level parent*/ SetFocus(hwnd); } /* repaint captions now because of activation change*/ UpdateWindow(oldActive); UpdateWindow(hwnd); if(wParam == HTVSCROLL || wParam == HTHSCROLL) { MwHandleNCMessageScrollbar(hwnd, msg, wParam, lParam); break; } /* start window drag if in caption area*/ if(wParam == HTCAPTION && hwnd != rootwp) { POINTSTOPOINT(startpt, lParam); if(!(GetWindowLong(hwnd, GWL_STYLE) & WS_MAXIMIZE)) dragwp = hwnd; SetRectEmpty(&lastrc); /* XORMOVE only*/ } break; case WM_NCMOUSEMOVE: if(wParam == HTVSCROLL || wParam == HTHSCROLL) { MwHandleNCMessageScrollbar(hwnd, msg, wParam, lParam); break; } /* drag window with mousemove after mousedown*/ if(dragwp == hwnd) { POINTSTOPOINT(curpt, lParam); x = curpt.x - startpt.x; y = curpt.y - startpt.y; if(mwERASEMOVE) { GetWindowRect(hwnd, &rc); MoveWindow(hwnd, rc.left+x, rc.top+y, rc.right-rc.left, rc.bottom-rc.top, TRUE); startpt = curpt; } else DrawXORFrame(hwnd, x, y, TRUE); } break; case WM_NCLBUTTONUP: /* stop window drag*/ if(dragwp == hwnd) { dragwp = NULL; if(mwERASEMOVE) { /* * User stopped moving window, repaint * windows previously queued for painting. */ for(wp=listwp; wp; wp=wp->next) if(wp->gotPaintMsg == PAINT_DELAYPAINT) wp->gotPaintMsg = PAINT_NEEDSPAINT; } else { POINTSTOPOINT(curpt, lParam); x = curpt.x - startpt.x; y = curpt.y - startpt.y; DrawXORFrame(hwnd, x, y, FALSE); GetWindowRect(hwnd, &rc); MoveWindow(hwnd, rc.left+x, rc.top+y, rc.right-rc.left, rc.bottom-rc.top, TRUE); } } if(wParam == HTVSCROLL || wParam == HTHSCROLL) { MwHandleNCMessageScrollbar(hwnd, msg, wParam, lParam); break; } break; case WM_NCLBUTTONDBLCLK: if(wParam == HTVSCROLL || wParam == HTHSCROLL) { MwHandleNCMessageScrollbar(hwnd, msg, wParam, lParam); break; } /* maximize/restore processing*/ if(wParam != HTCAPTION) break; if((hwnd->style & WS_CAPTION) == WS_CAPTION) { if(hwnd->style & WS_MAXIMIZE) { rc = hwnd->restorerc; MoveWindow(hwnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); hwnd->style &= ~WS_MAXIMIZE; } else { hwnd->restorerc = hwnd->winrect; GetWindowRect(rootwp, &rc); MoveWindow(hwnd, -mwSYSMETRICS_CXFRAME, -mwSYSMETRICS_CYFRAME, rc.right+2*mwSYSMETRICS_CXFRAME, rc.bottom+2*mwSYSMETRICS_CYFRAME, TRUE); hwnd->style |= WS_MAXIMIZE; } } break; case WM_GETTEXTLENGTH: /* Get window text length. This routine requires * knowledge of the internal window structure */ return strlen(hwnd->szTitle); case WM_GETTEXT: /* Get window text. This routine requires * knowledge of the internal window structure */ return strzcpy((LPSTR)lParam, hwnd->szTitle, wParam); case WM_SETTEXT: /* Set window text. This routine requires * knowledge of the internal window structure. * Note that setting text doesn't invalidate the window. */ strzcpy(hwnd->szTitle, (LPSTR)lParam, sizeof(hwnd->szTitle)); return TRUE; case WM_CLOSE: DestroyWindow(hwnd); if(hwnd == rootwp) PostQuitMessage(0); break; case WM_ERASEBKGND: /* erase background with class background brush*/ hbr = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND); if(!hbr) return 0; /* don't exclude update region*/ hdc = GetDCEx(hwnd, NULL, DCX_DEFAULTCLIP); FillRect(hdc, NULL, hbr); ReleaseDC(hwnd, hdc); return 1; case WM_PAINT: /* required to send erasebkgnd for desktop window*/ hdc = BeginPaint(hwnd, &ps); /* draw desktop wallpaper*/ if(hwnd == rootwp && pImageWallpaper) { GetWindowRect(hwnd, &rc); DrawDIB(hdc, (rc.right-rc.left-pImageWallpaper->width)/2, (rc.bottom-rc.top-pImageWallpaper->height)/2, pImageWallpaper); } EndPaint(hwnd, &ps); break; } return 0; }
static INT_PTR CALLBACK LangOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndList = GetDlgItem(hwndDlg, IDC_LANGLIST); LVITEM lvi; switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); hwndLangOpt = hwndDlg; ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT|LVS_EX_LABELTIP); ListView_SetImageList(hwndList, CreateRadioImages(ListView_GetBkColor(hwndList), ListView_GetTextColor(hwndList)), LVSIL_STATE); /* auto-destroyed */ { LVCOLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = TranslateT("Installed Languages"); ListView_InsertColumn(hwndList, 0, &lvc); } if ( ServiceExists(MS_FLAGS_LOADFLAGICON)) ListView_SetImageList(hwndList, ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 8, 8), LVSIL_SMALL); TCHAR szPath[MAX_PATH]; GetPackPath(szPath, SIZEOF(szPath), FALSE, _T("")); SetDlgItemText(hwndDlg, IDC_SKINROOTFOLDER, szPath); SendMessage(hwndDlg, M_RELOADLIST, 0, 0); SendMessage(hwndDlg, M_SHOWFILECOL, 0, 1); return TRUE; case M_RELOADLIST: /* init list */ ListView_DeleteAllItems(hwndList); ListView_DeleteColumn(hwndList, 1); /* if present */ { HIMAGELIST himl = ListView_GetImageList(hwndList, LVSIL_SMALL); ImageList_RemoveAll(himl); /* enum all packs */ EnumPacks(InsertPackItemEnumProc, _T("langpack_*.txt"), "Miranda Language Pack Version 1", (WPARAM)hwndList, (LPARAM)himl); /* make it use current langpack locale for sort */ ListView_SortItems(hwndList, CompareListItem, CallService(MS_LANGPACK_GETLOCALE, 0, 0)); //CheckDlgButton(hwndDlg, IDC_ENABLEAUTOUPDATES, db_get_b(NULL, "LangMan", "EnableAutoUpdates", SETTING_ENABLEAUTOUPDATES_DEFAULT) != 0); /* show selection */ int iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED); if (iItem != -1) ListView_EnsureVisible(hwndList, iItem, FALSE); } return TRUE; case M_SHOWFILECOL: if ((BOOL)lParam && ListView_GetItemCount(hwndList) > 1) { /* add column */ LVCOLUMN lvc; ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE_USEHEADER); lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; lvc.pszText = TranslateT("File"); lvc.cx = 160; ListView_InsertColumn(hwndList, lvc.iSubItem = 1, &lvc); ListView_SetColumnWidth(hwndList, 0, ListView_GetColumnWidth(hwndList, 0) - lvc.cx); /* add text */ lvi.mask = LVIF_PARAM; lvi.iSubItem = 0; for (lvi.iItem = 0; ListView_GetItem(hwndList, &lvi); ++lvi.iItem) { LANGPACK_INFO *pack = (LANGPACK_INFO*)lvi.lParam; ListView_SetItemText(hwndList, lvi.iItem, 1, (pack->flags&LPF_DEFAULT) ? TranslateT("built-in") : pack->szFileName); } } else { ListView_DeleteColumn(hwndList, 1); ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE_USEHEADER); } return TRUE; case WM_DESTROY: ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_LANGLIST)); return TRUE; case WM_THEMECHANGED: case WM_SETTINGCHANGE: { HIMAGELIST himl = ListView_SetImageList(hwndList, CreateRadioImages(ListView_GetBkColor(hwndList), ListView_GetTextColor(hwndList)), LVSIL_STATE); /* auto-destroyed */ if (himl != NULL) ImageList_Destroy(himl); } break; case WM_CTLCOLORLISTBOX: /* mimic readonly edit */ return (BOOL)SendMessage(hwndDlg, WM_CTLCOLORSTATIC, wParam, lParam); case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_LANGEMAIL: { char buf[512]; lstrcpyA(buf, "mailto:"); if (GetWindowTextA(GetDlgItem(hwndDlg, LOWORD(wParam)), &buf[7], sizeof(buf)-7)) CallService(MS_UTILS_OPENURL, FALSE, (LPARAM)buf); return TRUE; } case IDC_MORELANG: CallService(MS_UTILS_OPENURL, TRUE, (LPARAM)"http://miranda-ng.org/"); return TRUE; } break; case WM_CONTEXTMENU: if (GetDlgCtrlID((HWND)wParam) == IDC_LANGLIST) { /* get item */ LVHITTESTINFO hti; POINTSTOPOINT(hti.pt, MAKEPOINTS(lParam)); if (hti.pt.x == -1 && hti.pt.y == -1) { /* keyboard invoked */ hti.iItem = ListView_GetNextItem((HWND)wParam, -1, LVNI_SELECTED); if (hti.iItem != -1) break; RECT rc; if (!ListView_GetItemRect((HWND)wParam, hti.iItem, &rc, LVIR_SELECTBOUNDS)) break; hti.pt.x = rc.left + (rc.right - rc.left) / 2; hti.pt.y = rc.top + (rc.bottom - rc.top) / 2; ClientToScreen((HWND)wParam, &hti.pt); } else { ScreenToClient((HWND)wParam, &hti.pt); if (ListView_HitTest((HWND)wParam, &hti) == -1 || !(hti.flags&LVHT_ONITEM)) break; POINTSTOPOINT(hti.pt, MAKEPOINTS(lParam)); } /* param */ lvi.iItem = hti.iItem; lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; if (!ListView_GetItem((HWND)wParam, &lvi)) break; /* context menu */ LANGPACK_INFO *pack = (LANGPACK_INFO*)lvi.lParam; if (!(pack->flags & LPF_DEFAULT)) { HMENU hContextMenu = CreatePopupMenu(); if (hContextMenu != NULL) { AppendMenu(hContextMenu, MF_STRING, 2, TranslateT("&Remove...")); if (TrackPopupMenuEx(hContextMenu, TPM_RETURNCMD | TPM_NONOTIFY | TPM_TOPALIGN | TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_HORPOSANIMATION | TPM_VERPOSANIMATION, hti.pt.x, hti.pt.y, (HWND)wParam, NULL)) DeletePackFile(hwndDlg, (HWND)wParam, hti.iItem, pack); DestroyMenu(hContextMenu); } } return TRUE; } break; case WM_NOTIFYFORMAT: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, NFR_UNICODE); return TRUE; case WM_NOTIFY: NMHDR *nmhdr = (NMHDR*)lParam; switch (nmhdr->idFrom) { case IDC_LANGLIST: switch (nmhdr->code) { case LVN_DELETEITEM: lvi.iItem = ((NMLISTVIEW*)lParam)->iItem; /* nmlv->lParam is invalid */ lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; if (ListView_GetItem(nmhdr->hwndFrom, &lvi)) mir_free((LANGPACK_INFO*)lvi.lParam); break; case LVN_ITEMCHANGED: { NMLISTVIEW *nmlv = (NMLISTVIEW*)lParam; if (!(nmlv->uChanged&LVIF_STATE)) break; /* display info and check radio item */ if (nmlv->uNewState&LVIS_SELECTED && !(nmlv->uOldState&LVIS_SELECTED)) { ListView_SetItemState(nmhdr->hwndFrom, nmlv->iItem, INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK); DisplayPackInfo(hwndDlg, (LANGPACK_INFO*)nmlv->lParam); } /* disable all other radio items */ else if (nmlv->uNewState&INDEXTOSTATEIMAGEMASK(2)) { for (int iItem = ListView_GetItemCount(nmhdr->hwndFrom) - 1; iItem != -1; --iItem) if (iItem != nmlv->iItem) ListView_SetItemState(nmhdr->hwndFrom, iItem, INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK); /* enable apply */ if (nmlv->uOldState) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); ShowWindow(GetDlgItem(hwndDlg, IDC_RESTART), SW_SHOW); } } } break; case LVN_KEYDOWN: { int iItem = ListView_GetNextItem(nmhdr->hwndFrom, -1, LVNI_SELECTED); switch (((NMLVKEYDOWN*)lParam)->wVKey) { case VK_SPACE: ListView_SetItemState(nmhdr->hwndFrom, iItem, INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK); break; case VK_DELETE: lvi.iItem = iItem; lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; if (ListView_GetItem(nmhdr->hwndFrom, &lvi)) { LANGPACK_INFO *pack = (LANGPACK_INFO*)lvi.lParam; if (!(pack->flags&LPF_DEFAULT)) DeletePackFile(hwndDlg, nmhdr->hwndFrom, iItem, pack); } break; } } break; case NM_CLICK: LVHITTESTINFO hti; lParam = GetMessagePos(); POINTSTOPOINT(hti.pt, MAKEPOINTS(lParam)); ScreenToClient(nmhdr->hwndFrom, &hti.pt); if (ListView_HitTest(nmhdr->hwndFrom, &hti) != -1) if (hti.flags&(LVHT_ONITEMSTATEICON | LVHT_ONITEMICON)) /* one of them */ ListView_SetItemState(nmhdr->hwndFrom, hti.iItem, LVIS_SELECTED, LVIS_SELECTED); } break; case 0: switch (nmhdr->code) { case PSN_APPLY: lvi.mask = LVIF_STATE | LVIF_PARAM; lvi.stateMask = LVIS_STATEIMAGEMASK; lvi.iSubItem = 0; for (lvi.iItem = 0; ListView_GetItem(hwndList, &lvi); ++lvi.iItem) { LANGPACK_INFO *pack = (LANGPACK_INFO*)lvi.lParam; if (lvi.state&INDEXTOSTATEIMAGEMASK(2) && !(pack->flags & LPF_ENABLED)) { if(!(pack->flags & LPF_DEFAULT)) db_set_ws(NULL, "LangMan", "Langpack", pack->szFileName); else db_unset(NULL, "LangMan", "Langpack"); TCHAR szPath[MAX_PATH]; GetPackPath(szPath, SIZEOF(szPath), FALSE, pack->szFileName); CallService(MS_LANGPACK_RELOAD, 0, (LPARAM)szPath); pack->flags |= LPF_ENABLED; CloseWindow(GetParent(hwndDlg)); DestroyWindow(GetParent(hwndDlg)); } else pack->flags &= ~LPF_ENABLED; } return TRUE; } } break; } return FALSE; }
static LRESULT CALLBACK HyperlinkWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { struct HyperlinkWndData *dat=(struct HyperlinkWndData*)GetWindowLongPtr(hwnd,0); switch(msg) { case WM_NCCREATE: dat=(struct HyperlinkWndData*)mir_calloc(sizeof(struct HyperlinkWndData)); if(dat==NULL) return FALSE; /* fail creation */ SetWindowLongPtr(hwnd,0,(LONG_PTR)dat); /* always succeeds */ /* fall thru */ case WM_SYSCOLORCHANGE: if(!(dat->flags&HLKF_HASENABLECOLOR)) { if(GetSysColorBrush(COLOR_HOTLIGHT)==NULL) dat->enableColor=RGB(0,0,255); else dat->enableColor=GetSysColor(COLOR_HOTLIGHT); dat->focusColor = RGB(GetRValue(dat->enableColor) / 2, GetGValue(dat->enableColor) / 2, GetBValue(dat->enableColor) / 2); } if(!(dat->flags&HLKF_HASDISABLECOLOR)) dat->disableColor=GetSysColor(COLOR_GRAYTEXT); break; case WM_SETFOCUS: case WM_KILLFOCUS: RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); break; case WM_MOUSEACTIVATE: SetFocus(hwnd); return MA_ACTIVATE; case WM_GETDLGCODE: { if (lParam) { MSG *msg = (MSG *) lParam; if (msg->message == WM_KEYDOWN) { if (msg->wParam == VK_TAB) return 0; if (msg->wParam == VK_ESCAPE) return 0; } else if (msg->message == WM_CHAR) { if (msg->wParam == '\t') return 0; if (msg->wParam == 27) return 0; } } return DLGC_WANTMESSAGE; } case WM_KEYDOWN: { switch (wParam) { case VK_SPACE: case VK_RETURN: SendMessage(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(hwnd),STN_CLICKED),(LPARAM)hwnd); break; } return 0; } case WM_LBUTTONDOWN: { POINT pt; POINTSTOPOINT(pt,MAKEPOINTS(lParam)); if(!PtInRect(&dat->rcText,pt)) break; SendMessage(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(hwnd),STN_CLICKED),(LPARAM)hwnd); return 0; } case WM_SETFONT: { LOGFONT lf; HFONT hFont; if((HFONT)wParam==NULL) { /* use default system color */ dat->hEnableFont=dat->hDisableFont=NULL; return 0; } if(GetObject((HFONT)wParam,sizeof(lf),&lf)) { lf.lfUnderline=1; hFont=CreateFontIndirect(&lf); if(hFont!=NULL) { dat->hEnableFont=hFont; dat->hDisableFont=(HFONT)wParam; if(LOWORD(lParam)) SendMessage(hwnd,HLK_INVALIDATE,0,0); SendMessage(hwnd,HLK_MEASURETEXT,0,0); } } return 0; } case WM_ERASEBKGND: return TRUE; case WM_ENABLE: case HLK_INVALIDATE: { RECT rcWnd; POINT pt; HWND hwndParent; if(!GetWindowRect(hwnd,&rcWnd)) break; pt.x=rcWnd.left; pt.y=rcWnd.top; hwndParent=GetParent(hwnd); if(hwndParent==NULL) hwndParent=hwnd; if(!ScreenToClient(hwndParent,&pt)) break; rcWnd.right=pt.x+(rcWnd.right-rcWnd.left); rcWnd.bottom=pt.y+(rcWnd.bottom-rcWnd.top); rcWnd.left=pt.x; rcWnd.top=pt.y; InvalidateRect(hwndParent,&rcWnd,TRUE); return 0; } case WM_GETFONT: return (LRESULT)dat->hDisableFont; case WM_CREATE: case HLK_MEASURETEXT: { TCHAR szText[256]; if(!GetWindowText(hwnd,szText,SIZEOF(szText))) return 0; lParam=(LPARAM)szText; /* fall thru */ case WM_SETTEXT: { HFONT hPrevFont = NULL; SIZE textSize; RECT rc; HDC hdc; LONG style; BOOL fMeasured=FALSE; hdc=GetDC(hwnd); if(hdc==NULL) return 0; /* text change failed */ if(dat->hEnableFont!=NULL) hPrevFont=(HFONT)SelectObject(hdc,dat->hEnableFont); if(dat->hEnableFont==NULL || hPrevFont!=NULL) /* select failed? */ if(GetTextExtentPoint32(hdc,(TCHAR*)lParam,lstrlen((TCHAR*)lParam),&textSize)) if(GetClientRect(hwnd,&rc)) { dat->rcText.top=0; dat->rcText.bottom=dat->rcText.top+textSize.cy; style=GetWindowLongPtr(hwnd,GWL_STYLE); if(style&SS_CENTER) dat->rcText.left=(rc.right-textSize.cx)/2; else if(style&SS_RIGHT) dat->rcText.left=rc.right-textSize.cx; else dat->rcText.left=0; dat->rcText.right=dat->rcText.left+textSize.cx; fMeasured=TRUE; } if(dat->hEnableFont!=NULL && hPrevFont!=NULL) SelectObject(hdc,hPrevFont); ReleaseDC(hwnd,hdc); if(!fMeasured) return 0; /* text change failed */ SendMessage(hwnd,HLK_INVALIDATE,0,0); break; }} case WM_SETCURSOR: { POINT pt; HCURSOR hCursor; if(!GetCursorPos(&pt)) return FALSE; if(!ScreenToClient(hwnd,&pt)) return FALSE; if(PtInRect(&dat->rcText,pt)) { hCursor=(HCURSOR)GetClassLongPtr(hwnd,GCLP_HCURSOR); if(hCursor==NULL) hCursor=LoadCursor(NULL,IDC_HAND); /* Win2000+ */ } else hCursor=LoadCursor(NULL,IDC_ARROW); SetCursor(hCursor); return TRUE; } case HLK_SETENABLECOLOUR: { COLORREF prevColor=dat->enableColor; dat->enableColor=(COLORREF)wParam; dat->focusColor = RGB(GetRValue(dat->enableColor) / 2, GetGValue(dat->enableColor) / 2, GetBValue(dat->enableColor) / 2); dat->flags|=HLKF_HASENABLECOLOR; return (LRESULT)prevColor; } case HLK_SETDISABLECOLOUR: { COLORREF prevColor=dat->disableColor; dat->disableColor=(COLORREF)wParam; dat->flags|=HLKF_HASDISABLECOLOR; return (LRESULT)prevColor; } case WM_NCPAINT: return 0; case WM_PAINT: { HFONT hPrevFont; RECT rc; TCHAR szText[256]; UINT alignFlag; COLORREF textColor; PAINTSTRUCT ps; HDC hdc; hdc=BeginPaint(hwnd,&ps); if(hdc!=NULL) { if(IsWindowEnabled(hwnd)) { hPrevFont=(HFONT)SelectObject(hdc,dat->hEnableFont); textColor = (GetFocus() == hwnd) ? dat->focusColor : dat->enableColor; } else { hPrevFont=(HFONT)SelectObject(hdc,dat->hDisableFont); textColor=dat->disableColor; } if(GetClientRect(hwnd,&rc) && GetWindowText(hwnd,szText,SIZEOF(szText))) { if (drawThemeParentBackground && IsWinVerXPPlus()) { BOOL fSmoothing; UINT fSmoothingType; SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &fSmoothing, 0); SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &fSmoothingType, 0); if (fSmoothing && fSmoothingType == FE_FONTSMOOTHINGCLEARTYPE) drawThemeParentBackground(hwnd, hdc, &rc); } SetBkMode(hdc,TRANSPARENT); SetTextColor(hdc,textColor); alignFlag=(GetWindowLongPtr(hwnd,GWL_STYLE)&(SS_CENTER|SS_RIGHT|SS_LEFT)); DrawText(hdc,szText,-1,&rc,alignFlag|DT_NOPREFIX|DT_SINGLELINE|DT_TOP); } if(hPrevFont!=NULL) SelectObject(hdc,hPrevFont); EndPaint(hwnd,&ps); } return 0; } case WM_NCDESTROY: if(dat->hEnableFont!=NULL) DeleteObject(dat->hEnableFont); mir_free(dat); break; } return DefWindowProc(hwnd,msg,wParam,lParam); }
LRESULT uie_albumart::on_message(HWND wnd1,UINT msg,WPARAM wp,LPARAM lp) { switch(msg) { case WM_CREATE: { GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); m_sources_control.register_foo_callbacks(); m_sources_control.register_sources_control_callback(this); m_sources_control.setup_sources_control(m_config, m_sources); m_wheel_accum = 0; } break; case WM_DESTROY: { m_sources_control.unregister_sources_control_callback(this); m_sources_control.unregister_foo_callbacks(); m_bufold.release(); m_bufnew.release(); m_bufanim.release(); m_bmpnew.release(); m_bmp.release(); GdiplusShutdown(gdiplusToken); } break; case WM_LBUTTONDOWN: { POINTS pts = MAKEPOINTS(lp); POINT pt; POINTSTOPOINT(pt, pts); if (m_panning_enabled) { m_dragging = true; SetCursor(LoadCursor(NULL, IDC_SIZEALL)); SetCapture(wnd1); m_drag_start = pt; m_orig_dx = m_pan_dx; m_orig_dy = m_pan_dy; } } break; case WM_MOUSEMOVE: { if (m_dragging) { POINTS pts = MAKEPOINTS(lp); m_pan_dx = m_orig_dx + pts.x - m_drag_start.x; m_pan_dy = m_orig_dy + pts.y - m_drag_start.y; redraw(); } } break; case WM_CANCELMODE: if (m_dragging) { ReleaseCapture(); SetCursor(LoadCursor(NULL, IDC_ARROW)); m_dragging = false; } break; case WM_LBUTTONDBLCLK: click_func(m_config.dblclickfunc); b_dblclick = true; break; case WM_LBUTTONUP: if (m_dragging) { ReleaseCapture(); SetCursor(LoadCursor(NULL, IDC_ARROW)); m_dragging = false; // if the mouse didn't move much, it probably wasn't // a drag, so trigger the mouse action POINTS pts = MAKEPOINTS(lp); POINT pt; POINTSTOPOINT(pt, pts); int cxdrag = GetSystemMetrics(SM_CXDRAG); int cydrag = GetSystemMetrics(SM_CYDRAG); RECT rect; SetRect(&rect, -1*cxdrag/2, -1*cydrag/2, cxdrag/2, cydrag/2); OffsetRect(&rect, m_drag_start.x, m_drag_start.y); if (PtInRect(&rect, pt)) click_func(m_config.lftclickfunc); } else if (!b_dblclick) { click_func(m_config.lftclickfunc); } b_dblclick = false; break; case WM_MBUTTONUP: click_func(m_config.mdlclickfunc); break; case WM_MOUSEWHEEL: { short delta = GET_WHEEL_DELTA_WPARAM(wp); m_wheel_accum += delta; while (m_wheel_accum <= -WHEEL_DELTA) { m_wheel_accum += WHEEL_DELTA; func_NextSource(true); } while (m_wheel_accum >= WHEEL_DELTA) { m_wheel_accum -= WHEEL_DELTA; func_PreviousSource(); } } break; case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(m_hWnd, &ps); paint(hdc); EndPaint(m_hWnd, &ps); return 0; } break; case WM_TIMER: switch (wp) { case animation_timer_id: KillTimer(m_hWnd, animation_timer_id); redraw(); return 0; break; case cycle_timer_id: if (static_api_ptr_t<ui_control>()->is_visible()) { func_NextSource(false); } else { start_cycle_timer(); } return 0; break; } break; case WM_GETMINMAXINFO: { LPMINMAXINFO mmi = LPMINMAXINFO(lp); mmi->ptMinTrackSize.y = m_config.minheight; mmi->ptMinTrackSize.x = m_config.minwidth; } break; } return uDefWindowProc(wnd1, msg, wp, lp); }
LRESULT CALLBACK CCandidateWindow::_WindowProcCallback(_In_ HWND wndHandle, UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) { switch (uMsg) { case WM_CREATE: { HDC dcHandle = nullptr; dcHandle = GetDC(wndHandle); if (dcHandle) { HFONT hFontOld = (HFONT)SelectObject(dcHandle, Global::defaultlFontHandle); GetTextMetrics(dcHandle, &_TextMetric); _cxTitle = _TextMetric.tmMaxCharWidth * _wndWidth; SelectObject(dcHandle, hFontOld); ReleaseDC(wndHandle, dcHandle); } } return 0; case WM_DESTROY: _DeleteShadowWnd(); return 0; case WM_WINDOWPOSCHANGED: { WINDOWPOS* pWndPos = (WINDOWPOS*)lParam; // move shadow if (_pShadowWnd) { _pShadowWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } // move v-scroll if (_pVScrollBarWnd) { _pVScrollBarWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } _FireMessageToLightDismiss(wndHandle, pWndPos); } break; case WM_WINDOWPOSCHANGING: { WINDOWPOS* pWndPos = (WINDOWPOS*)lParam; // show/hide shadow if (_pShadowWnd) { if ((pWndPos->flags & SWP_HIDEWINDOW) != 0) { _pShadowWnd->_Show(FALSE); } // don't go behaind of shadow if (((pWndPos->flags & SWP_NOZORDER) == 0) && (pWndPos->hwndInsertAfter == _pShadowWnd->_GetWnd())) { pWndPos->flags |= SWP_NOZORDER; } _pShadowWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } // show/hide v-scroll if (_pVScrollBarWnd) { if ((pWndPos->flags & SWP_HIDEWINDOW) != 0) { _pVScrollBarWnd->_Show(FALSE); } _pVScrollBarWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } } break; case WM_SHOWWINDOW: // show/hide shadow if (_pShadowWnd) { _pShadowWnd->_Show((BOOL)wParam); } // show/hide v-scroll if (_pVScrollBarWnd) { _pVScrollBarWnd->_Show((BOOL)wParam); } break; case WM_PAINT: { HDC dcHandle = nullptr; PAINTSTRUCT ps; dcHandle = BeginPaint(wndHandle, &ps); _OnPaint(dcHandle, &ps); _DrawBorder(wndHandle, CANDWND_BORDER_WIDTH*2); EndPaint(wndHandle, &ps); } return 0; case WM_SETCURSOR: { POINT cursorPoint; GetCursorPos(&cursorPoint); MapWindowPoints(NULL, wndHandle, &cursorPoint, 1); // handle mouse message _HandleMouseMsg(HIWORD(lParam), cursorPoint); } return 1; case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { POINT point; POINTSTOPOINT(point, MAKEPOINTS(lParam)); // handle mouse message _HandleMouseMsg(uMsg, point); } // we processes this message, it should return zero. return 0; case WM_MOUSEACTIVATE: { WORD mouseEvent = HIWORD(lParam); if (mouseEvent == WM_LBUTTONDOWN || mouseEvent == WM_RBUTTONDOWN || mouseEvent == WM_MBUTTONDOWN) { return MA_NOACTIVATE; } } break; case WM_POINTERACTIVATE: return PA_NOACTIVATE; case WM_VSCROLL: _OnVScroll(LOWORD(wParam), HIWORD(wParam)); return 0; } return DefWindowProc(wndHandle, uMsg, wParam, lParam); }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { PAINTSTRUCT ps; HDC hdc; #if CLIENT3D | IMAGE | GRAPH3D RECT rc; #endif #if GRAPH3D static int countup = 1; int id; static vec1 gx, gy; #endif #if TIMERDEMO static POINT mousept; #endif #if ARCDEMO static int startdegrees = 0; static int enddegrees = 30; #endif switch( msg) { #if TIMERDEMO case WM_CREATE: SetTimer(hwnd, 1, 100, NULL); mousept.x = 60; mousept.y = 20; break; case WM_TIMER: #if GRAPH3D GetClientRect(hwnd, &rc); if(countup) { mousept.y += 20; if(mousept.y >= rc.bottom) { mousept.y -= 20; countup = 0; } } else { mousept.y -= 20; if(mousept.y < 20) { mousept.y += 20; countup = 1; } } SendMessage(hwnd, WM_MOUSEMOVE, 0, MAKELONG(mousept.x, mousept.y)); #endif #if ARCDEMO startdegrees += 10; if(startdegrees >= 360) startdegrees = 0; enddegrees += 15; if(enddegrees >= 360) enddegrees = 0; InvalidateRect(hwnd, NULL, TRUE); #endif break; case WM_DESTROY: KillTimer(hwnd, 1); break; #endif /* TIMERDEMO*/ case WM_SIZE: break; case WM_MOVE: break; #if CLIENT3D case WM_SETFOCUS: PostMessage((HWND)wp, WM_PAINT, 0, 0L); break; case WM_KILLFOCUS: PostMessage((HWND)wp, WM_PAINT, 0, 0L); break; case WM_ERASEBKGND: if(GetFocus() != hwnd) return DefWindowProc(hwnd, msg, wp, lp); return 1; #endif #if GRAPH3D case WM_ERASEBKGND: if((GetWindowLong(hwnd, GWL_ID) & 03) == 1) return 1; return DefWindowProc(hwnd, msg, wp, lp); #endif case WM_PAINT: hdc = BeginPaint(hwnd, &ps); #if CLIENT3D if(GetFocus() == hwnd) { GetClientRect(hwnd, &rc); Draw3dShadow(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, GetSysColor(COLOR_3DDKSHADOW), GetSysColor(COLOR_3DLIGHT)); InflateRect(&rc, -1, -1); FillRect(hdc, &rc, GetStockObject(GRAY_BRUSH)); } #endif #if IMAGE GetClientRect(hwnd, &rc); DrawDIB(hdc, rc.left+2, rc.top+2, image2); #endif #if ARCDEMO { int x, y, w, h; RECT rc; if(hdc != NULL) { GetWindowRect(hwnd, &rc); rc.top += 13; InflateRect(&rc, -3, -3); /*Ellipse(hdc, 0, 0, rc.right-rc.left, rc.bottom-rc.top);*/ /*Arc(hdc, 0, 0, rc.right-rc.left, rc.bottom-rc.top, 0,0, 0,0);*/ /*Pie(hdc, 0, 0, rc.right-rc.left, rc.bottom-rc.top, 0,0, 0,0);*/ x = rc.left; y = rc.top; w = rc.right - rc.left; h = rc.bottom - rc.top; w += 10; GdSetForeground(GdFindColor(RGB(0,255,0))); GdArcAngle(hdc->psd, x+w/2, y+h/2, w/2, h/2, startdegrees*64, enddegrees*64, MWPIE); GdSetForeground(GdFindColor(RGB(0,0,0))); GdArcAngle(hdc->psd, x+w/2, y+h/2, w/2, h/2, startdegrees*64, enddegrees*64, MWARCOUTLINE); /*GdSetForeground(GdFindColor(RGB(255,255,255)));*/ /*GdPoint(hdc->psd, x+w/2, y+h/2);*/ } EndPaint(hwnd, &ps); break; } #endif /* ARCDEMO*/ #if GRAPH3D id = (int)GetWindowLong(hwnd, GWL_ID) & 03; init3(hdc, id == 1? hwnd: NULL); switch(id) { case 0: rose(1.0, 7, 13); break; case 1: /*look3(0.5, 0.7, 1.5);*/ /*look3(0.2, -2 * gy, 1.0+gx);*/ look3(-2 * gx, -2 * gy, 1.2); drawgrid(-8.0, 8.0, 10, -8.0, 8.0, 10); break; case 2: setcolor3(BLACK); circle3(1.0); break; case 3: setcolor3(BLUE); daisy(1.0, 20); break; } #if CLIPDEMO if(id == 1) { HRGN hrgn, hrgn2; /* create circular clip region for effect*/ GetClientRect(hwnd, &rc); InflateRect(&rc, -80, -80); switch((int)GetWindowLong(hwnd, GWL_ID)) { default: hrgn = CreateEllipticRgnIndirect(&rc); break; case 5: hrgn = CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 100, 100); break; case 1: hrgn = CreateRectRgnIndirect(&rc); break; } /* erase background, clip out blit area*/ GetClientRect(hwnd, &rc); hrgn2 = CreateRectRgnIndirect(&rc); SelectClipRgn(hdc, hrgn2); ExtSelectClipRgn(hdc, hrgn, RGN_XOR); DeleteObject(hrgn2); GetClientRect(hwnd, &rc); FillRect(hdc, &rc, GetStockObject(BLACK_BRUSH)); /* clip in only blit area*/ SelectClipRgn(hdc, hrgn); DeleteObject(hrgn); } #endif /* CLIPDEMO*/ paint3(hdc); #endif /* GRAPH3D*/ EndPaint(hwnd, &ps); break; case WM_LBUTTONDOWN: break; case WM_MOUSEMOVE: #if GRAPH3D if((GetWindowLong(hwnd, GWL_ID) & 03) == 1) { POINT pt; POINTSTOPOINT(pt, lp); GetClientRect(hwnd, &rc); gx = (vec1)pt.x / rc.right; gy = (vec1)pt.y / rc.bottom; InvalidateRect(hwnd, NULL, FALSE); mousept.x = pt.x; mousept.y = pt.y; } #endif break; case WM_LBUTTONUP: break; case WM_RBUTTONDOWN: break; default: return DefWindowProc( hwnd, msg, wp, lp); } return( 0); }
/* handle a non-client message for a scrollbar*/ void MwHandleMessageScrollbar(HWND hwnd, WPARAM hitcode, LPARAM lParam, UINT msg, DWORD style) { int pos = SBS_UNKNOWN; BOOL vertbar = (style==SBS_VERT); BOOL horzbar = (style==SBS_HORZ); int * pStat; POINT pt; RECT rc; static BOOL bDraw; static int downPos = SBS_UNKNOWN; static int sbCode; int newThumbPos; int itemMoveable,itemCount,itemVisible,moveRange; /* jmt:2k0819 */ int moveTop,moveBottom,moveLeft,moveRight; /* jmt:2k0819 */ int cx,cy; MWSCROLLBARINFO* pData; pData = (MWSCROLLBARINFO *)hwnd->userdata; rc = hwnd->winrect; cx=rc.right-rc.left; cy=rc.bottom-rc.top; POINTSTOPOINT(pt, lParam); for (;;) { /* use for() to allow break statement*/ if (vertbar) { pStat = &pData->status; rc = hwnd->winrect; rc.bottom = rc.top + cx; if (PtInRect(&rc, pt)) { pos = SBS_UPARROW; break; } rc.bottom = hwnd->winrect.bottom; rc.top = rc.bottom - cx; if (PtInRect(&rc, pt)) { pos = SBS_DOWNARROW; break; } pos = SBS_VERTTHUMB; } else if (horzbar) { pStat = &pData->status; rc = hwnd->winrect; rc.right = rc.left + cy; if (PtInRect(&rc, pt)) { pos = SBS_LEFTARROW; break; } rc.right = hwnd->winrect.right; rc.left = rc.right - cy; if (PtInRect(&rc, pt)) { pos = SBS_RIGHTARROW; break; } pos = SBS_HORZTHUMB; } else return; break; } if (pos == SBS_UNKNOWN) return; *pStat &= ~SBS_MASK; /* remove stray mouse states*/ if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK) *pStat |= pos; else *pStat &= ~pos; if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK) bDraw=TRUE; if (bDraw) MwPaintScrollbars(hwnd, NULL,style); if (pos == SBS_UPARROW || pos == SBS_LEFTARROW) /* jmt:2k0820 */ { if (pData->curPos != pData->minPos) sbCode = SB_LINEUP; } else if (pos == SBS_DOWNARROW || pos == SBS_RIGHTARROW) /* jmt:2k0820 */ { if (pData->curPos != pData->maxPos) sbCode = SB_LINEDOWN; } else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB) { sbCode = SB_THUMBTRACK; } switch(msg) { case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDBLCLK: downPos = pos; break; case WM_NCMOUSEMOVE: if (vertbar) { if (sbCode == SB_THUMBTRACK && downPos == SBS_VERTTHUMB) { /* jmt(2k0819): new algorithm for SB_THUMBTRACK */ rc = hwnd->winrect; moveTop = rc.top + cx; moveBottom = hwnd->winrect.bottom - cx; moveRange = moveBottom - moveTop; itemCount = pData->maxPos - pData->minPos + 1; itemVisible = pData->pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveTop,itemMoveable,moveRange,newThumbPos); if ( newThumbPos >= pData->minPos && newThumbPos <= pData->maxPos) { SendMessage (hwnd, WM_VSCROLL, SB_THUMBTRACK, newThumbPos); SendMessage (GetParent(hwnd), WM_VSCROLL, SB_THUMBTRACK, newThumbPos); } break; } } if (horzbar) { if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB) { /* jmt(2k0819): new algorithm for SB_THUMBTRACK */ rc = hwnd->winrect; moveLeft = rc.left + cy; moveRight = hwnd->winrect.right - cy; moveRange = moveRight - moveLeft; itemCount = pData->maxPos - pData->minPos + 1; itemVisible = pData->pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveLeft,itemMoveable,moveRange,newThumbPos); if ( newThumbPos >= pData->minPos && newThumbPos <= pData->maxPos) { SendMessage (hwnd, WM_HSCROLL, SB_THUMBTRACK, newThumbPos); SendMessage (GetParent(hwnd), WM_HSCROLL, SB_THUMBTRACK, newThumbPos); } break; } } break; case WM_NCLBUTTONUP: bDraw=FALSE; downPos = SBS_UNKNOWN; if (sbCode==SB_THUMBTRACK) { if (vertbar) { /* jmt(2k0819): new algorithm for SB_THUMBTRACK */ rc = hwnd->winrect; moveTop = rc.top + cx; moveBottom = hwnd->winrect.bottom - cx; moveRange = moveBottom - moveTop; itemCount = pData->maxPos - pData->minPos + 1; itemVisible = pData->pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveTop,itemMoveable,moveRange,newThumbPos); if ( newThumbPos >= pData->minPos && newThumbPos <= pData->maxPos) { SendMessage (hwnd, WM_VSCROLL, SB_THUMBTRACK, newThumbPos); SendMessage (GetParent(hwnd), WM_VSCROLL, SB_THUMBTRACK, newThumbPos); } break; /* case */ } if (horzbar) { /* jmt(2k0819): new algorithm for SB_THUMBTRACK */ rc = hwnd->winrect; moveLeft = rc.left + cy; moveRight = hwnd->winrect.right - cy; moveRange = moveRight - moveLeft; itemCount = pData->maxPos - pData->minPos + 1; itemVisible = pData->pageStep; itemMoveable = itemCount - itemVisible + 1; newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange; printf("((%d-%d)*%d)/%d=%d\n", pt.y,moveLeft,itemMoveable,moveRange,newThumbPos); if ( newThumbPos >= pData->minPos && newThumbPos <= pData->maxPos) { SendMessage (hwnd, WM_HSCROLL, SB_THUMBTRACK, newThumbPos); SendMessage (GetParent(hwnd), WM_HSCROLL, SB_THUMBTRACK, newThumbPos); } break; /* case */ } } else { if (vertbar) { SendMessage (hwnd, WM_VSCROLL, sbCode, 0); SendMessage (GetParent(hwnd), WM_VSCROLL, sbCode, 0); } if (horzbar) { SendMessage (hwnd, WM_HSCROLL, sbCode, 0); SendMessage (GetParent(hwnd), WM_HSCROLL, sbCode, 0); } } break; } }
LRESULT APIENTRY ListBoxWndProcWorker( PWND pwnd, UINT message, WPARAM wParam, LPARAM lParam, DWORD fAnsi) { HWND hwnd = HWq(pwnd); PAINTSTRUCT ps; HDC hdc; LPRECT lprc; PLBIV plb; /* List Box Instance Variable */ INT iSel; /* Index of selected item */ DWORD dw; TL tlpwndParent; UINT wFlags; LPWSTR lpwsz = NULL; LRESULT lReturn = 0; static BOOL fInit = TRUE; CheckLock(pwnd); VALIDATECLASSANDSIZE(pwnd, FNID_LISTBOX); INITCONTROLLOOKASIDE(&ListboxLookaside, LBIV, spwnd, 4); /* * Get the plb for the given window now since we will use it a lot in * various handlers. This was stored using SetWindowLong(hwnd,0,plb) * when the listbox was first created (by INITCONTROLLOOKASIDE above) */ plb = ((PLBWND)pwnd)->pLBIV; /* * Handle ANSI translations of input parameters */ if (fAnsi) { switch (message) { case LB_ADDSTRING: case LB_ADDSTRINGUPPER: case LB_ADDSTRINGLOWER: case LB_FINDSTRING: case LB_FINDSTRINGEXACT: case LB_INSERTSTRING: case LB_INSERTSTRINGUPPER: case LB_INSERTSTRINGLOWER: case LB_SELECTSTRING: if (!plb->fHasStrings) { break; } // Fall through... case LB_ADDFILE: case LB_DIR: if (lParam) { if (!MBToWCS((LPSTR)lParam, -1, &lpwsz, -1, TRUE)) return LB_ERR; } break; default: break; } if (lpwsz) { lParam = (LPARAM)lpwsz; } } switch (message) { case LB_GETTOPINDEX: // Return index of top item displayed. return plb->iTop; case LB_SETTOPINDEX: if (wParam && ((INT)wParam < 0 || (INT)wParam >= plb->cMac)) { RIPERR0(ERROR_INVALID_INDEX, RIP_VERBOSE, ""); return LB_ERR; } if (plb->cMac) { xxxNewITop(plb, (INT)wParam); } break; case WM_STYLECHANGED: plb->fRtoLReading = (TestWF(pwnd, WEFRTLREADING) != 0); plb->fRightAlign = (TestWF(pwnd, WEFRIGHT) != 0); xxxCheckRedraw(plb, FALSE, 0); break; case WM_WINDOWPOSCHANGED: /* * If we are in the middle of creation, ignore this * message because it will generate a WM_SIZE message. * See xxxLBCreate(). */ if (!plb->fIgnoreSizeMsg) goto CallDWP; break; case WM_SIZE: /* * If we are in the middle of creation, ignore size * messages. See xxxLBCreate(). */ if (!plb->fIgnoreSizeMsg) xxxLBSize(plb, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); break; case WM_ERASEBKGND: ThreadLock(plb->spwndParent, &tlpwndParent); FillWindow(HW(plb->spwndParent), hwnd, (HDC)wParam, (HBRUSH)CTLCOLOR_LISTBOX); ThreadUnlock(&tlpwndParent); return TRUE; case LB_RESETCONTENT: xxxLBResetContent(plb); break; case WM_TIMER: if (wParam == IDSYS_LBSEARCH) { plb->iTypeSearch = 0; NtUserKillTimer(hwnd, IDSYS_LBSEARCH); xxxInvertLBItem(plb, plb->iSel, TRUE); break; } message = WM_MOUSEMOVE; xxxTrackMouse(plb, message, plb->ptPrev); break; /* * Fall through */ case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: { POINT pt; POINTSTOPOINT(pt, lParam); xxxTrackMouse(plb, message, pt); } break; case WM_MBUTTONDOWN: EnterReaderModeHelper(hwnd); break; case WM_CAPTURECHANGED: // // Note that this message should be handled only on unexpected // capture changes currently. // UserAssert(TestWF(pwnd, WFWIN40COMPAT)); if (plb->fCaptured) xxxLBButtonUp(plb, LBUP_NOTIFY); break; case LBCB_STARTTRACK: // // Start tracking mouse moves in the listbox, setting capture // if (!plb->pcbox) break; plb->fCaptured = FALSE; if (wParam) { POINT pt; POINTSTOPOINT(pt, lParam); _ScreenToClient(pwnd, &pt); xxxTrackMouse(plb, WM_LBUTTONDOWN, pt); } else { NtUserSetCapture(hwnd); plb->fCaptured = TRUE; plb->iLastSelection = plb->iSel; } break; case LBCB_ENDTRACK: // Kill capture, tracking, etc. if (plb->fCaptured) xxxLBButtonUp(plb, LBUP_RELEASECAPTURE | (wParam ? LBUP_SELCHANGE : LBUP_RESETSELECTION)); break; case WM_PRINTCLIENT: xxxLBPaint(plb, (HDC) wParam, NULL); break; case WM_PAINT: if (wParam) { hdc = (HDC) wParam; lprc = NULL; } else { hdc = NtUserBeginPaint(hwnd, &ps); lprc = &(ps.rcPaint); } if (IsLBoxVisible(plb)) xxxLBPaint(plb, hdc, lprc); if (!wParam) NtUserEndPaint(hwnd, &ps); break; case WM_NCDESTROY: case WM_FINALDESTROY: xxxDestroyLBox(plb, pwnd); break; case WM_SETFOCUS: // DISABLED in Win 3.1 xxxUpdateWindow(pwnd); CaretCreate(plb); xxxLBSetCaret(plb, TRUE); xxxNotifyOwner(plb, LBN_SETFOCUS); if (FWINABLE()) { if (_IsWindowVisible(pwnd)) { LBEvent(plb, EVENT_OBJECT_FOCUS, plb->iSelBase); } } break; case WM_KILLFOCUS: /* * Reset the wheel delta count. */ gcWheelDelta = 0; xxxLBSetCaret(plb, FALSE); xxxCaretDestroy(plb); xxxNotifyOwner(plb, LBN_KILLFOCUS); if (plb->iTypeSearch) { plb->iTypeSearch = 0; NtUserKillTimer(hwnd, IDSYS_LBSEARCH); } if (plb->pszTypeSearch) { UserLocalFree(plb->pszTypeSearch); plb->pszTypeSearch = NULL; } break; case WM_MOUSEWHEEL: { int cDetants; int cPage; int cLines; RECT rc; int windowWidth; int cPos; /* * Don't handle zoom and datazoom. */ if (wParam & (MK_SHIFT | MK_CONTROL)) { goto CallDWP; } lReturn = 1; gcWheelDelta -= (short) HIWORD(wParam); cDetants = gcWheelDelta / WHEEL_DELTA; if ( cDetants != 0 && gpsi->ucWheelScrollLines > 0 && (pwnd->style & (WS_VSCROLL | WS_HSCROLL))) { gcWheelDelta = gcWheelDelta % WHEEL_DELTA; if (pwnd->style & WS_VSCROLL) { cPage = max(1, (plb->cItemFullMax - 1)); cLines = cDetants * (int) min((UINT) cPage, gpsi->ucWheelScrollLines); cPos = max(0, min(plb->iTop + cLines, plb->cMac - 1)); if (cPos != plb->iTop) { xxxLBoxCtlScroll(plb, SB_THUMBPOSITION, cPos); xxxLBoxCtlScroll(plb, SB_ENDSCROLL, 0); } } else if (plb->fMultiColumn) { cPage = max(1, plb->numberOfColumns); cLines = cDetants * (int) min((UINT) cPage, gpsi->ucWheelScrollLines); cPos = max( 0, min((plb->iTop / plb->itemsPerColumn) + cLines, plb->cMac - 1 - ((plb->cMac - 1) % plb->itemsPerColumn))); if (cPos != plb->iTop) { xxxLBoxCtlHScrollMultiColumn(plb, SB_THUMBPOSITION, cPos); xxxLBoxCtlHScrollMultiColumn(plb, SB_ENDSCROLL, 0); } } else { _GetClientRect(plb->spwnd, &rc); windowWidth = rc.right; cPage = max(plb->cxChar, (windowWidth / 3) * 2) / plb->cxChar; cLines = cDetants * (int) min((UINT) cPage, gpsi->ucWheelScrollLines); cPos = max( 0, min(plb->xOrigin + (cLines * plb->cxChar), plb->maxWidth)); if (cPos != plb->xOrigin) { xxxLBoxCtlHScroll(plb, SB_THUMBPOSITION, cPos); xxxLBoxCtlHScroll(plb, SB_ENDSCROLL, 0); } } } } break; case WM_VSCROLL: xxxLBoxCtlScroll(plb, LOWORD(wParam), HIWORD(wParam)); break; case WM_HSCROLL: xxxLBoxCtlHScroll(plb, LOWORD(wParam), HIWORD(wParam)); break; case WM_GETDLGCODE: return DLGC_WANTARROWS | DLGC_WANTCHARS; case WM_CREATE: return xxxLBCreate(plb, pwnd, (LPCREATESTRUCT) lParam); case WM_SETREDRAW: /* * If wParam is nonzero, the redraw flag is set * If wParam is zero, the flag is cleared */ xxxLBSetRedraw(plb, (wParam != 0)); break; case WM_ENABLE: xxxLBInvalidateRect(plb, NULL, !plb->OwnerDraw); break; case WM_SETFONT: xxxLBSetFont(plb, (HANDLE)wParam, LOWORD(lParam)); break; case WM_GETFONT: return (LRESULT)plb->hFont; case WM_DRAGSELECT: case WM_DRAGLOOP: case WM_DRAGMOVE: case WM_DROPFILES: ThreadLock(plb->spwndParent, &tlpwndParent); lReturn = SendMessage(HW(plb->spwndParent), message, wParam, lParam); ThreadUnlock(&tlpwndParent); return lReturn; case WM_QUERYDROPOBJECT: case WM_DROPOBJECT: /* * fix up control data, then pass message to parent */ LBDropObjectHandler(plb, (PDROPSTRUCT)lParam); ThreadLock(plb->spwndParent, &tlpwndParent); lReturn = SendMessage(HW(plb->spwndParent), message, wParam, lParam); ThreadUnlock(&tlpwndParent); return lReturn; case LB_GETITEMRECT: return LBGetItemRect(plb, (INT)wParam, (LPRECT)lParam); case LB_GETITEMDATA: return LBGetItemData(plb, (INT)wParam); // wParam = item index case LB_SETITEMDATA: /* * wParam is item index */ return LBSetItemData(plb, (INT)wParam, lParam); case LB_ADDSTRINGUPPER: wFlags = UPPERCASE | LBI_ADD; goto CallInsertItem; case LB_ADDSTRINGLOWER: wFlags = LOWERCASE | LBI_ADD; goto CallInsertItem; case LB_ADDSTRING: wFlags = LBI_ADD; goto CallInsertItem; case LB_INSERTSTRINGUPPER: wFlags = UPPERCASE; goto CallInsertItem; case LB_INSERTSTRINGLOWER: wFlags = LOWERCASE; goto CallInsertItem; case LB_INSERTSTRING: wFlags = 0; CallInsertItem: lReturn = ((LRESULT) xxxLBInsertItem(plb, (LPWSTR) lParam, (int) wParam, wFlags)); break; case LB_INITSTORAGE: return xxxLBInitStorage(plb, fAnsi, (INT)wParam, (INT)lParam); case LB_DELETESTRING: return xxxLBoxCtlDelete(plb, (INT)wParam); case LB_DIR: /* * wParam - Dos attribute value. * lParam - Points to a file specification string */ lReturn = xxxLbDir(plb, (INT)wParam, (LPWSTR)lParam); break; case LB_ADDFILE: lReturn = xxxLbInsertFile(plb, (LPWSTR)lParam); break; case LB_SETSEL: return xxxLBSetSel(plb, (wParam != 0), (INT)lParam); case LB_SETCURSEL: /* * If window obscured, update so invert will work correctly */ // DISABLED in Win 3.1 xxxUpdateWindow(pwnd); return xxxLBSetCurSel(plb, (INT)wParam); case LB_GETSEL: if (wParam >= (UINT) plb->cMac) return((LRESULT) LB_ERR); return IsSelected(plb, (INT)wParam, SELONLY); case LB_GETCURSEL: if (plb->wMultiple == SINGLESEL) { return plb->iSel; } return plb->iSelBase; case LB_SELITEMRANGE: if (plb->wMultiple == SINGLESEL) { /* * Can't select a range if only single selections are enabled */ RIPERR0(ERROR_INVALID_INDEX, RIP_VERBOSE,"Invalid index passed to LB_SELITEMRANGE"); return LB_ERR; } xxxLBSelRange(plb, LOWORD(lParam), HIWORD(lParam), (wParam != 0)); break; case LB_SELITEMRANGEEX: if (plb->wMultiple == SINGLESEL) { /* * Can't select a range if only single selections are enabled */ RIPERR0(ERROR_INVALID_LB_MESSAGE, RIP_VERBOSE,"LB_SELITEMRANGEEX:Can't select a range if only single selections are enabled"); return LB_ERR; } else { BOOL fHighlight = ((DWORD)lParam > (DWORD)wParam); if (fHighlight == FALSE) { ULONG_PTR temp = lParam; lParam = wParam; wParam = temp; } xxxLBSelRange(plb, (INT)wParam, (INT)lParam, fHighlight); } break; case LB_GETTEXTLEN: if (lParam != 0) { RIPMSG1(RIP_WARNING, "LB_GETTEXTLEN with lParam = %lx\n", lParam); } lReturn = LBGetText(plb, TRUE, fAnsi, (INT)wParam, NULL); break; case LB_GETTEXT: lReturn = LBGetText(plb, FALSE, fAnsi, (INT)wParam, (LPWSTR)lParam); break; case LB_GETCOUNT: // Lotus Approach calls CallWndProc(ListWndProc, LB_GETCOUNT,...) // on a window that doesn't have a plb yet. So, we need to make // this check. Bug #6675 - 11/7/94 -- if(plb) return((LRESULT) plb->cMac); else return(0); case LB_SETCOUNT: return xxxLBSetCount(plb, (INT)wParam); case LB_SELECTSTRING: case LB_FINDSTRING: iSel = xxxFindString(plb, (LPWSTR)lParam, (INT)wParam, PREFIX, TRUE); if (message == LB_FINDSTRING || iSel == LB_ERR) { lReturn = iSel; } else { lReturn = xxxLBSetCurSel(plb, iSel); } break; case LB_GETLOCALE: return plb->dwLocaleId; case LB_SETLOCALE: /* * Validate locale */ wParam = ConvertDefaultLocale((LCID)wParam); if (!IsValidLocale((LCID)wParam, LCID_INSTALLED)) return LB_ERR; dw = plb->dwLocaleId; plb->dwLocaleId = (DWORD)wParam; return dw; case WM_KEYDOWN: /* * IanJa: Use LOWORD() to get low 16-bits of wParam - this should * work for Win16 & Win32. The value obtained is the virtual key */ xxxLBoxCtlKeyInput(plb, message, LOWORD(wParam)); break; case WM_CHAR: xxxLBoxCtlCharInput(plb, LOWORD(wParam), fAnsi); break; case LB_GETSELITEMS: case LB_GETSELCOUNT: /* * IanJa/Win32 should this be LPWORD now? */ return LBoxGetSelItems(plb, (message == LB_GETSELCOUNT), (INT)wParam, (LPINT)lParam); case LB_SETTABSTOPS: /* * IanJa/Win32: Tabs given by array of INT for backwards compatability */ return LBSetTabStops(plb, (INT)wParam, (LPINT)lParam); case LB_GETHORIZONTALEXTENT: /* * Return the max width of the listbox used for horizontal scrolling */ return plb->maxWidth; case LB_SETHORIZONTALEXTENT: /* * Set the max width of the listbox used for horizontal scrolling */ if (plb->maxWidth != (INT)wParam) { plb->maxWidth = (INT)wParam; /* * When horizontal extent is set, Show/hide the scroll bars. * NOTE: LBShowHideScrollBars() takes care if Redraw is OFF. * Fix for Bug #2477 -- 01/14/91 -- SANKAR -- */ xxxLBShowHideScrollBars(plb); //Try to show or hide scroll bars if (plb->fHorzBar && plb->fRightAlign && !(plb->fMultiColumn || plb->OwnerDraw)) { /* * origin to right */ xxxLBoxCtlHScroll(plb, SB_BOTTOM, 0); } } break; /* originally returned register ax (message) ! */ case LB_SETCOLUMNWIDTH: /* * Set the width of a column in a multicolumn listbox */ plb->cxColumn = (INT)wParam; LBCalcItemRowsAndColumns(plb); if (IsLBoxVisible(plb)) NtUserInvalidateRect(hwnd, NULL, TRUE); xxxLBShowHideScrollBars(plb); break; case LB_SETANCHORINDEX: if ((INT)wParam >= plb->cMac) { RIPERR0(ERROR_INVALID_INDEX, RIP_VERBOSE,"Invalid index passed to LB_SETANCHORINDEX"); return LB_ERR; } plb->iMouseDown = (INT)wParam; plb->iLastMouseMove = (INT)wParam; xxxInsureVisible(plb, (int) wParam, (BOOL)(lParam != 0)); break; case LB_GETANCHORINDEX: return plb->iMouseDown; case LB_SETCARETINDEX: if ( (plb->iSel == -1) || ((plb->wMultiple != SINGLESEL) && (plb->cMac > (INT)wParam))) { /* * Set's the iSelBase to the wParam * if lParam, then don't scroll if partially visible * else scroll into view if not fully visible */ xxxInsureVisible(plb, (INT)wParam, (BOOL)LOWORD(lParam)); xxxSetISelBase(plb, (INT)wParam); break; } else { if ((INT)wParam >= plb->cMac) { RIPERR0(ERROR_INVALID_INDEX, RIP_VERBOSE,"Invalid index passed to LB_SETCARETINDEX"); } return LB_ERR; } break; case LB_GETCARETINDEX: return plb->iSelBase; case LB_SETITEMHEIGHT: case LB_GETITEMHEIGHT: return LBGetSetItemHeightHandler(plb, message, (INT)wParam, LOWORD(lParam)); break; case LB_FINDSTRINGEXACT: lReturn = xxxFindString(plb, (LPWSTR)lParam, (INT)wParam, EQ, TRUE); break; case LB_ITEMFROMPOINT: { POINT pt; BOOL bOutside; DWORD dwItem; POINTSTOPOINT(pt, lParam); bOutside = ISelFromPt(plb, pt, &dwItem); UserAssert(bOutside == 1 || bOutside == 0); return (LRESULT)MAKELONG(dwItem, bOutside); } case LBCB_CARETON: /* * Internal message for combo box support */ CaretCreate(plb); // Set up the caret in the proper location for drop downs. plb->iSelBase = plb->iSel; xxxLBSetCaret(plb, TRUE); if (FWINABLE()) { if (_IsWindowVisible(pwnd)) { LBEvent(plb, EVENT_OBJECT_FOCUS, plb->iSelBase); } } return(plb->iSel); case LBCB_CARETOFF: /* * Internal message for combo box support */ xxxLBSetCaret(plb, FALSE); xxxCaretDestroy(plb); break; case WM_NCCREATE: if ((pwnd->style & LBS_MULTICOLUMN) && (pwnd->style & WS_VSCROLL)) { DWORD mask = WS_VSCROLL; DWORD flags = 0; if (!TestWF(pwnd, WFWIN40COMPAT)) { mask |= WS_HSCROLL; flags = WS_HSCROLL; } NtUserAlterWindowStyle(hwnd, mask, flags); } goto CallDWP; default: CallDWP: return DefWindowProcWorker(pwnd, message, wParam, lParam, fAnsi); } /* * Handle translation of ANSI output data and free buffer */ if (lpwsz) { UserLocalFree(lpwsz); } return lReturn; }