void TffdshowPageDec::swap(int direction) { int pageorder = page->getOrder(); int minOrder = deciD->getMinOrder2(); if (pageorder < minOrder) { return; } HTREEITEM hti0; int maxOrder = deciD->getMaxOrder2(); switch (direction) { case -1: if (pageorder <= minOrder) { return; } hti0 = TreeView_GetPrevSibling(htv, page->hti); break; case 1: if (pageorder >= maxOrder) { return; } hti0 = TreeView_GetNextSibling(htv, page->hti); break; default: return; } TconfPageBase *page1 = hti2page(hti0), *page2 = hti2page(page->hti); if (isIn(page1->getOrder(), minOrder, maxOrder) && isIn(page2->getOrder(), minOrder, maxOrder)) { swap(page1, page2); } }
t_size TreeView_GetChildIndex(HWND wnd_tv, HTREEITEM ti) { HTREEITEM item = ti; unsigned n = 0; while (item = TreeView_GetPrevSibling(wnd_tv, item)) n++; return n; }
PTVDATA GetPreviousSibling(_Ty Key) { PTVDATA r = NULL; HTREEITEM hItem = KeyToHandle(Key); if (NULL != hItem) { r = HandleToData(TreeView_GetPrevSibling(m_hWnd, hItem)); } return r; }
void rowOptDelContainer(HWND htree, HTREEITEM hti) { HTREEITEM prev = TreeView_GetPrevSibling(htree, hti); HTREEITEM prnt = TreeView_GetParent(htree, hti); TVITEM tvi, tvpi; if (!hti) return; // Get current tree item tvi.hItem = hti; tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; TreeView_GetItem(htree, &tvi); tvpi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (prev) { tvpi.hItem = prev; TreeView_GetItem(htree, &tvpi); ((pROWCELL)tvpi.lParam)->next = ((pROWCELL)tvi.lParam)->next; } else { if (prnt) { tvpi.hItem = prnt; TreeView_GetItem(htree, &tvpi); ((pROWCELL)tvpi.lParam)->child = ((pROWCELL)tvi.lParam)->next; prev = prnt; } else { tvpi.lParam = 0; rowOptTmplRoot = (pROWCELL)tvpi.lParam; } } ((pROWCELL)tvi.lParam)->next = NULL; rowDeleteTree((pROWCELL)tvi.lParam); { int i = 0; memset(rowOptTA, 0, sizeof(rowOptTA)); rowOptBuildTA((pROWCELL)tvpi.lParam, (pROWCELL*)&rowOptTA, &i); } TreeView_DeleteItem(htree, hti); // Change icon at parent item if (!prnt || (prnt != prev)) return; if (TreeView_GetChild(htree, prnt)) { tvpi.iImage = 1; tvpi.iSelectedImage = 0; } else { tvpi.iImage = 2; tvpi.iSelectedImage = 2; } TreeView_SetItem(htree, &tvpi); }
LRESULT CALLBACK ParentSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { CCList *dat = CWndUserData(hWnd).GetCList(); switch (Msg) { case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam; if (pnmh->hwndFrom == dat->hTreeView) { switch (pnmh->code) { case TVN_ITEMEXPANDED: // just set an appropriate group image { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TVITEM tvItem; tvItem.hItem = pnmtv->itemNew.hItem; tvItem.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvItem.iImage = tvItem.iSelectedImage = (pnmtv->itemNew.state & TVIS_EXPANDED) ? IMAGE_GROUPOPEN : IMAGE_GROUPSHUT; TreeView_SetItem(dat->hTreeView, &tvItem); } break; case TVN_SELCHANGED: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TREEITEMARRAY OldSelection = dat->SelectedItems; for (int i = 0; i < dat->SelectedItems.GetSize(); i++) { if (dat->SelectedItems[i] != pnmtv->itemNew.hItem) { TreeView_SetItemState(dat->hTreeView, dat->SelectedItems[i], 0, TVIS_SELECTED); } } dat->SelectedItems.RemoveAll(); if (pnmtv->itemNew.hItem) { dat->SelectedItems.AddElem(pnmtv->itemNew.hItem); dat->SelectGroups(pnmtv->itemNew.hItem, true); } NMCLIST nm; nm.hdr.code = MCLN_SELCHANGED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); nm.OldSelection = &OldSelection; nm.NewSelection = &dat->SelectedItems; SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm); } break; case TVN_DELETEITEM: if (dat->Items.GetSize()) { // if Items size = 0, then this TVN_DELETEITEM came after WM_DESTROY, so there is no need to do anything LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TREEITEMARRAY OldSelection = dat->SelectedItems; int Index = dat->SelectedItems.Find(pnmtv->itemOld.hItem); if (Index != -1) dat->SelectedItems.RemoveElem(Index); // find an item to pass to SelectGroups() HTREEITEM hItem = TreeView_GetNextSibling(dat->hTreeView, pnmtv->itemOld.hItem); if (!hItem) { hItem = TreeView_GetPrevSibling(dat->hTreeView, pnmtv->itemOld.hItem); if (!hItem) hItem = TreeView_GetParent(dat->hTreeView, pnmtv->itemOld.hItem); } if (hItem) // if it wasn't one of the root items dat->SelectGroups(hItem, dat->SelectedItems.Find(hItem) != -1); NMCLIST nm; nm.hdr.code = MCLN_SELCHANGED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); nm.OldSelection = &OldSelection; nm.NewSelection = &dat->SelectedItems; SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm); dat->Items[pnmtv->itemOld.lParam].hContact = INVALID_CONTACT_ID; } break; case NM_CUSTOMDRAW: LPNMTVCUSTOMDRAW lpNMCD = (LPNMTVCUSTOMDRAW)lParam; switch (lpNMCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: // the control is about to start painting return CDRF_NOTIFYITEMDRAW; // instruct the control to return information when it draws items case CDDS_ITEMPREPAINT: return CDRF_NOTIFYPOSTPAINT; case CDDS_ITEMPOSTPAINT: RECT rc; if (TreeView_GetItemRect(dat->hTreeView, (HTREEITEM)lpNMCD->nmcd.dwItemSpec, &rc, false)) { for (int i = 0; i < MAXEXTRAICONS; i++) { BYTE nIndex = dat->Items[lpNMCD->nmcd.lItemlParam].ExtraIcons[i]; if (nIndex != CLC_EXTRAICON_EMPTY) { ImageList_DrawEx(dat->ExtraImageList, nIndex, lpNMCD->nmcd.hdc, rc.right - EXTRAICON_XSTEP * (i + 1), rc.top, 0, 0, /*GetSysColor(COLOR_WINDOW)*/CLR_NONE, CLR_NONE, ILD_NORMAL); } } } break; } } break; } } } return CallWindowProc(dat->OrigParentProc, hWnd, Msg, wParam, lParam); }
HTREEITEM CCList::GetNextItem(DWORD Flags, HTREEITEM hItem) { switch (Flags & ~(MCLGN_MULTILEVEL | MCLGN_NOTCHILD | MCLGN_ANY)) { case MCLGN_ROOT: return TreeView_GetRoot(hTreeView); case MCLGN_LAST: { HTREEITEM hNextItem = TVI_ROOT; do { hItem = hNextItem; hNextItem = TreeView_GetLastChild(hTreeView, hNextItem); } while (hNextItem); return (hItem == TVI_ROOT) ? nullptr : hItem; } case MCLGN_CHILD: return TreeView_GetChild(hTreeView, hItem); case MCLGN_LASTCHILD: return TreeView_GetLastChild(hTreeView, hItem); case MCLGN_PARENT: return TreeView_GetParent(hTreeView, hItem); case MCLGN_NEXT: do { if (Flags & MCLGN_MULTILEVEL) { HTREEITEM hNextItem = nullptr; if ((Flags & MCLGN_NOTCHILD) != MCLGN_NOTCHILD) hNextItem = TreeView_GetChild(hTreeView, hItem); if (!hNextItem) { hNextItem = TreeView_GetNextSibling(hTreeView, hItem); while (!hNextItem) { // move back until we find next sibling of the item or one of its parents hItem = TreeView_GetParent(hTreeView, hItem); if (!hItem) // means it was the root, there are no items left. break; // returns NULL as the next item hNextItem = TreeView_GetNextSibling(hTreeView, hItem); } } hItem = hNextItem; } else hItem = TreeView_GetNextSibling(hTreeView, hItem); Flags &= ~(MCLGN_NOTCHILD & ~MCLGN_MULTILEVEL); // clear MCLGN_NOTCHILD flag } while (hItem && !(Flags & GetItemTypeAsCLGNFlag(hItem))); return hItem; case MCLGN_PREV: do { if (Flags & MCLGN_MULTILEVEL) { HTREEITEM hNextItem = TreeView_GetPrevSibling(hTreeView, hItem); if (hNextItem) { if ((Flags & MCLGN_NOTCHILD) != MCLGN_NOTCHILD) { while (hNextItem) { hItem = hNextItem; hNextItem = TreeView_GetLastChild(hTreeView, hItem); } } else hItem = hNextItem; } else hItem = TreeView_GetParent(hTreeView, hItem); } else hItem = TreeView_GetPrevSibling(hTreeView, hItem); Flags &= ~(MCLGN_NOTCHILD & ~MCLGN_MULTILEVEL); // clear MCLGN_NOTCHILD flag } while (hItem && !(Flags & GetItemTypeAsCLGNFlag(hItem))); return hItem; default: _ASSERT(0); } return nullptr; }
INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { switch(msg){ case WM_INITDIALOG:{ DWORD style; g_opHdlg=hdlg; bOptionsInit=TRUE; TranslateDialogDefault(hdlg); if(g_iButtonsCount!=db_get_b(NULL, PLGNAME,"ButtonsCount", 0)) { LOGFONT logFont; HFONT hFont; bNeedRestart=TRUE; EnableWindow(GetDlgItem(hdlg,IDC_BUTTONSLIST),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BLISTADD),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BLISTREMOVE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUTREE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MTREEADD),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MTREEREMOVE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BUTTONNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUNAME),FALSE); ShowWindow(GetDlgItem(hdlg,IDC_WARNING),SW_SHOW); hFont = (HFONT)SendDlgItemMessage(hdlg, IDC_WARNING, WM_GETFONT, 0, 0); GetObject(hFont, sizeof(logFont), &logFont); logFont.lfWeight = FW_BOLD; hFont = CreateFontIndirect(&logFont); SendDlgItemMessage(hdlg, IDC_WARNING, WM_SETFONT, (WPARAM)hFont, 0); break; } g_iOPButtonsCount=g_iButtonsCount; hButtonsList=GetDlgItem(hdlg,IDC_BUTTONSLIST); hMenuTree=GetDlgItem(hdlg,IDC_MENUTREE); style = GetWindowLongPtr(hButtonsList,GWL_STYLE); style |=TVS_NOHSCROLL; SetWindowLongPtr(hButtonsList,GWL_STYLE, style); style = GetWindowLongPtr(hMenuTree,GWL_STYLE); style |=TVS_NOHSCROLL; SetWindowLongPtr(hMenuTree,GWL_STYLE, style); BuildButtonsList(hButtonsList); if (!TreeView_GetCount(hButtonsList)) EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); mir_subclassWindow( GetDlgItem(hdlg,IDC_BUTTONNAME), EditSubclassProc); mir_subclassWindow( GetDlgItem(hdlg,IDC_MENUNAME), EditSubclassProc); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); CheckDlgButton(hdlg,IDC_RAUTOSEND,(g_bRClickAuto=db_get_b(NULL,PLGNAME,"RClickAuto",0)) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_LAUTOSEND,(g_bLClickAuto=db_get_b(NULL,PLGNAME,"LClickAuto",0)) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_ENABLEQUICKMENU,(g_bQuickMenu=db_get_b(NULL, PLGNAME,"QuickMenu", 1)) ? BST_CHECKED : BST_UNCHECKED); bOptionsInit=FALSE; }break; case WM_LBUTTONUP: if(drag) { TVHITTESTINFO hti; HTREEITEM htiAfter=NULL; ButtonData* bd=NULL; TVITEM tvi; RECT rc; BYTE height; BOOLEAN bAsChild = FALSE; TreeView_SetInsertMark(hMenuTree, NULL, 0 ); ReleaseCapture(); SetCursor( LoadCursor( NULL, IDC_ARROW )); hti.pt.x = ( SHORT )LOWORD( lparam ); hti.pt.y = ( SHORT )HIWORD( lparam ); ClientToScreen(hdlg,&hti.pt); ScreenToClient(hMenuTree,&hti.pt); TreeView_HitTest( hMenuTree, &hti ); if(TreeView_GetParent(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) break; if(TreeView_GetChild(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) break; if ( hti.flags & TVHT_ABOVE ) { htiAfter = TVI_FIRST; } else if ( hti.flags & ( TVHT_NOWHERE|TVHT_BELOW )) { htiAfter = TVI_LAST; } else if ( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT )) { // check where over the item, the pointer is if ( !TreeView_GetItemRect( hMenuTree, hti.hItem, &rc, FALSE )) { drag=0; break; } height = ( BYTE )( rc.bottom - rc.top ); if ( hti.pt.y - ( height / 3 ) < rc.top ) { HTREEITEM hItem = hti.hItem; if ( !( hti.hItem = TreeView_GetPrevSibling( hMenuTree, hItem )) ) { if ( !( hti.hItem = TreeView_GetParent(hMenuTree, hItem ))) htiAfter = TVI_FIRST; else bAsChild = TRUE; } } else if ( hti.pt.y + ( height / 3 ) <= rc.bottom ) { bAsChild = TRUE; } } if(TreeView_GetChild(hMenuTree,hDragItem)&&bAsChild) break; if(hti.hItem){ tvi.hItem=hti.hItem; tvi.mask=TVIF_PARAM |TVIF_HANDLE; TreeView_GetItem(hMenuTree,&tvi); if ((bd=(ButtonData*)tvi.lParam)&&(bd->fEntryOpType&QMF_EX_SEPARATOR)) bAsChild = FALSE; } if(TreeView_GetParent(hMenuTree,hti.hItem)) bAsChild = FALSE; MoveItem( hDragItem, htiAfter?htiAfter:hti.hItem, bAsChild ); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); drag=0; } break; /////////////////////////////////// //From UserInfoEx by DeathAxe // case WM_MOUSEMOVE: { if (!drag) break; { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(lparam); hti.pt.y=(short)HIWORD(lparam); ClientToScreen(hdlg,&hti.pt); ScreenToClient(hMenuTree,&hti.pt); TreeView_HitTest(hMenuTree,&hti); if ( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT )) { RECT rc; BYTE height; if ( TreeView_GetItemRect(hMenuTree, hti.hItem, &rc, FALSE )) { height = ( BYTE )( rc.bottom - rc.top ); if ( hti.pt.y - ( height / 3 ) < rc.top ) { SetCursor( LoadCursor( NULL, IDC_ARROW )); TreeView_SetInsertMark( hMenuTree, hti.hItem, 0 ); } else if ( hti.pt.y + ( height / 3 ) > rc.bottom ) { SetCursor( LoadCursor( NULL, IDC_ARROW )); TreeView_SetInsertMark( hMenuTree, hti.hItem, 1 ); } else { TreeView_SetInsertMark( hMenuTree, NULL, 0 ); SetCursor( LoadCursor( GetModuleHandle(NULL), MAKEINTRESOURCE( 183 )) ); } } } else { if ( hti.flags & TVHT_ABOVE ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEUP, 0 ), 0 ); if ( hti.flags & TVHT_BELOW ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEDOWN, 0 ), 0 ); TreeView_SetInsertMark( hMenuTree, NULL, 0 ); } } }break; ///////////// case WM_DESTROY: if (g_varhelpDlg) DestroyWindow(g_varhelpDlg); g_varhelpDlg=NULL; break; case WM_NOTIFY: switch(((LPNMHDR)lparam)->idFrom) { case 0: if (((LPNMHDR)lparam)->code == PSN_APPLY ) { if (!bNeedRestart){ SetMenuEntryProperties(hdlg); SaveMenuTree(hdlg); } db_set_b(NULL,PLGNAME,"RClickAuto",(BYTE)(g_bRClickAuto=IsDlgButtonChecked(hdlg,IDC_RAUTOSEND))); db_set_b(NULL,PLGNAME,"LClickAuto",(BYTE)(g_bLClickAuto=IsDlgButtonChecked(hdlg,IDC_LAUTOSEND))); db_set_b(NULL,PLGNAME,"QuickMenu",(BYTE)(g_bQuickMenu=IsDlgButtonChecked(hdlg,IDC_ENABLEQUICKMENU))); return 1; } else if (((LPNMHDR)lparam)->code == PSN_RESET ) { if (!bNeedRestart) RestoreModuleData(hdlg); return 1; } break; case IDC_MENUTREE: switch (((LPNMHDR)lparam)->code){ case TVN_KEYDOWN:{ TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); if ( pTVKeyDown->wVKey == VK_F2 ) TreeView_EditLabel(hMenuTree,TreeView_GetSelection(hMenuTree)); else if ( pTVKeyDown->wVKey == VK_DELETE ) SendMessage(hdlg,WM_COMMAND,IDC_MTREEREMOVE,0); }break; case TVN_BEGINLABELEDIT: hwndEdit=TreeView_GetEditControl(hMenuTree); mir_subclassWindow(hwndEdit, LabelEditSubclassProc); break; case TVN_ENDLABELEDIT: { TVITEM tvi; ButtonData* bd=NULL; TCHAR strbuf[256]; TCHAR szLabel[256]; tvi.pszText = strbuf; tvi.cchTextMax = _countof(strbuf); tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; tvi.hItem=TreeView_GetSelection(hMenuTree); TreeView_GetItem(hMenuTree,&tvi); GetWindowText(hwndEdit, szLabel, _countof(szLabel)); hwndEdit=NULL; if (!mir_tstrlen(szLabel)) break; if (bd = (ButtonData*)tvi.lParam){ if (!mir_tstrcmp(szLabel,_T("---"))) { if(TreeView_GetChild(hMenuTree,tvi.hItem)) break; else{ bd->fEntryOpType=QMF_EX_SEPARATOR; EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } } else { bd->fEntryOpType&=~QMF_EX_SEPARATOR; EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); SetDlgItemText(hdlg, IDC_MENUVALUE, bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); } bd->pszOpName=mir_tstrdup(szLabel); tvi.pszText=szLabel; TreeView_SetItem(hMenuTree, &tvi); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); } } break; case NM_KILLFOCUS: TreeView_EndEditLabelNow(hButtonsList, 1); break; case TVN_BEGINDRAG: SetCapture(hdlg); drag=1; hDragItem=((LPNMTREEVIEW)lparam)->itemNew.hItem; TreeView_SelectItem(hMenuTree,hDragItem); break; case TVN_SELCHANGING: { HTREEITEM hti = TreeView_GetSelection(hMenuTree); if (hti==NULL) break; TVITEM tvi; tvi.hItem=hti; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hMenuTree,&tvi); if (tvi.lParam == 0) break; ButtonData *bd = ( ButtonData* )tvi.lParam; if (bd) { TCHAR szValue[256]; GetDlgItemText(hdlg, IDC_MENUVALUE, szValue, _countof(szValue)); if(mir_tstrlen(szValue)) { if(bd->pszOpValue&&(bd->pszOpValue!=bd->pszValue)) mir_free(bd->pszOpValue); bd->pszOpValue=mir_tstrdup(szValue); } bd->bOpInQMenu=IsDlgButtonChecked(hdlg,IDC_INQMENU); bd->bIsOpServName=IsDlgButtonChecked(hdlg,IDC_ISSERVNAME); } } break; case TVN_SELCHANGED: { HTREEITEM hti = TreeView_GetSelection(hMenuTree); if (hti == NULL) break; TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(hMenuTree,&tvi); ButtonData *bd = ( ButtonData* )tvi.lParam; if (bd) { if (!TreeView_GetChild(hMenuTree, tvi.hItem)&&!(bd->fEntryOpType&QMF_EX_SEPARATOR)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),TRUE); SetDlgItemText(hdlg, IDC_MENUVALUE, bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); } else { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); if (!(bd->fEntryOpType&QMF_EX_SEPARATOR)) EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } CheckDlgButton(hdlg,IDC_INQMENU,bd->bOpInQMenu ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_ISSERVNAME,bd->bIsOpServName ? BST_CHECKED : BST_UNCHECKED); } } } break; case IDC_BUTTONSLIST: switch (((LPNMHDR)lparam)->code) { case TVN_KEYDOWN:{ TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); if ( pTVKeyDown->wVKey == VK_F2 ) TreeView_EditLabel(hButtonsList,TreeView_GetSelection(hButtonsList)); else if ( pTVKeyDown->wVKey == VK_DELETE ) SendMessage(hdlg,WM_COMMAND,IDC_BLISTREMOVE,0); }break; case TVN_BEGINLABELEDIT: hwndEdit = TreeView_GetEditControl(hButtonsList); mir_subclassWindow(hwndEdit, LabelEditSubclassProc); break; case TVN_ENDLABELEDIT: { TVITEM tvi; TCHAR strbuf[128]; TCHAR szLabel[128]; tvi.pszText = strbuf; tvi.cchTextMax = _countof(strbuf); tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; tvi.hItem=TreeView_GetSelection(hButtonsList); TreeView_GetItem(hButtonsList,&tvi); GetWindowText(hwndEdit, szLabel, _countof(szLabel)); hwndEdit=NULL; if (!mir_tstrlen(szLabel)) break; tvi.pszText=szLabel; ((ListData*)tvi.lParam)->dwOPFlags|=QMF_RENAMED; TreeView_SetItem(hButtonsList, &tvi); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); } break; case TVN_SELCHANGING: SetMenuEntryProperties(hdlg); break; case TVN_SELCHANGED: { HTREEITEM hti = TreeView_GetSelection(hButtonsList); if(hti==NULL||!TreeView_GetCount(hButtonsList)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); break; } TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(hButtonsList,&tvi); if(tvi.lParam==0) break; BuildMenuTree(hMenuTree,(SortedList *)((ListData*)tvi.lParam)->sl); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),TRUE); CheckDlgButton(hdlg,IDC_ISSERVNAME2,((ListData*)tvi.lParam)->bIsOpServName ? BST_CHECKED : BST_UNCHECKED); if (((ListData*)tvi.lParam)->ptszOPQValue) SetDlgItemText(hdlg, IDC_RCLICKVALUE, ((ListData*)tvi.lParam)->ptszOPQValue); else SetDlgItemText(hdlg, IDC_RCLICKVALUE, _T("")); } break; } break; } break; case WM_COMMAND: switch(LOWORD(wparam)) { case IDC_VARHELP: if (!g_varhelpDlg) g_varhelpDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_HELPDIALOG), 0, HelpDlgProc); else //ShowWindow(g_varhelpDlg,SW_SHOWDEFAULT); SetWindowPos(g_varhelpDlg,0,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE); break; case IDC_BLISTADD: { TVINSERTSTRUCT tvis; ListData* ld=NULL; TCHAR namebuff[MAX_PATH]={'\0'}; int count=TreeView_GetCount(hButtonsList); if (count>10) break; if(g_iOPButtonsCount==99){ MessageBox(NULL, TranslateT("Congratulation!\r\nYou have clicked this button 100 times!\r\nThere was access violation at this point...\r\nAnd now function for freeing resources must be called...\r\nBut no! there's only break :D"), TranslateT("You win!"),MB_OK); break; } ld = (ListData *)mir_alloc(sizeof(ListData)); ButtonsList[g_iOPButtonsCount++]=ld; ld->sl=List_Create(0,1); ld->dwOPFlags=QMF_NEW; ld->bIsOpServName=0; ld->ptszButtonName=NULL; ld->ptszOPQValue=NULL; ld->ptszQValue=NULL; tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; GetDlgItemText(hdlg, IDC_BUTTONNAME, namebuff, _countof(namebuff)); tvis.item.mask=TVIF_PARAM|TVIF_TEXT; tvis.item.pszText=(mir_tstrlen(namebuff))?namebuff:TranslateT("New Button"); tvis.item.lParam=(LPARAM)ld; TreeView_SelectItem(hButtonsList,TreeView_InsertItem(hButtonsList,&tvis)); }break; case IDC_BLISTREMOVE: { TVITEM tvi; ListData* ld; if (!(tvi.hItem=TreeView_GetSelection(hButtonsList))) break; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hButtonsList,&tvi); ld= (ListData*)tvi.lParam; ld->dwOPFlags|=QMF_DELETNEEDED; TreeView_DeleteItem(hButtonsList,tvi.hItem); if (!TreeView_GetCount(hButtonsList)) { TreeView_DeleteAllItems(hMenuTree); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); SetDlgItemText(hdlg, IDC_RCLICKVALUE, _T("")); } }break; case IDC_MTREEADD: { TVINSERTSTRUCT tvis; TVITEM tvi; ButtonData *bd=NULL; SortedList *sl=NULL; TCHAR namebuff[MAX_PATH]={'\0'}; if (!TreeView_GetCount(hButtonsList)) break; if (!(tvi.hItem=TreeView_GetSelection(hButtonsList))) break; bd = (ButtonData *)mir_alloc(sizeof(ButtonData)); memset(bd,0,sizeof(ButtonData)); GetDlgItemText(hdlg, IDC_MENUNAME, namebuff, _countof(namebuff)); bd->dwOPPos=TreeView_GetCount(hMenuTree)-1; bd->pszOpName=mir_tstrlen(namebuff)?mir_tstrdup(namebuff):mir_tstrdup(TranslateT("New Menu Entry")); bd->pszOpValue=mir_tstrdup(bd->pszOpName); bd->fEntryOpType=!mir_tstrcmp(namebuff,_T("---"))?QMF_EX_SEPARATOR:0; bd->dwOPFlags=QMF_NEW; bd->pszName=NULL; bd->pszValue=NULL; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hButtonsList,&tvi); sl=((ListData*)tvi.lParam)->sl; List_InsertPtr(sl,bd); tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask=TVIF_PARAM|TVIF_TEXT; tvis.item.pszText=bd->pszOpName; tvis.item.lParam=(LPARAM)bd; TreeView_SelectItem(hMenuTree,TreeView_InsertItem(hMenuTree,&tvis)); }break; case IDC_MTREEREMOVE: { TVITEM tvi; TVINSERTSTRUCT tvis; HTREEITEM hti=NULL; ButtonData *bd=NULL; tvi.mask=TVIF_HANDLE|TVIF_PARAM; if (!(tvi.hItem=TreeView_GetSelection(hMenuTree))) break; TreeView_GetItem(hMenuTree,&tvi); hti=tvi.hItem; bd= (ButtonData*)tvi.lParam; bd->dwOPFlags|=QMF_DELETNEEDED; if(tvi.hItem=TreeView_GetChild(hMenuTree,tvi.hItem)) { TCHAR strbuf[128]; while(tvi.hItem){ tvis.hInsertAfter=hti; tvi.pszText = strbuf; tvi.cchTextMax = _countof(strbuf); tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT; TreeView_GetItem(hMenuTree,&tvi); tvis.hParent=NULL; tvis.item=tvi; TreeView_InsertItem(hMenuTree,&tvis); tvi.hItem=TreeView_GetNextSibling(hMenuTree,tvi.hItem); } } TreeView_DeleteItem(hMenuTree,hti); if (!TreeView_GetCount(hMenuTree)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } }break; } break; case WM_CLOSE: EndDialog(hdlg,0); return 0; } if (HIWORD(wparam)==BN_CLICKED && GetFocus()==(HWND)lparam) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); else if ((HIWORD(wparam) == EN_CHANGE)&&(GetFocus()==(HWND)lparam)) if (!bOptionsInit) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); return 0; }
LRESULT MusicBrowserUI::TreeViewWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC lpOldProc = (WNDPROC)GetProp(hwnd, "oldproc" ); static bool dragging = false; static RECT dragRect; static HTREEITEM dragItem = NULL; static bool selectedOnMouseDown = false; //return CallWindowProc(lpOldProc, hwnd, msg, wParam, lParam ); switch(msg) { case WM_DESTROY: { // Put back old window proc and SetWindowLong( hwnd, GWL_WNDPROC, (DWORD)lpOldProc ); // remove window property RemoveProp( hwnd, "oldproc" ); RemoveProp( hwnd, "this" ); break; } case WM_MOUSEMOVE: { if(dragging) { if(wParam & MK_LBUTTON) { POINT dragPt; dragPt.x = LOWORD(lParam); dragPt.y = HIWORD(lParam); if( !PtInRect(&dragRect, dragPt) ) { SetCapture(NULL); dragging = false; NM_TREEVIEW nm_treeview; memset(&nm_treeview, 0x00, sizeof(NM_TREEVIEW)); nm_treeview.hdr.code = TVN_BEGINDRAG; nm_treeview.hdr.hwndFrom = hwnd; nm_treeview.hdr.idFrom = GetWindowLong(hwnd, GWL_ID); nm_treeview.itemNew.hItem = dragItem; nm_treeview.itemNew.mask = TVIF_STATE|TVIF_PARAM; nm_treeview.itemNew.stateMask = TVIS_BOLD|TVIS_CUT|TVIS_DROPHILITED|TVIS_EXPANDED|TVIS_SELECTED|TVIS_EXPANDEDONCE; TreeView_GetItem(hwnd, &nm_treeview.itemNew); nm_treeview.ptDrag.x = LOWORD(lParam); nm_treeview.ptDrag.y = HIWORD(lParam); SendMessage(GetParent(hwnd), WM_NOTIFY, (WPARAM)nm_treeview.hdr.idFrom, (LPARAM)&nm_treeview); return TRUE; } } } break; } case WM_RBUTTONDOWN: { SetFocus(hwnd); HTREEITEM item; TV_HITTESTINFO hti; hti.pt.x = LOWORD(lParam); hti.pt.y = HIWORD(lParam); item = TreeView_HitTest(hwnd, &hti); if(item && (hti.flags & TVHT_ONITEM)) { HTREEITEM focusItem = TreeView_GetSelection(hwnd); TV_ITEM tv_item; tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocusSelected = (tv_item.state & TVIS_SELECTED) != 0; tv_item.hItem = item; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocus = item == focusItem; bool wasSelected = (tv_item.state & TVIS_SELECTED) != 0; if(!wasSelected) { // need to iterate all the items and // make sure they aren't selected HTREEITEM rootItem = TreeView_GetRoot(hwnd); if(rootItem) { do { tv_item.hItem = rootItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = 0; TreeView_SetBranch(hwnd, &tv_item); }while(rootItem = TreeView_GetNextSibling(hwnd, rootItem)); } // need to set this back cause windows won't // set it if it is already the focus item and // we just deselected it if(wasSelected && wasFocus) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } } TreeView_Select(hwnd, item, TVGN_CARET); if(!wasFocus && wasFocusSelected && wasSelected) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } } //return TRUE; break; } case WM_RBUTTONUP: { break; } case WM_LBUTTONDBLCLK: { TV_ITEM tv_item; TV_HITTESTINFO tv_htinfo; KillTimer(hwnd, 1); //GetCursorPos(&tv_htinfo.pt); //ScreenToClient(m_hMusicView, &tv_htinfo.pt); tv_htinfo.pt.x = LOWORD(lParam); tv_htinfo.pt.y = HIWORD(lParam); if(TreeView_HitTest(m_hMusicView, &tv_htinfo) && (tv_htinfo.flags & TVHT_ONITEM)) { tv_item.hItem = TreeView_GetSelection(m_hMusicView); tv_item.mask = TVIF_PARAM | TVIF_HANDLE; tv_item.lParam = 0; TreeView_GetItem(m_hMusicView, &tv_item); TreeData* treedata = (TreeData*)tv_item.lParam; bool playNow; m_context->prefs->GetPrefBoolean(kPlayImmediatelyPref, &playNow); if(treedata && treedata->IsTrack()) { if(playNow && !m_pParent) { ClearPlaylistEvent(); } PlaylistItem *item; item = new PlaylistItem(*treedata->m_pTrack); m_plm->AddItem(item, false); } else if(treedata && treedata->IsPlaylist()) { if(playNow && !m_pParent) { ClearPlaylistEvent(); } m_plm->ReadPlaylist(treedata->m_oPlaylistPath.c_str()); } else if(treedata && treedata->IsPortable()) { EditPortablePlaylist(treedata->m_pPortable); } else if(treedata && treedata->IsStream()) { if(playNow && !m_pParent) { ClearPlaylistEvent(); } PlaylistItem *item; item = new PlaylistItem(*treedata->m_pStream); m_plm->AddItem(item, false); } else if(tv_htinfo.hItem == m_hNewPlaylistItem) { NewPlaylist(); } else if(tv_htinfo.hItem == m_hNewPortableItem) { m_context->target->AcceptEvent(new ShowPreferencesEvent(3)); } else if(tv_htinfo.hItem == m_hNewFavoritesItem) { NewFavoriteEvent(); } } break; } case WM_LBUTTONDOWN: { bool shiftKeyPressed = IsShiftDown(); bool ctrlKeyPressed = IsCtrlDown(); selectedOnMouseDown = false; SetFocus(hwnd); HTREEITEM item; TV_HITTESTINFO hti; hti.pt.x = LOWORD(lParam); hti.pt.y = HIWORD(lParam); int dx = GetSystemMetrics(SM_CXDRAG); int dy = GetSystemMetrics(SM_CYDRAG); dragRect.top = hti.pt.y - dy; dragRect.bottom = hti.pt.y + dy; dragRect.left = hti.pt.x - dx; dragRect.right = hti.pt.x + dx; item = TreeView_HitTest(hwnd, &hti); if(item && (hti.flags & TVHT_ONITEM)) { dragItem = item; HTREEITEM focusItem = TreeView_GetSelection(hwnd); TV_ITEM tv_item; tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocusSelected = (tv_item.state & TVIS_SELECTED) != 0; tv_item.hItem = item; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocus = item == focusItem; bool wasSelected = (tv_item.state & TVIS_SELECTED) != 0; HTREEITEM rootItem = TreeView_GetRoot(hwnd); selectedOnMouseDown = wasSelected && (CountSelectedItems(rootItem) == 1); if(ctrlKeyPressed) { /*TreeView_Select(hwnd, item, TVGN_CARET); if(focusItem) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); }*/ return TRUE; } else if(shiftKeyPressed) { // need to iterate all the items and // make sure they aren't selected HTREEITEM rootItem = TreeView_GetRoot(hwnd); if(rootItem) { do { tv_item.hItem = rootItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = 0; TreeView_SetBranch(hwnd, &tv_item); }while(rootItem = TreeView_GetNextSibling(hwnd, rootItem)); } HTREEITEM topItem = NULL; HTREEITEM bottomItem = NULL; HTREEITEM dummyItem = NULL; dummyItem = focusItem; // which item is above the other? search downward first while(dummyItem = TreeView_GetNextSibling(hwnd, dummyItem)) { if(dummyItem == item) { topItem = focusItem; bottomItem = item; break; } } // did we find out? no? search upward next if(!topItem) { dummyItem = focusItem; // which item is above the other? search downward first while(dummyItem = TreeView_GetPrevSibling(hwnd, dummyItem)) { if(dummyItem == item) { topItem = item; bottomItem = focusItem; break; } } } // if they are not siblings then we do not support shift // selection so just pass it on if(topItem) { // need to iterate all the items and // select them rootItem = topItem; do { tv_item.hItem = rootItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetBranch(hwnd, &tv_item); }while(rootItem != bottomItem && (rootItem = TreeView_GetNextSibling(hwnd, rootItem))); return TRUE; } break; } else { if(!wasSelected) { // need to iterate all the items and // make sure they aren't selected HTREEITEM rootItem = TreeView_GetRoot(hwnd); if(rootItem) { do { tv_item.hItem = rootItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = 0; TreeView_SetBranch(hwnd, &tv_item); }while(rootItem = TreeView_GetNextSibling(hwnd, rootItem)); } // need to set this back cause windows won't // set it if it is already the focus item and // we just deselected it if(wasSelected && wasFocus) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } } TreeView_Select(hwnd, item, TVGN_CARET); if(!wasFocus && wasFocusSelected && wasSelected) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } } SetCapture(hwnd); dragging = true; return TRUE; } break; } case WM_TIMER: { KillTimer(hwnd, 1); EditItemLabel(hwnd, g_editItem); break; } case WM_LBUTTONUP: { bool shiftKeyPressed = IsShiftDown(); bool ctrlKeyPressed = IsCtrlDown(); SetCapture(NULL); dragging = false; HTREEITEM item; TV_HITTESTINFO hti; hti.pt.x = LOWORD(lParam); hti.pt.y = HIWORD(lParam); item = TreeView_HitTest(hwnd, &hti); if(item && (hti.flags & TVHT_ONITEM)) { HTREEITEM focusItem = TreeView_GetSelection(hwnd); TV_ITEM tv_item; tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocusSelected = (tv_item.state & TVIS_SELECTED) != 0; tv_item.hItem = item; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; TreeView_GetItem(hwnd, &tv_item); bool wasFocus = item == focusItem; bool wasSelected = (tv_item.state & TVIS_SELECTED) != 0; if(ctrlKeyPressed) { TreeView_Select(hwnd, item, TVGN_CARET); if(wasSelected) { tv_item.hItem = item; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = 0; TreeView_SetItem(hwnd, &tv_item); } if(!wasFocus && wasFocusSelected || !wasSelected) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } return TRUE; } else if(!shiftKeyPressed) { // need to iterate all the items and // make sure they aren't selected HTREEITEM rootItem = TreeView_GetRoot(hwnd); if(rootItem) { do { tv_item.hItem = rootItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = 0; TreeView_SetBranch(hwnd, &tv_item); }while(rootItem = TreeView_GetNextSibling(hwnd, rootItem)); } // need to set this back cause windows won't // set it if it is already the focus item and // we just deselected it if(wasSelected && wasFocus) { tv_item.hItem = focusItem; tv_item.mask = TVIF_STATE; tv_item.stateMask = TVIS_SELECTED; tv_item.state = TVIS_SELECTED; TreeView_SetItem(hwnd, &tv_item); } if(selectedOnMouseDown) { if(g_editItem != item) { // i should do this in the notify but it is ignoring me if(item != m_hMyMusicItem && item != m_hPlaylistItem && item != m_hAllItem && item != m_hUncatItem && item != m_hNewPlaylistItem && item != m_hStreamsItem && item != m_hFavoritesItem && item != m_hNewFavoritesItem && item != m_hPortableItem && TreeView_GetParent(m_hMusicView, item) != m_hPortableItem && item != m_hCDItem && TreeView_GetParent(m_hMusicView, item) != m_hCDItem) { // pause a half sec so this does not // look so jarring //Sleep(500); SetTimer(hwnd, 1, GetDoubleClickTime(), NULL); g_editItem = item; //EditItemLabel(hwnd, item); } } else { g_editItem = NULL; } } } } break; } case WM_SETFOCUS: case WM_KILLFOCUS: { UpdateButtonStates(); InvalidateRect(hwnd, NULL, TRUE); break; } } // Pass all non-custom messages to old window proc return CallWindowProc(lpOldProc, hwnd, msg, wParam, lParam ); }