INT_PTR ACheatInfoDlg::OnLButtonUp(int key,int x,int y) { if(m_bDragging){ ImageList_DragLeave(m_CheatsList->GetHwnd()); ImageList_EndDrag(); ReleaseCapture(); POINT pt={x,y}; ::ClientToScreen(this->GetHwnd(),&pt); ::ScreenToClient(m_CheatsList->GetHwnd(),&pt); LVHITTESTINFO lvht={0}; int iItem = -1; lvht.pt = pt; if((iItem=m_CheatsList->HitTest(&lvht))!=-1 && lvht.flags&LVHT_ONITEM) { m_CheatsList->SetItemState(-1,0,LVIS_SELECTED); m_CheatsList->SetItemState(iItem,LVIS_SELECTED,LVIS_SELECTED); MoveItemToAnotherPlace(m_iDraggingItem,iItem); m_pFile->bNeedSaving = true; } m_bDragging = false; } return 0; }
//---------------------------------------------------------------------------------------------- // ON CLOSE WINDOW //---------------------------------------------------------------------------------------------- void cScrobMgrIm::on_close_window() { ReleaseCapture(); ImageList_EndDrag(); ImageList_DragLeave ( hwnd ); ScrobList.rem_del_all(); pHitScrob = 0; }
bool wxDragImage::Hide() { wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in Hide.")); HWND hWnd = 0; if (m_window && !m_fullScreen) hWnd = (HWND) m_window->GetHWND(); bool ret = (ImageList_DragLeave( hWnd ) != 0); return ret; }
void Filesets_ContinueDrag (HWND hDlg) { if (l.fDragging) { LPIDENT lpi = NULL; HLISTITEM hItemTarget; DWORD dw = GetMessagePos(); POINT pt = { LOWORD(dw), HIWORD(dw) }; HWND hTarget = WindowFromPoint (pt); if (hTarget != NULL) { POINT ptClient = pt; ScreenToClient (hTarget, &ptClient); if ((lpi = IdentifyPoint (hTarget, ptClient, &hItemTarget)) != NULL) { if (!lpi->fIsServer() && !lpi->fIsAggregate()) lpi = NULL; } } if (lpi != l.lpiTarget) { ImageList_DragLeave (NULL); if (l.hItemTarget) { LPARAM dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget); FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT)); l.hItemTarget = NULL; l.lpiTarget = NULL; } if ((l.lpiTarget = lpi) != NULL) { l.hwndTarget = hTarget; l.hItemTarget = hItemTarget; LPARAM dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget); FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags | FLIF_DROPHIGHLIGHT); } ScreenToClient (NULL, &pt); ImageList_DragEnter (NULL, pt.x, pt.y); } ImageList_DragMove (LOWORD(dw), HIWORD(dw)); } }
//---------------------------------------------------------------------------------------------- // ON MOUSE LEFT UP //---------------------------------------------------------------------------------------------- void cScrobMgrIm :: on_mouse_left_up ( int x, int y ) { if ( ! pHitScrob ) return; ImageList_EndDrag(); ImageList_DragLeave ( hwnd ); ReleaseCapture(); pHitScrob->Pos.x = x - HotSpot.x; pHitScrob->Pos.y = y - HotSpot.y; adjust_position_after_drag ( pHitScrob ); #if 0 if ( bMagnetismIsOn ) do_magnetism ( pHitScrob ); if ( bCollisionDetectionIsOn ) { int iQty = this->ScrobList.qty(); for ( int i = 0; i < iQty ; i++ ) { do_collision_detection ( pHitScrob ); } } #endif pHitScrob = 0; // I'm repainting all of them because with MouseOver window, // moving one can change the colors of the others, but in // general it would be necessary only to repaint pHitScrob, // so really the next bit should be in an override in a // a derived class for ( cScrobIm * s = ScrobList.pHead; s; s = s->pNext ) { RECT r; InvalidateRect ( hwnd, s->get_rect(&r), FALSE ); UpdateWindow ( hwnd ); } }
void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu) { if (l.fDragging) { Filesets_ContinueDrag (hDlg); ReleaseCapture(); l.fDragging = FALSE; ImageList_EndDrag (); ImageList_DragLeave (NULL); ShowCursor (TRUE); if (l.lpiTarget != NULL) { if (!fDropped) { Filesets_CancelDrag (hDlg); } else if (fDropped && !fMenu) { SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_MOVEHERE, 0); Filesets_CancelDrag (hDlg); } else // (fDropped && fMenu) { DWORD dw = GetMessagePos(); POINT pt = { LOWORD(dw), HIWORD(dw) }; LPMENUTASK lpp = New (MENUTASK); lpp->hParent = GetDlgItem (hDlg, IDC_SET_LIST); lpp->ptScreen = pt; lpp->lpi = l.lpiDrag; StartTask (taskSET_DRAGMENU, hDlg, lpp); } } } }
static void Main_EndDrag(void)//HWND hwndTV, LPNMTREEVIEW lpnmtv) { INT iIndex; CHAR szServ[80]; //static EHDRAGDROP EhDD; //ImageList_DragLeave(NULL); ImageList_DragLeave(hDragWnd); ImageList_EndDrag(); ReleaseCapture(); //ShowCursor(TRUE); fDragging = FALSE; // Genero il messaggio di Drag&Drop iIndex=TVFind(TV_FINDHWND,hDragWnd); ZeroFill(EhDD); EhDD.hDrag=hDragItem; EhDD.hDrop=hDropItem; OBJ_key=(LONG) &EhDD; sprintf(szServ,"%sDD",TVList[iIndex].lpObj->nome); obj_addevent(szServ); }
PGPError PGPgmExport PGPgmDefaultNotificationProc ( HGROUPMAN hGM, LPARAM lParam) { PGROUPMAN pGM = (PGROUPMAN)hGM; HTLITEM hFocused; BOOL bMultiple; INT i, iField; POINT pt; if (!hGM) return kPGPError_BadParams; switch (((LPNM_TREELIST)lParam)->hdr.code) { case TLN_SELCHANGED : bMultiple = (((LPNM_TREELIST)lParam)->flags & TLC_MULTIPLE); hFocused = ((LPNM_TREELIST)lParam)->itemNew.hItem; GMSetFocus (pGM, hFocused, bMultiple); ((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM); break; case TLN_ITEMDBLCLICKED : if (PGPgmIsActionEnabled (hGM, GM_PROPERTIES)) { PGPgmPerformAction (hGM, GM_LOCATEKEYS); PGPkmPerformAction (pGM->hKM, KM_PROPERTIES); } break; case TLN_DRAGGEDOVER : hFocused = ((LPNM_TREELIST)lParam)->itemNew.hItem; if (GMFocusedItem (pGM) != hFocused) { GMSetFocus (pGM, hFocused, FALSE); ((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM); ImageList_DragLeave (pGM->hWndParent); InvalidateRect (pGM->hWndTree, NULL, TRUE); UpdateWindow (pGM->hWndTree); ImageList_DragEnter (pGM->hWndParent, 0, 0); } pt = ((LPNM_TREELIST)lParam)->ptDrag; MapWindowPoints (pGM->hWndTree, pGM->hWndParent, &pt, 1); ImageList_DragMove (pt.x + pGM->iXCursorOffset, pt.y + pGM->iYCursorOffset); break; case TLN_AUTOSCROLLED : ImageList_DragLeave (pGM->hWndParent); InvalidateRect (pGM->hWndTree, NULL, TRUE); UpdateWindow (pGM->hWndTree); ImageList_DragEnter (pGM->hWndParent, 0, 0); break; case TLN_KEYDOWN : switch (((TL_KEYDOWN*)lParam)->wVKey) { case VK_DELETE : GMDeleteObject (pGM); break; } break; case TLN_CONTEXTMENU : ((LPNM_TREELIST)lParam)->flags = GMSelectedFlags (pGM); break; case TLN_HEADERREORDERED : sReorderColumns (pGM); break; case TLN_BEGINDRAG : pGM->hFocusedItemDragging = GMFocusedItem (pGM); GMEnableDropTarget (pGM->pDropTarget, FALSE); sBeginDrag (pGM); break; case TLN_DROP : if (((LPNM_TREELIST)lParam)->index) { GMAddSelectedToFocused (pGM); } sEndDrag (pGM); GMEnableDropTarget (pGM->pDropTarget, TRUE); GMSetFocus (pGM, pGM->hFocusedItemDragging, FALSE); break; case TLN_HEADERCLICKED : i = pGM->lKeyListSortField; iField = pGM->wColumnField[((LPNM_TREELIST)lParam)->index]; switch (iField) { case GMI_NAME : if (pGM->lKeyListSortField == kPGPUserIDOrdering) i = kPGPReverseUserIDOrdering; else i = kPGPUserIDOrdering; break; case GMI_VALIDITY : if (pGM->lKeyListSortField == kPGPValidityOrdering) i = kPGPReverseValidityOrdering; else i = kPGPValidityOrdering; break; default : break; } if (i != pGM->lKeyListSortField) { pGM->lKeyListSortField = i; TreeList_DeleteTree (pGM->hWndTree, FALSE); InvalidateRect (pGM->hWndTree, NULL, TRUE); UpdateWindow (pGM->hWndTree); GMSortGroupSet (pGM); GMLoadGroupsIntoTree (pGM, TRUE, FALSE, FALSE); InvalidateRect (pGM->hWndTree, NULL, TRUE); } break; } return 0; }
static VOID sEndDrag (PGROUPMAN pGM) { ImageList_DragLeave (pGM->hWndParent); ImageList_EndDrag (); }
BOOL CALLBACK TabCtrlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { struct TabCtrlData *dat; dat = (struct TabCtrlData *) GetWindowLong(hwnd, GWL_USERDATA); switch(msg) { case WM_MBUTTONDOWN: { TCITEM tci; int tabId; struct MessageWindowData *mwd; TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >= 0) { tci.mask = TCIF_PARAM; TabCtrl_GetItem(hwnd, tabId, &tci); mwd = (struct MessageWindowData *) tci.lParam; if (mwd != NULL) { SendMessage(mwd->hwnd, WM_CLOSE, 0, 0); } } return TRUE; } case WM_LBUTTONDBLCLK: { TCHITTESTINFO thinfo; int tabId; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >=0 ) { void * clickChild = GetChildFromTab(hwnd, tabId)->hwnd; if (clickChild == dat->lastClickChild) { SendMessage(clickChild, WM_CLOSE, 0, 0); } } dat->lastClickChild = NULL; } break; case WM_LBUTTONDOWN: { if (!dat->bDragging) { FILETIME ft; TCHITTESTINFO thinfo; GetSystemTimeAsFileTime(&ft); thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; dat->srcTab = dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (dat->srcTab >=0 ) { dat->lastClickChild = GetChildFromTab(hwnd, dat->srcTab)->hwnd; } else { dat->lastClickChild = NULL; } dat->bDragging = TRUE; dat->bDragged = FALSE; dat->clickLParam = lParam; dat->clickWParam = wParam; dat->lastClickTime = ft.dwLowDateTime; dat->mouseLBDownPos.x = thinfo.pt.x; dat->mouseLBDownPos.y = thinfo.pt.y; SetCapture(hwnd); return 0; } } break; case WM_CAPTURECHANGED: case WM_LBUTTONUP: if (dat->bDragging) { TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; if (dat->bDragged) { ImageList_DragLeave(GetDesktopWindow()); ImageList_EndDrag(); ImageList_Destroy(dat->hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (thinfo.flags != TCHT_NOWHERE && dat->destTab != dat->srcTab) { NMHDR nmh; TCHAR sBuffer[501]; TCITEM item; int curSel; curSel = TabCtrl_GetCurSel(hwnd); item.mask = TCIF_IMAGE | TCIF_PARAM | TCIF_TEXT; item.pszText = sBuffer; item.cchTextMax = sizeof(sBuffer)/sizeof(TCHAR); TabCtrl_GetItem(hwnd, dat->srcTab, &item); sBuffer[sizeof(sBuffer)/sizeof(TCHAR)-1] = '\0'; if (curSel == dat->srcTab) { curSel = dat->destTab; } else { if (curSel > dat->srcTab && curSel <= dat->destTab) { curSel--; } else if (curSel < dat->srcTab && curSel >= dat->destTab) { curSel++; } } TabCtrl_DeleteItem(hwnd, dat->srcTab); TabCtrl_InsertItem(hwnd, dat->destTab, &item ); TabCtrl_SetCurSel(hwnd, curSel); nmh.hwndFrom = hwnd; nmh.idFrom = GetDlgCtrlID(hwnd); nmh.code = TCN_SELCHANGE; SendMessage(GetParent(hwnd), WM_NOTIFY, nmh.idFrom, (LPARAM)&nmh); UpdateWindow(hwnd); } } else { SendMessage(hwnd, WM_LBUTTONDOWN, dat->clickWParam, dat->clickLParam); } dat->bDragged = FALSE; dat->bDragging = FALSE; ReleaseCapture(); }
LRESULT CVideoMarkup::OnButtonUp( UINT, WPARAM, LPARAM lParam, BOOL&) { POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); if (draggingIcon) { // we just completed an icon drag // End the drag-and-drop process draggingIcon = FALSE; ImageList_DragLeave(m_sampleListView); ImageList_EndDrag(); ImageList_Destroy(hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); ReleaseCapture(); // Determine the position of the drop point LVHITTESTINFO lvhti; lvhti.pt = p; ClientToScreen(&lvhti.pt); ::ScreenToClient(m_sampleListView, &lvhti.pt); ListView_HitTestEx(m_sampleListView, &lvhti); CRect posRect, negRect, motionRect, rangeRect; ListView_GetGroupRect(m_sampleListView, GROUPID_POSSAMPLES, LVGGR_GROUP, &posRect); ListView_GetGroupRect(m_sampleListView, GROUPID_NEGSAMPLES, LVGGR_GROUP, &negRect); ListView_GetGroupRect(m_sampleListView, GROUPID_MOTIONSAMPLES, LVGGR_GROUP, &motionRect); ListView_GetGroupRect(m_sampleListView, GROUPID_RANGESAMPLES, LVGGR_GROUP, &rangeRect); int newGroupId; if (posRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_POSSAMPLES; else if (negRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_NEGSAMPLES; else if (motionRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_MOTIONSAMPLES; else if (rangeRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_RANGESAMPLES; else newGroupId = GROUPID_TRASH; // update group membership of selected items based on drop location int numSelected = ListView_GetSelectedCount(m_sampleListView); int iSelection = -1; for (int iIndex=0; iIndex<numSelected; iIndex++) { // retrieve the selected item LVITEM lvi; iSelection = ListView_GetNextItem(m_sampleListView, iSelection, LVNI_SELECTED); lvi.mask = LVIF_IMAGE | LVIF_STATE | LVIF_GROUPID; lvi.state = 0; lvi.stateMask = 0; lvi.iItem = iSelection; lvi.iSubItem = 0; ListView_GetItem(m_sampleListView, &lvi); // Get the ID of this selected item UINT sampleId = ListView_MapIndexToID(m_sampleListView, iSelection); // test if this is an allowable group membership change int origGroupId = sampleSet.GetOriginalSampleGroup(sampleId); if (!GroupTransitionIsAllowed(origGroupId, newGroupId)) { // this is not a valid change so we'll move to the next item continue; } // update sample group in training set sampleSet.SetSampleGroup(sampleId, newGroupId); // Update item in list view with new group id lvi.iGroupId = newGroupId; ListView_SetItem(m_sampleListView, &lvi); } m_sampleListView.Invalidate(FALSE); } else if (m_videoLoader.videoLoaded && selectingRegion) { // we just finished drawing a selection ClipCursor(NULL); // restore full cursor movement if (!m_videoRect.PtInRect(p)) { InvalidateRect(&m_videoRect,FALSE); return 0; } selectingRegion = false; Rect selectRect; selectRect.X = (INT) min(selectStart.X, selectCurrent.X); selectRect.Y = (INT) min(selectStart.Y, selectCurrent.Y); selectRect.Width = (INT) abs(selectStart.X - selectCurrent.X); selectRect.Height = (INT) abs(selectStart.Y - selectCurrent.Y); Rect drawBounds(0,0,VIDEO_X,VIDEO_Y); selectRect.Intersect(drawBounds); double scaleX = ((double)m_videoLoader.videoX) / ((double)VIDEO_X); double scaleY = ((double)m_videoLoader.videoY) / ((double)VIDEO_Y); selectRect.X = (INT) (scaleX * selectRect.X); selectRect.Y = (INT) (scaleY * selectRect.Y); selectRect.Width = (INT) (scaleX * selectRect.Width); selectRect.Height = (INT) (scaleY * selectRect.Height); // discard tiny samples since they won't help if ((selectRect.Width > 10) && (selectRect.Height > 10)) { TrainingSample *sample; // if we're in motion mode, the behavior is a little special if (recognizerMode == MOTION_FILTER) { sample = new TrainingSample(m_videoLoader.copyFrame, m_videoLoader.GetMotionHistory(), m_sampleListView, m_hImageList, selectRect, GROUPID_MOTIONSAMPLES); } else { sample = new TrainingSample(m_videoLoader.copyFrame, m_sampleListView, m_hImageList, selectRect, currentGroupId); } sampleSet.AddSample(sample); } InvalidateRect(&m_videoRect, FALSE); } return 0; }
/*-------------------------------*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT komunikat, WPARAM wParam, LPARAM lParam) { static BOOL bDragging; static int poz; POINT pkt; HIMAGELIST hDragImgList; static NOTIFYICONDATA nim; switch (komunikat) { case WM_CREATE: HWND hToolTip; HFONT hFont; TOOLINFO tinf; RECT rect; /*-----tworzenie kontrolek-----*/ hList = CreateWindow("SysListView32", "lista_przyciskow", WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SINGLESEL,0,0,493,230,hWnd,NULL,hInst, NULL); hRefresh = CreateWindow("button", "Odœwie¿ listê", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 135, 232, 100, 20, hWnd, NULL, hInst, NULL); hShow = CreateWindow("button", "Poka¿ przycisk", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 15, 232, 100, 20,/*255, 232, 100, 20,*/ hWnd, NULL, hInst, NULL); hInfo = CreateWindow("button", "O programie...", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 375, 232, 100, 20, hWnd, NULL, hInst, NULL); /*-----tworzenie i ustawianie czcionki dla przycisków-----*/ hFont = CreateFont(14, 0, 0, 0, 0, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); SendMessage(hRefresh, WM_SETFONT, (WPARAM) hFont, true); SendMessage(hShow, WM_SETFONT, (WPARAM) hFont, true); SendMessage(hInfo, WM_SETFONT, (WPARAM) hFont, true); ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); /*-----ustawianie tooltipów-----*/ hToolTip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP | TTS_BALLOON, 0,0,0,0, hWnd, NULL, hInst, NULL); //Ustawianie parametrów wspó³nych dla ka¿dego tooltipa: tytu³, kolor. SendMessage(hToolTip, TTM_SETTITLE, TTI_INFO, (LPARAM)"Skrót"); SendMessage(hToolTip, TTM_SETTIPTEXTCOLOR, (LPARAM)RGB(0, 0, 100), 0); SendMessage(hToolTip, TTM_SETTIPBKCOLOR, (LPARAM)RGB(250, 250, 250), 0); GetClientRect (hWnd, &rect); tinf.cbSize = sizeof(TOOLINFO); tinf.uFlags = TTF_SUBCLASS; tinf.hinst = hInst; tinf.uId = 0; tinf.rect.left = rect.left; tinf.rect.top = rect.top; tinf.rect.right = rect.right; tinf.rect.bottom = rect.bottom; tinf.hwnd = hRefresh; tinf.lpszText = "F5"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); tinf.hwnd = hShow; tinf.lpszText = "dwuklik LPM"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); tinf.hwnd = hInfo; tinf.lpszText = "F1"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); /*-----ustawianie ikony programu w zasobniku systemowym-----*/ nim.cbSize = sizeof(NOTIFYICONDATA); nim.hWnd = hWnd; nim.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nim.hIcon = ikona; nim.uCallbackMessage = WM_TRAY; nim.uID = 7; lstrcpyn(nim.szTip, "Manipulator by FeniX", sizeof(nim.szTip)); Shell_NotifyIcon(NIM_ADD, &nim); refresh(); break; case WM_KEYUP: //obs³uga skrótów klawiaturowych dla konkretnych akcji switch (wParam) { case VK_F5: SendMessage(hRefresh, BM_CLICK, 0, 0); break; case VK_F1: SendMessage(hInfo, BM_CLICK, 0, 0); break; case VK_SPACE: SendMessage(hShow, BM_CLICK, 0, 0); break; case VK_ESCAPE: ShowWindow(hWnd, SW_MINIMIZE); break; } break; case WM_COMMAND: //obs³uga zdarzeñ okien pochodnych okna g³ównego switch (HIWORD(wParam)) { case BN_CLICKED: //komunikat klikniêcia przycisku if ((HWND)lParam == hRefresh) { refresh(); SetFocus(hList); } else if ((HWND)lParam == hInfo) { MessageBox(hWnd, "Autor:\nKonrad Gadzina <*****@*****.**>\n" "Grupa 1131, Informatyka, rok akad. 2008/2009" "\nPracownia In¿ynierii Oprogramowania M-74\n" "Instytut Informatyki Stosowanej\n" "Wydzia³ Mechaniczny, Politechnika Krakowska\nJêzyki i Techniki Programowania", "O programie", MB_OK); } else if ((HWND)lParam == hShow) { int poz; char buf[10]; bool hidden; TBBUTTON *ptbb, tbb; NOTIFYICONDATA fake; //potrzebne do "odswiezania" paska zadan i dopasowywania szerokosci przyciskow ptbb = (TBBUTTON*)VirtualAllocEx(proces, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); SendMessage(hPasek, TB_GETBUTTON, (WPARAM)poz, (LPARAM)ptbb); ReadProcessMemory(proces, (void*)ptbb, (void*)&tbb, sizeof(TBBUTTON), NULL); hidden = SendMessage(hPasek, TB_ISBUTTONHIDDEN, (WPARAM)tbb.idCommand, 0); SendMessage(hPasek, TB_HIDEBUTTON, (WPARAM)tbb.idCommand, (LPARAM)!hidden); if (hidden) SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Ukryj przycisk"); else SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Poka¿ przycisk"); /*---dodawanie i usuwanie ikony do zasobnika, by pasek zadañ siê "odœwie¿y³"---*/ fake.cbSize = sizeof(NOTIFYICONDATA); fake.hWnd = hWnd; fake.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; fake.hIcon = ikona; fake.uCallbackMessage = WM_TRAY; fake.uID = 19; lstrcpyn(fake.szTip, "Manipulator by FeniX", sizeof(fake.szTip)); Shell_NotifyIcon(NIM_ADD, &fake); Shell_NotifyIcon(NIM_DELETE, &fake); for (int i = 0; i<ile; i++) { SendMessage(hPasek, TB_GETBUTTON, (WPARAM)i, (LPARAM)ptbb); ReadProcessMemory(proces, (void*)ptbb, (void*)&tbb, sizeof(TBBUTTON), NULL); hidden = SendMessage(hPasek, TB_ISBUTTONHIDDEN, (WPARAM)tbb.idCommand, 0); if (!hidden) strcpy(buf, "[widoczny]"); else strcpy(buf, "[ukryty]"); ListView_SetItemText(hList, i, 1, buf); } SetFocus(hList); VirtualFreeEx(proces, ptbb, 0, MEM_RELEASE); } break; } break; case WM_TRAY: //obs³uga klikniêcia na ikonkê programu w zasobniku systemowym switch ((UINT)lParam) { case WM_LBUTTONDOWN: if (!IsWindowVisible(hWnd)) { if (IsZoomed(hWnd)) ShowWindow(hWnd, SW_MAXIMIZE); else ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); } else if (GetForegroundWindow() == hWnd) ShowWindow(hWnd, SW_HIDE); else SetForegroundWindow(hWnd); break; } break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) refresh(); break; case WM_SIZE: //zdarzenie zmienienia rozmiaru int szer, wys; if (wParam & SIZE_MINIMIZED) ShowWindow(hWnd, SW_HIDE); szer = (int)LOWORD(lParam); wys = (int)HIWORD(lParam ); /* Poni¿ze linijki pozwalaj¹ przestawiaæ kontrolki tak, by dopasowa ich pozycjê/rozmiar do rozmiaru okna g³ównego */ MoveWindow(hList, 0, 0, szer, wys-23, false); MoveWindow(hShow, 20, wys-21, 120, 20, false); MoveWindow(hRefresh, szer-310, wys-21, 120, 20, false); MoveWindow(hInfo, szer-140, wys-21, 120, 20, false); break; case WM_SIZING: //zdarzenie zmieniania rozmiaru RECT* rc; rc = (RECT*)lParam; /* Poni¿sze linie pozwalaj¹ ograniczyc rozmiar okna - jako, ¿e to zdarzenie jest wywo³ywane w trakcie zmiany rozmiaru, warunki s¹ sprawdzane nie po puszczeniu przycisku myszy, a jeszcze w trakcie jego trzymania. Dziêki temu okno nie nigdy nie bêdzie mia³o rozmiarów mniejszych ni¿ 500x100 pikseli. */ if (rc->right - rc->left <= 500) rc->right = rc->left + 500; if (rc->bottom - rc->top <= 100) rc->bottom = rc->top + 100; break; case WM_DESTROY: //zdarzenie niszczenia okna CloseHandle(proces); Shell_NotifyIcon(NIM_DELETE, &nim); PostQuitMessage(0); break; case WM_NOTIFY: //obs³uga komunikatów od kontrolki ListView if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == (unsigned int)NM_DBLCLK) SendMessage(hShow, BM_CLICK, 0, 0); else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == (unsigned int)NM_CLICK) { char buf[10]; int poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); ListView_GetItemText(hList, poz, 1, buf, 50); if (!strcmp(buf, "[ukryty]")) SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Poka¿ przycisk"); else SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Ukryj przycisk"); } else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == LVN_KEYDOWN) { switch (((LV_KEYDOWN*)lParam)->wVKey) { case VK_F5: SendMessage(hRefresh, BM_CLICK, 0, 0); break; case VK_F1: SendMessage(hInfo, BM_CLICK, 0, 0); break; case VK_SPACE: SendMessage(hShow, BM_CLICK, 0, 0); break; case VK_ESCAPE: ShowWindow(hWnd, SW_MINIMIZE); break; } } /*------------------- obs³uga drag & drop na liœcie z przyciskami -------------------*/ else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == LVN_BEGINDRAG) { //wiadomoœæ wysy³ana do okna g³ównego, gdy rozpoczynamy drag & drop na liœcie //czyli ³apiemy element lewym przyciskiem myszy HIMAGELIST hOneImageList, hTempImageList; IMAGEINFO imginf; int x = 0, wys; pkt.x = 1; pkt.y = 1; poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); //pobieranie indexu zaznaczonego elementu item.iItem = poz; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; //ustawienie maski elementu listy do pobrania ListView_GetItem(hList, &item); //pobieranie danego elementu do zmiennej item if (item.iIndent) //element z wciêciem nas nie interesuje break; hDragImgList = ListView_CreateDragImage(hList, poz, &pkt); //tworzenie "duszka" do d&d ImageList_GetImageInfo(hDragImgList, 0, &imginf); wys = imginf.rcImage.bottom; while(true) //dodawanie elementów danej grupy do "duszka" w pêtli { if (++item.iItem >= ile) break; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; //ustawianie maski pobierania danych elementu ListView_GetItem(hList, &item); if(item.iIndent == 0) //je¿eli napotkano kolejny przycisk grupowy trzeba przerwaæ break; hOneImageList = ListView_CreateDragImage(hList, item.iItem, &pkt); hTempImageList = ImageList_Merge(hDragImgList, 0, hOneImageList, 0, 0, wys); ImageList_Destroy(hDragImgList); ImageList_Destroy(hOneImageList); hDragImgList = hTempImageList; ImageList_GetImageInfo(hDragImgList, 0, &imginf); wys = imginf.rcImage.bottom; } item.iItem = poz; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; ListView_GetItem(hList, &item); ImageList_BeginDrag(hDragImgList, 0, x, 0); pkt = ((NM_LISTVIEW*) ((LPNMHDR)lParam))->ptAction; ClientToScreen(hList, &pkt); ImageList_DragEnter(GetDesktopWindow(), pkt.x, pkt.y); bDragging = true; SetCapture(hWnd); } break; case WM_MOUSEMOVE: //zdarzenie ruchu kursora myszy if (!bDragging) //je¿eli nie obs³gujemy akurat d&d na liœcie to nie trzeba nic robiæ break; pkt.x = LOWORD(lParam); pkt.y = HIWORD(lParam); ClientToScreen(hWnd, &pkt); ImageList_DragMove(pkt.x, pkt.y); break; case WM_LBUTTONUP: //zdarzenie puszczenia lewego przycisku myszy if (!bDragging) //je¿eli nie obs³gujemy akurat d&d na liœcie to nie trzeba nic robiæ break; LVHITTESTINFO lvhti; char buf[256], sub[12]; /*---puszczamy przycisk, wiêc przeci¹ganie siê koñczy---*/ bDragging = false; ImageList_DragLeave(hList); ImageList_EndDrag(); //ImageList_Destroy(hDragImgList); //nie wiem czemu, ale ta linia wywo³uje b³¹d segfault przy uruchomieniu debuggera ReleaseCapture(); /*---sprawdzanie, czy przeci¹gany element zosta³ upuszczony na inny element listy---*/ lvhti.pt.x = LOWORD(lParam); lvhti.pt.y = HIWORD(lParam); ClientToScreen(hWnd, &lvhti.pt); ScreenToClient(hList, &lvhti.pt); ListView_HitTest(hList, &lvhti); if (lvhti.iItem == -1) break; if ((lvhti.flags & LVHT_ONITEMLABEL == 0) && (lvhti.flags & LVHT_ONITEMSTATEICON == 0)) break; if (!item.iIndent) //je¿eli wciêcie = 0, to znaczy ¿e zajmujemy siê przyciskiem "grupowym" { poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); if (lvhti.iItem > poz) lvhti.iItem++; while (true) { if (lvhti.iItem == poz || lvhti.iItem > ile-1 || lvhti.iItem < 0) break; item.iItem = lvhti.iItem; item.iSubItem = 0; item.mask = LVIF_STATE | LVIF_IMAGE | LVIF_INDENT | LVIF_TEXT | LVIF_PARAM; item.stateMask = LVIS_SELECTED; ListView_GetItem(hList, &item); if (item.iIndent) { if (lvhti.iItem > poz) lvhti.iItem++; else if (lvhti.iItem < poz) lvhti.iItem--; } else { if (lvhti.iItem > poz) lvhti.iItem--; break; } } ListView_GetItemText(hList, poz, 0, buf, 256); //pobieranie tekstu danego elementu listy while (true) { int tmp = poz; item.iItem = poz; item.iSubItem = 0; item.cchTextMax = 256; item.pszText = buf; item.stateMask = ~LVIS_SELECTED; item.mask = LVIF_STATE | LVIF_IMAGE | LVIF_INDENT | LVIF_TEXT | LVIF_PARAM; ListView_GetItem(hList, &item); ListView_GetItemText(hList, poz, 1, sub, 12); SendMessage(hPasek, TB_MOVEBUTTON, (WPARAM)poz, (LPARAM)lvhti.iItem); if (lvhti.iItem > poz && lvhti.iItem < ile) lvhti.iItem++; item.iItem = lvhti.iItem; ListView_InsertItem(hList, &item); ListView_SetItemText(hList, item.iItem, 1, sub); if (lvhti.iItem < poz) poz++; ListView_DeleteItem(hList, poz); if (lvhti.iItem > tmp) lvhti.iItem--; if (lvhti.iItem < tmp) lvhti.iItem++; ListView_GetItemText(hList, poz, 0, buf, 256); item.iItem = poz; item.iSubItem = 0; item.cchTextMax = 256; item.pszText = buf; ListView_GetItem(hList, &item); if (!item.iIndent || poz > ile-1) //je¿eli break; } } break; default: return DefWindowProc(hWnd, komunikat, wParam, lParam); } return 0; }
INT_PTR CALLBACK DlgProcIconImport(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndParent, hwndDragOver; static int dragging; static int dragItem, dropHiLite; static HWND hPreview = NULL; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); hwndParent = (HWND)lParam; hPreview = GetDlgItem(hwndDlg, IDC_PREVIEW); dragging = dragItem = 0; ListView_SetImageList(hPreview, ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32|ILC_MASK, 0, 100), LVSIL_NORMAL); ListView_SetIconSpacing(hPreview, 56, 67); { RECT rcThis, rcParent; int cxScreen = GetSystemMetrics(SM_CXSCREEN); GetWindowRect(hwndDlg, &rcThis); GetWindowRect(hwndParent, &rcParent); OffsetRect(&rcThis, rcParent.right-rcThis.left, 0); OffsetRect(&rcThis, 0, rcParent.top-rcThis.top); GetWindowRect(GetParent(hwndParent), &rcParent); if (rcThis.right > cxScreen) { OffsetRect(&rcParent, cxScreen-rcThis.right, 0); OffsetRect(&rcThis, cxScreen-rcThis.right, 0); MoveWindow(GetParent(hwndParent), rcParent.left, rcParent.top, rcParent.right-rcParent.left, rcParent.bottom-rcParent.top, TRUE); } MoveWindow(hwndDlg, rcThis.left, rcThis.top, rcThis.right-rcThis.left, rcThis.bottom-rcThis.top, FALSE); GetClientRect(hwndDlg, &rcThis); SendMessage(hwndDlg, WM_SIZE, 0, MAKELPARAM(rcThis.right-rcThis.left, rcThis.bottom-rcThis.top)); } SHAutoComplete( GetDlgItem(hwndDlg, IDC_ICONSET), 1); SetDlgItemText(hwndDlg, IDC_ICONSET, _T("icons.dll")); return TRUE; case DM_REBUILDICONSPREVIEW: { MySetCursor(IDC_WAIT); ListView_DeleteAllItems(hPreview); HIMAGELIST hIml = ListView_GetImageList(hPreview, LVSIL_NORMAL); ImageList_RemoveAll(hIml); TCHAR filename[MAX_PATH], caption[64]; GetDlgItemText(hwndDlg, IDC_ICONSET, filename, SIZEOF(filename)); { RECT rcPreview, rcGroup; GetWindowRect(hPreview, &rcPreview); GetWindowRect( GetDlgItem(hwndDlg, IDC_IMPORTMULTI), &rcGroup); //SetWindowPos(hPreview, 0, 0, 0, rcPreview.right-rcPreview.left, rcGroup.bottom-rcPreview.top, SWP_NOZORDER|SWP_NOMOVE); } if ( _taccess(filename, 0) != 0) { MySetCursor(IDC_ARROW); break; } LVITEM lvi; lvi.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; lvi.iSubItem = 0; lvi.iItem = 0; int count = (int)_ExtractIconEx(filename, -1, 16, 16, NULL, LR_DEFAULTCOLOR); for (int i=0; i < count; lvi.iItem++, i++) { mir_sntprintf(caption, SIZEOF(caption), _T("%d"), i+1); lvi.pszText = caption; HICON hIcon; _ExtractIconEx(filename, i, 16, 16, &hIcon, LR_DEFAULTCOLOR); lvi.iImage = ImageList_AddIcon(hIml, hIcon); DestroyIcon(hIcon); lvi.lParam = i; ListView_InsertItem(hPreview, &lvi); } MySetCursor(IDC_ARROW); } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BROWSE: { TCHAR str[MAX_PATH], *file; GetDlgItemText(hwndDlg, IDC_ICONSET, str, SIZEOF(str)); if (!(file = OpenFileDlg(GetParent(hwndDlg), str, TRUE))) break; SetDlgItemText(hwndDlg, IDC_ICONSET, file); SAFE_FREE((void**)&file); } break; case IDC_GETMORE: OpenIconsPage(); break; case IDC_ICONSET: if (HIWORD(wParam) == EN_CHANGE) SendMessage(hwndDlg, DM_REBUILDICONSPREVIEW, 0, 0); break; } break; case WM_MOUSEMOVE: if (dragging) { LVHITTESTINFO lvhti; int onItem = 0; HWND hwndOver; RECT rc; POINT ptDrag; HWND hPPreview = GetDlgItem(hwndParent, IDC_PREVIEW); lvhti.pt.x = (short)LOWORD(lParam); lvhti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &lvhti.pt); hwndOver = WindowFromPoint(lvhti.pt); GetWindowRect(hwndOver, &rc); ptDrag.x = lvhti.pt.x - rc.left; ptDrag.y = lvhti.pt.y - rc.top; if (hwndOver != hwndDragOver) { ImageList_DragLeave(hwndDragOver); hwndDragOver = hwndOver; ImageList_DragEnter(hwndDragOver, ptDrag.x, ptDrag.y); } ImageList_DragMove(ptDrag.x, ptDrag.y); if (hwndOver == hPPreview) { ScreenToClient(hPPreview, &lvhti.pt); if (ListView_HitTest(hPPreview, &lvhti) != -1) { if (lvhti.iItem != dropHiLite) { ImageList_DragLeave(hwndDragOver); if (dropHiLite != -1) ListView_SetItemState(hPPreview, dropHiLite, 0, LVIS_DROPHILITED); dropHiLite = lvhti.iItem; ListView_SetItemState(hPPreview, dropHiLite, LVIS_DROPHILITED, LVIS_DROPHILITED); UpdateWindow(hPPreview); ImageList_DragEnter(hwndDragOver, ptDrag.x, ptDrag.y); } onItem = 1; } } if (!onItem && dropHiLite != -1) { ImageList_DragLeave(hwndDragOver); ListView_SetItemState(hPPreview, dropHiLite, 0, LVIS_DROPHILITED); UpdateWindow(hPPreview); ImageList_DragEnter(hwndDragOver, ptDrag.x, ptDrag.y); dropHiLite = -1; } MySetCursor(onItem ? IDC_ARROW : IDC_NO); } break; case WM_LBUTTONUP: if (dragging) { ReleaseCapture(); ImageList_EndDrag(); dragging = 0; if (dropHiLite != -1) { TCHAR path[MAX_PATH], fullPath[MAX_PATH], filename[MAX_PATH]; LVITEM lvi; GetDlgItemText(hwndDlg, IDC_ICONSET, fullPath, SIZEOF(fullPath)); PathToRelativeT(fullPath, filename); lvi.mask = LVIF_PARAM; lvi.iItem = dragItem; lvi.iSubItem = 0; ListView_GetItem(hPreview, &lvi); mir_sntprintf(path, SIZEOF(path), _T("%s,%d"), filename, (int)lvi.lParam); SendMessage(hwndParent, DM_CHANGEICON, dropHiLite, (LPARAM)path); ListView_SetItemState( GetDlgItem(hwndParent, IDC_PREVIEW), dropHiLite, 0, LVIS_DROPHILITED); } } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case IDC_PREVIEW: switch (((LPNMHDR)lParam)->code) { case LVN_BEGINDRAG: SetCapture(hwndDlg); dragging = 1; dragItem = ((LPNMLISTVIEW)lParam)->iItem; dropHiLite = -1; ImageList_BeginDrag(ListView_GetImageList(hPreview, LVSIL_NORMAL), dragItem, GetSystemMetrics(SM_CXICON)/2, GetSystemMetrics(SM_CYICON)/2); { POINT pt; RECT rc; GetCursorPos(&pt); GetWindowRect(hwndDlg, &rc); ImageList_DragEnter(hwndDlg, pt.x - rc.left, pt.y - rc.top); hwndDragOver = hwndDlg; } break; } break; } break; case WM_SIZE: // make the dlg resizeable if (!IsIconic(hwndDlg)) { UTILRESIZEDIALOG urd = {0}; urd.cbSize = sizeof(urd); urd.hInstance = hInst; urd.hwndDlg = hwndDlg; urd.lParam = 0; // user-defined urd.lpTemplate = MAKEINTRESOURCEA(IDD_ICOLIB_IMPORT); urd.pfnResizer = IconDlg_Resize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); } break; case WM_CLOSE: DestroyWindow(hwndDlg); EnableWindow( GetDlgItem(hwndParent, IDC_IMPORT), TRUE); break; } return FALSE; }
static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PROGGROUP* group; INT iItem; LVITEMW lvItem; POINT pt; group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); switch (uMsg) { case WM_NCCREATE: { LPCREATESTRUCTW pcs = (LPCREATESTRUCTW)lParam; LPMDICREATESTRUCTW pMDIcs = (LPMDICREATESTRUCTW)pcs->lpCreateParams; group = (PROGGROUP*)pMDIcs->lParam; SetWindowLongPtrW(hWnd, 0, (LONG_PTR)group); if (group->bIsCommonGroup) { DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, (LPARAM)CopyImage(Globals.hCommonGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_COPYFROMRESOURCE)); DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)CopyImage(Globals.hCommonGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE)); } else { DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, (LPARAM)CopyImage(Globals.hPersonalGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_COPYFROMRESOURCE)); DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)CopyImage(Globals.hPersonalGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE)); } break; } case WM_NCDESTROY: SetWindowLongPtrW(hWnd, 0, 0); break; case WM_CREATE: { DWORD dwStyle; RECT rect; GetClientRect(hWnd, &rect); group->hListView = CreateWindowW(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_OVERLAPPED, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hWnd, NULL, Globals.hInstance, NULL); dwStyle = (GetWindowLongPtrW(group->hListView, GWL_STYLE) | LVS_SHOWSELALWAYS) & ~LVS_AUTOARRANGE; SetWindowLongPtrW(group->hListView, GWL_STYLE, dwStyle); dwStyle = SendMessageA(group->hListView, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) | LVS_EX_BORDERSELECT; SendMessageA(group->hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_SNAPTOGRID, dwStyle); InitUxTheme(); SetWindowTheme(group->hListView, L"Explorer", NULL); group->hListLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_COLOR24 | ILC_MASK, 1, 1); SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, (LPARAM)group->hListLarge); SendMessageA(group->hListView, LVM_SETICONSPACING, 0, MAKELPARAM(80, 64)); break; } case WM_DESTROY: { SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, 0); ImageList_Destroy(group->hListLarge); DestroyWindow(group->hListView); break; } case WM_SIZE: { RECT rect; rect.left = 0; rect.top = 0; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); AdjustWindowRectEx(&rect, GetWindowLongPtrW(group->hListView, GWL_STYLE), FALSE, GetWindowLongPtrW(group->hListView, GWL_EXSTYLE)); MoveWindow(group->hListView, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); break; } case WM_CLOSE: SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); break; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) wParam = SC_MINIMIZE; break; case WM_CHILDACTIVATE: case WM_NCLBUTTONDOWN: Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); Globals.hActiveGroup->hActiveProgram = NULL; break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { iItem = ((LPNMITEMACTIVATE)lParam)->iItem; if (iItem == -1) { group->hActiveProgram = NULL; break; } lvItem.mask = LVIF_PARAM; lvItem.iItem = iItem; SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem); group->hActiveProgram = (PROGRAM*)lvItem.lParam; break; } case NM_DBLCLK: { iItem = ((LPNMITEMACTIVATE)lParam)->iItem; if (iItem == -1) break; lvItem.mask = LVIF_PARAM; lvItem.iItem = iItem; SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem); /* ... or use group->hActiveProgram */ PROGRAM_ExecuteProgram((PROGRAM*)lvItem.lParam); break; } case LVN_BEGINDRAG: { POINT ptMin; BOOL bFirst = TRUE; for (iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, -1, LVNI_SELECTED); iItem != -1; iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, iItem, LVNI_SELECTED)) { if (bFirst) { group->hDragImageList = (HIMAGELIST)SendMessageA(group->hListView, LVM_CREATEDRAGIMAGE, iItem, (LPARAM)&pt); ptMin = pt; bFirst = FALSE; } else { HIMAGELIST hOneImageList, hTempImageList; hOneImageList = (HIMAGELIST)SendMessageA(group->hListView, LVM_CREATEDRAGIMAGE, iItem, (LPARAM)&pt); hTempImageList = ImageList_Merge(group->hDragImageList, 0, hOneImageList, 0, pt.x - ptMin.x, pt.y - ptMin.y); ImageList_Destroy(group->hDragImageList); ImageList_Destroy(hOneImageList); group->hDragImageList = hTempImageList; ptMin.x = min(ptMin.x, pt.x); ptMin.y = min(ptMin.y, pt.y); } } // pt = ((LPNMLISTVIEW)lParam)->ptAction; pt.x = ((LPNMLISTVIEW)lParam)->ptAction.x; pt.y = ((LPNMLISTVIEW)lParam)->ptAction.y; group->ptStart = pt; pt.x -= ptMin.x; pt.y -= ptMin.y; ImageList_BeginDrag(group->hDragImageList, 0, pt.x, pt.y); MapWindowPoints(group->hListView, Globals.hMDIWnd, &pt, 1); ImageList_DragEnter(Globals.hMDIWnd, pt.x, pt.y); group->bDragging = TRUE; group->hOldCursor = GetCursor(); SetCapture(group->hWnd); break; } } break; case WM_MOUSEMOVE: if (group->bDragging) { pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); MapWindowPoints(group->hWnd, Globals.hMDIWnd, &pt, 1); ImageList_DragMove(pt.x, pt.y); } break; case WM_LBUTTONUP: if (group->bDragging) { // LVHITTESTINFO lvhti; POINT ptHit; group->bDragging = FALSE; ImageList_DragLeave(Globals.hMDIWnd); ImageList_EndDrag(); ImageList_Destroy(group->hDragImageList); ReleaseCapture(); SetCursor(group->hOldCursor); ptHit.x = GET_X_LPARAM(lParam); ptHit.y = GET_Y_LPARAM(lParam); MapWindowPoints(group->hWnd, group->hListView, &ptHit, 1); for (iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, -1, LVNI_SELECTED); iItem != -1; iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, iItem, LVNI_SELECTED)) { SendMessageA(group->hListView, LVM_GETITEMPOSITION, iItem, (LPARAM)&pt); pt.x += ptHit.x - group->ptStart.x; pt.y += ptHit.y - group->ptStart.y; SendMessageA(group->hListView, LVM_SETITEMPOSITION, iItem, MAKELPARAM(pt.x, pt.y)); } } break; } return DefMDIChildProcW(hWnd, uMsg, wParam, lParam); }