LRESULT CVideoMarkup::OnBeginDrag(int idCtrl, LPNMHDR pnmh, BOOL&) { POINT p; HIMAGELIST hImageListSingle, hImageListMerged; int numSelected = ListView_GetSelectedCount(m_sampleListView); int iSelection = -1; for (int iIndex=0; iIndex<numSelected; iIndex++) { iSelection = ListView_GetNextItem(m_sampleListView, iSelection, LVNI_SELECTED); if (iIndex == 0) { // first selected icon hDragImageList = ListView_CreateDragImage(m_sampleListView, iSelection, &p); } else { // subsequent icons hImageListSingle = ListView_CreateDragImage(m_sampleListView, iSelection, &p); hImageListMerged = ImageList_Merge(hDragImageList, 0, hImageListSingle, 0, iIndex*3, iIndex*3); ImageList_Destroy(hDragImageList); ImageList_Destroy(hImageListSingle); hDragImageList = hImageListMerged; } } ImageList_BeginDrag(hDragImageList, 0, LISTVIEW_SAMPLE_X/2, LISTVIEW_SAMPLE_Y/2); POINT pt = ((NM_LISTVIEW*)pnmh)->ptAction; RECT listViewRect; m_sampleListView.GetClientRect(&listViewRect); m_sampleListView.ClientToScreen(&pt); m_sampleListView.ClientToScreen(&listViewRect); ImageList_DragEnter(GetDesktopWindow(), pt.x, pt.y); draggingIcon = TRUE; SetCapture(); return 0; }
static VOID sBeginDrag (PGROUPMAN pGM) { HIMAGELIST hIml; TL_DRAGBITMAP tldb; NONCLIENTMETRICS ncm; // get offset number to convert client to window coordinates ncm.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); pGM->iXCursorOffset = ncm.iBorderWidth; pGM->iYCursorOffset = ncm.iBorderWidth + ncm.iCaptionHeight; if (GetMenu (pGM->hWndParent)) pGM->iYCursorOffset += ncm.iMenuHeight; GetCursorPos (&tldb.ptCursorPos); ScreenToClient (pGM->hWndTree, &tldb.ptCursorPos); tldb.ulFlags = 0; TreeList_RenderDragBitmap (pGM->hWndTree, &tldb); hIml = ImageList_Create (tldb.sizeDrag.cx, tldb.sizeDrag.cy, ILC_MASK|ILC_COLORDDB, 1, 1); ImageList_AddMasked (hIml, tldb.hbmDrag, GetSysColor (COLOR_WINDOW)); DeleteObject (tldb.hbmDrag); ImageList_BeginDrag (hIml, 0, tldb.ptHotSpot.x, tldb.ptHotSpot.y); ImageList_Destroy (hIml); ImageList_DragEnter (pGM->hWndParent, tldb.ptCursorPos.x, tldb.ptCursorPos.y); }
bool wxDragImage::Show() { wxASSERT_MSG( (m_hImageList != 0), wxT("Image list must not be null in Show.")); HWND hWnd = 0; if (m_window && !m_fullScreen) hWnd = (HWND) m_window->GetHWND(); bool ret = (ImageList_DragEnter( hWnd, m_position.x, m_position.y ) != 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 DOWN //---------------------------------------------------------------------------------------------- void cScrobMgrIm::on_mouse_left_down ( int x, int y ) { pHitScrob = get_hit_scrob ( x, y ); if ( 0 == pHitScrob ) return; ScrobList.remove ( pHitScrob ); ScrobList.append ( pHitScrob ); RECT rectHit; rectHit.left = pHitScrob->Pos.x; rectHit.top = pHitScrob->Pos.y; rectHit.right = pHitScrob->Pos.x + pHitScrob->Dim.x; rectHit.bottom = pHitScrob->Pos.y + pHitScrob->Dim.y; // InvalidateRect ( hwnd, &rectHit, FALSE ); // UpdateWindow ( hwnd ); SetCapture(hwnd); // Erase the image from the client area. // SendMessage ( hwnd, WM_SETREDRAW, 0, 0 ); // EXPERIMENTAL InvalidateRect ( hwnd, &rectHit, TRUE ); UpdateWindow ( hwnd ); // SendMessage ( hwnd, WM_SETREDRAW, 1, 0 ); // EXPERIMENTAL HotSpot.x = x - rectHit.left; HotSpot.y = y - rectHit.top; if ( ! ImageList_BeginDrag ( pHitScrob->hIL, pHitScrob->iImageIndex, HotSpot.x, HotSpot.y ) ) { pHitScrob = 0; ReleaseCapture(); return; } // Set the initial location of the image, and make it visible. // Because the ImageList_DragEnter function expects coordinates to // be relative to the upper-left corner of the given window, the // width of the border, title bar, and menu bar need to be taken // into account. get_client_offset ( &ClientOffset, hwnd ); ImageList_DragEnter ( hwnd, x + ClientOffset.x, y + ClientOffset.y ); return; }
void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp) { LPIDENT lpi = (LPIDENT)(ptp->lpUser); if (ptp->rc && TASKDATA(ptp)->fs.Type != ftCLONE) { HWND hList = GetDlgItem (hDlg, IDC_SET_LIST); HLISTITEM hItem = FL_GetSelected (hList); // When creating a drag image, we'll temporarily reset the object's // images so we can be sure it'll draw just the Fileset icon. // FastList_Begin (hList); int iImage1 = FastList_GetItemFirstImage (hList, hItem); int iImage2 = FastList_GetItemSecondImage (hList, hItem); FastList_SetItemFirstImage (hList, hItem, imageFILESET); FastList_SetItemSecondImage (hList, hItem, IMAGE_NOIMAGE); l.lpiDrag = lpi; l.lpiTarget = NULL; l.fDragging = TRUE; l.hDragImage = FastList_CreateDragImage (hList, hItem); FastList_SetItemFirstImage (hList, hItem, iImage1); FastList_SetItemSecondImage (hList, hItem, iImage2); FastList_End (hList); // Now we've got a drag image; start dragging. // ShowCursor (FALSE); SetCapture (hDlg); DWORD dw = GetMessagePos(); POINT pt = { LOWORD(dw), HIWORD(dw) }; ScreenToClient (NULL, &pt); ImageList_BeginDrag (l.hDragImage, 0, 8, 8); ImageList_DragEnter (NULL, pt.x, pt.y); } }
/* static DrawTheImage(HIMAGELIST himl) { HDC hDC; hDC=GetDC(NULL); ImageList_Draw(himl,0,hDC,0,0,ILD_NORMAL); ImageList_Draw(himl,1,hDC,20,0,ILD_NORMAL); ReleaseDC(NULL,hDC); } */ static void Main_OnBeginDrag(HWND hwndTV, LPNMTREEVIEW lpnmtv) { HIMAGELIST himl; // handle to image list RECT rcItem; // bounding rectangle of item // Tell the tree view control to create an image to use // for dragging. hDragWnd=hwndTV; himl = TreeView_CreateDragImage(hwndTV, lpnmtv->itemNew.hItem); // Real OK hDragItem=lpnmtv->itemNew.hItem; // Get the bounding rectangle of the item being dragged. TreeView_GetItemRect(hwndTV, lpnmtv->itemNew.hItem, &rcItem, TRUE); // Get the heading level and the amount that the child items are // indented. //dwLevel = 1;//lpnmtv->itemNew.lParam; //dwIndent = (DWORD) SendMessage(hwndTV, TVM_GETINDENT, 0, 0); //ImageList_SetDragCursorImage(himl,0,0,0); // Start the drag operation. //ShowCursor(FALSE); ImageList_BeginDrag(himl, 0, 0,0); // ImageList_DragEnter(NULL,0,0); ImageList_DragEnter(hDragWnd,0,0); //ImageList_DragShowNolock(TRUE); // Hide the mouse cursor, and direct mouse input to the // parent window. //DrawTheImage(himl); SetCapture(GetParent(hwndTV)); fDragging = TRUE; return; }
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; }
LRESULT CALLBACK WndProc( HWND hWnd, // window handle UINT message, // type of message WPARAM uParam, // additional information LPARAM lParam // additional information ) { FARPROC lpProcAbout; // pointer to the "About" function int wmId, wmEvent; //****************** NEW CODE START ********* #define ptrNMHDR ((LPNMHDR)lParam) #define ptrNM_TREEVIEW ((NM_TREEVIEW *)lParam) #define ptrTV_DISPINFO ((TV_DISPINFO *)lParam) RECT rcItem; static HIMAGELIST hDragImage; static BOOL bDragging; static HTREEITEM hDragItem; switch (message) { case WM_NOTIFY: // This is a new Chicago message for control // notifications switch (ptrNMHDR->code) { case TVN_BEGINDRAG: // Sent by TreeView when user // wants to drag an item. // Only allow drag & drop for the actual coaster // items. The "itemNew" field of the NM_TREEVIEW // structure contains the attribytes of the item // we are going to drag. Therefore, since we are // using the lParam field to store an ITEM_TYPE_* // value, we check that field. if ( ITEM_TYPE_COASTER_NAME == ptrNM_TREEVIEW->itemNew.lParam) { // The hDragImage variable is declared static, // so the code in WM_LBUTTONUP can delete it when // the user stops dragging. Here we create a // drag image to use for the ImageList_StartDrag // API. hDragImage = TreeView_CreateDragImage ( ptrNMHDR->hwndFrom, ptrNM_TREEVIEW->itemNew.hItem ); // Get the location of the item rectangle's text. TreeView_GetItemRect ( ptrNMHDR->hwndFrom, // Handle of TreeView ptrNM_TREEVIEW->itemNew.hItem, // Item in TreeView &rcItem, // RECT to store result TRUE // Rect of label text only ); // Cache away the handle of the item to drag into a // staticly declared variable, so the code in // WM_LBUTTONUP can know what the user is dragging. hDragItem = ptrNM_TREEVIEW->itemNew.hItem; // Start the drag ala ImageList ImageList_BeginDrag(hDragImage, 0, ptrNM_TREEVIEW->ptDrag.x - rcItem.left, // Offset hotspot ptrNM_TREEVIEW->ptDrag.y - rcItem.top); ImageList_DragEnter(ptrNMHDR->hwndFrom, ptrNM_TREEVIEW->ptDrag.x, // Coords of image to drag ptrNM_TREEVIEW->ptDrag.y); // Capture the mousey to this window ShowCursor ( FALSE ); SetCapture ( hWnd ); // Set a staticly declared drag flag so the WM_MOUSEMOVE // and WM_LBUTTONUP messages know to take action. bDragging = TRUE; } return 0L; // Return value is irrelevant case TVN_GETDISPINFO: // Sent by TreeView just before it paints // an item declared with callback values. // Our "state" items have the I_IMAGECALLBACK value // used for the iImage and iSelectedImage fields. This // TVN_GETDISPINFO code will be called whenever the // item is about to be drawn. It is out responsibility // to add code to fill in the images. The code below // uses a different image depending on if the item is // expanded or collapsed. That attribute is in the // state field of the item passed in the TV_DISPINFO // structure. // Our lParam is where we store what state the item // represents. Therefore, we will switch on that so // we can indicate the correct image to use. if ( ptrTV_DISPINFO->item.state & TVIS_EXPANDED ) { switch (ptrTV_DISPINFO->item.lParam) { case ITEM_TYPE_STATE_CA: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageCA_OPEN; break; case ITEM_TYPE_STATE_NY: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageNY_OPEN; break; case ITEM_TYPE_STATE_OH: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageOH_OPEN; break; } } else // Collapsed item { switch (ptrTV_DISPINFO->item.lParam) { case ITEM_TYPE_STATE_CA: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageCA; break; case ITEM_TYPE_STATE_NY: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageNY; break; case ITEM_TYPE_STATE_OH: ptrTV_DISPINFO->item.iImage = ptrTV_DISPINFO->item.iSelectedImage = iImageOH; break; } } return TRUE; case TVN_BEGINLABELEDIT: // Sent by TreeView when user single // clicks on an item in a TreeView // that has the TVS_EDITLABELS style // bit set. // Only allow label editing for the coaster names if (ITEM_TYPE_COASTER_NAME == ptrTV_DISPINFO->item.lParam) return 0; // Return 0 to OK edit else return 1; // Return non-zero to disallow edit break; case TVN_ENDLABELEDIT: // Sent by TreeView when user presses // the ENTER key or ESC key, to end // an in-place edit session. If the user // pressed the ESC key, the pszText // field of the item in the TV_DISPINFO // field is NULL. // if user pressed ENTER to accept edits if ( ptrTV_DISPINFO->item.pszText) { // Set the "change mask" to indicate that the only attribute // we wish to change is the text field. The TV_DISPINFO // structure has already been filled out with the new // text the user typed in, we just need to pass that on // to the TreeView control. This is our chance to evaluate // the contents of this field and change it. ptrTV_DISPINFO->item.mask = TVIF_TEXT; TreeView_SetItem ( ptrNMHDR->hwndFrom, // Handle of TreeView &(ptrTV_DISPINFO->item) // TV_ITEM structure w/changes ); } break; } return (DefWindowProc(hWnd, message, uParam, lParam)); case WM_MOUSEMOVE: // Since the mouse capture is set to this // window while we do our drag & drop, // we check for the drag flag and process // the WM_MOUSEMOVE message. if (bDragging) { HTREEITEM hTarget; // Item under mouse TV_HITTESTINFO tvht; // Used for hit testing // Do standard drag drop movement ImageList_DragMove ( LOWORD (lParam), HIWORD (lParam)); // Fill out hit test struct with mouse pos tvht.pt.x = LOWORD (lParam); tvht.pt.y = HIWORD (lParam); // Check to see if an item lives under the mouse if ( hTarget = TreeView_HitTest ( hWndTreeView, // This is the global variable &tvht // TV_HITTESTINFO struct ) ) { TV_ITEM tvi; // Temporary Item tvi.mask = TVIF_PARAM; // We want to fetch the // lParam field. tvi.hItem = hTarget; // Set the handle of the // item to fetch. TreeView_GetItem ( hWndTreeView, &tvi ); // Fetch, spot! // Check to see if the lParam is a valid item to drop // onto (in this case, another roller coaster, such as // the Coney Island Cyclone). Skip this operation if // the item is already selected (to avoid flicker) if ( ITEM_TYPE_COASTER_NAME == tvi.lParam ) { if ( hTarget != TreeView_GetDropHilight (hWndTreeView)) { // Hide the drag image ImageList_DragShowNolock ( FALSE ); //DragShow to DragShowNoLock lithangw // Select the item TreeView_SelectDropTarget ( hWndTreeView, hTarget ); // Show the drag image ImageList_DragShowNolock ( TRUE ); //DragShow to DragShowNoLock lithangw } return 0L; } } // If we made it here, then the user has either // dragged the mouse over an invalid item, or no item. // Hide any current drop target, this is a no-no drop ImageList_DragShowNolock ( FALSE ); //screen update problem tokuroy TreeView_SelectDropTarget ( hWndTreeView, NULL ); ImageList_DragShowNolock ( TRUE ); //screen update problem tokuroy } break; case WM_LBUTTONUP: // Since the mouse capture is set to this // window while we do our drag & drop, // we check for the drag flag and process // the WM_LBUTTONUP message. if (bDragging) { HTREEITEM hTarget; // Item under mouse TV_ITEM tvi; // Temporary Item TV_INSERTSTRUCT tvIns; // Insert struct char szBuffer[256]; // Item text buffer // End the drag ImageList_EndDrag(); // Bring back the cursor ShowCursor ( TRUE ); // Release the mouse capture ReleaseCapture(); // Clear the drag flag bDragging = FALSE; // Clean up the image list object ImageList_Destroy ( hDragImage ); hDragImage = NULL; // First, check to see if there is a valid drop point. // The cheezy way to do this is to check for a highlighted // drop target, since the logic to validate drop points // is in the WM_MOUSEMOVE. Duping that code here would // be a headache. if ( hTarget = TreeView_GetDropHilight (hWndTreeView)) { // If we made it here, then we need to move the item. // First, we will fetch it, specifying the attributes // we need to copy. tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = hDragItem; tvi.pszText = szBuffer; tvi.cchTextMax = sizeof(szBuffer); TreeView_GetItem ( hWndTreeView, &tvi ); // Now, figure the new place to put it by filling out // the TV_INSERTSTRUCT structure, to use the drop target // as the sibling to insert after, and using the drop // target's parent as the parent to insert this one // after as well. tvIns.hParent = TreeView_GetParent ( hWndTreeView, hTarget ); tvIns.hInsertAfter = hTarget; tvIns.item = tvi; // Delete the old item TreeView_DeleteItem ( hWndTreeView, hDragItem ); // And add the new item (if your app tracks the handles of // the items, you want to use the return value // of this function to update your data structure that // tracks the handles. TreeView_InsertItem ( hWndTreeView, &tvIns ); } // Clear any drop highlights on the TreeView TreeView_SelectDropTarget ( hWndTreeView, NULL ); } break; case WM_SIZE: if ( hWndTreeView ) // Standard code to keep the TreeView // sized up with the main window { SetWindowPos ( hWndTreeView, NULL, 0, 0, LOWORD (lParam), HIWORD (lParam), SWP_NOZORDER ); } break; //****************** NEW CODE END ********* case WM_COMMAND: // message: command from application menu // Message packing of uParam and lParam have changed for Win32, // let us handle the differences in a conditional compilation: #if defined (_WIN32) wmId = LOWORD(uParam); wmEvent = HIWORD(uParam); #else wmId = uParam; wmEvent = HIWORD(lParam); #endif switch (wmId) { case IDM_ABOUT: lpProcAbout = MakeProcInstance((FARPROC)About, hInst); DialogBox(hInst, // current instance "AboutBox", // dlg resource to use hWnd, // parent handle (DLGPROC)lpProcAbout); // About() instance address FreeProcInstance(lpProcAbout); break; case IDM_EXIT: DestroyWindow (hWnd); break; case IDM_HELPCONTENTS: if (!WinHelp (hWnd, "TREEVIEW.HLP", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { MessageBox (GetFocus(), "Unable to activate help", szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPSEARCH: if (!WinHelp(hWnd, "TREEVIEW.HLP", HELP_PARTIALKEY, (DWORD)(LPSTR)"")) { MessageBox (GetFocus(), "Unable to activate help", szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPHELP: if(!WinHelp(hWnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) { MessageBox (GetFocus(), "Unable to activate help", szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; // Here are all the other possible menu options, // all of these are currently disabled: case IDM_NEW: case IDM_OPEN: case IDM_SAVE: case IDM_SAVEAS: case IDM_UNDO: case IDM_CUT: case IDM_COPY: case IDM_PASTE: case IDM_LINK: case IDM_LINKS: default: return (DefWindowProc(hWnd, message, uParam, lParam)); } break; case WM_DESTROY: // message: window being destroyed PostQuitMessage(0); break; default: // Passes it on if unproccessed return (DefWindowProc(hWnd, message, uParam, lParam)); } 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; }
INT_PTR ACheatInfoDlg::OnNotify(LPNMHDR phdr) { if(phdr->idFrom == m_CheatsList->GetCtrlID()){ if(phdr->code == LVN_BEGINDRAG){ int iItem = ((NMLISTVIEW*)phdr)->iItem; POINT ptStart; HIMAGELIST hImg = ListView_CreateDragImage(m_CheatsList->GetHwnd(),iItem,&ptStart); ImageList_BeginDrag(hImg,0,0,0); ImageList_DragEnter(m_CheatsList->GetHwnd(),ptStart.x,ptStart.y); m_iDraggingItem = iItem; SetCapture(this->GetHwnd()); m_bDragging = true; return SetDlgResult(0); }else if(phdr->code == NM_DBLCLK){ int isel = m_CheatsList->GetNextItem(-1,LVNI_SELECTED); if(isel==-1) return SetDlgResult(0); SendMessage(WM_COMMAND,MAKEWPARAM(IDC_CHEAT_EXECLUA,BN_CLICKED), (LPARAM)GetDlgItem(this->GetHwnd(),IDC_CHEAT_EXECLUA)); return SetDlgResult(0); }else if(phdr->code == NM_RCLICK){ //std::vector<int> selection; POINT pt; ::GetCursorPos(&pt); HMENU hMenu = ::GetSubMenu(::LoadMenu(theApp->GetAppInstance(),MAKEINTRESOURCE(IDR_MENU_CHEATVALUES)),0); int i = m_CheatsList->GetNextItem(-1,LVNI_SELECTED); ::EnableMenuItem(hMenu,IDM_CHEATVALUES_COPY,MF_BYCOMMAND|(i!=-1?MF_ENABLED:MF_DISABLED|MF_GRAYED)); ::EnableMenuItem(hMenu,IDM_CHEATVALUES_CUT,MF_BYCOMMAND|(i!=-1?MF_ENABLED:MF_DISABLED|MF_GRAYED)); ::EnableMenuItem(hMenu,IDM_CHEATVALUES_PASTE,MF_BYCOMMAND|(clip.IsAvailable()?MF_ENABLED:MF_DISABLED|MF_GRAYED)); UINT id = ::TrackPopupMenu(hMenu,TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,pt.x,pt.y,0,this->GetHwnd(),NULL); switch(id) { case IDM_CHEATVALUES_COPY: case IDM_CHEATVALUES_CUT: { std::vector<ACheatEntry::VALUE*> values; values.push_back((ACheatEntry::VALUE*)this->GetHwnd()); int isel; ACheatEntry::VALUE* pnewva=0; for(isel=-1;(isel=m_CheatsList->GetNextItem(isel,LVNI_SELECTED))!=-1;){ if(id==IDM_CHEATVALUES_COPY){ ACheatEntry::VALUE* pvalue = m_pEntry->item.values[isel]; pnewva = new ACheatEntry::VALUE; *pnewva = *pvalue; }else if(id==IDM_CHEATVALUES_CUT){ auto& vs = m_pEntry->item.values; pnewva = vs[isel]; auto s = vs.begin(); for(; *s!=pnewva; ++s) ; vs.erase(s); m_CheatsList->DeleteItem(isel); isel--; } values.push_back(pnewva); } values.push_back(0); try{ if(!OpenClipboard(this->GetHwnd())) throw "Open"; EmptyClipboard(); size_t size = values.size()*sizeof(values[0]); HGLOBAL hglo = ::GlobalAlloc(GMEM_MOVEABLE,size); if(!hglo) throw "GlobalAlloc"; void* pv = ::GlobalLock(hglo); if(!pv) throw "lock"; memcpy(pv,&values[0],size); ::SetClipboardData(clip.GetID(),pv); ::GlobalUnlock(hglo); CloseClipboard(); } catch(const char* s){ MessageBox(s,0,MB_ICONERROR); } if(id==IDM_CHEATVALUES_CUT) m_pFile->bNeedSaving=true; return SetDlgResult(TRUE); } case IDM_CHEATVALUES_PASTE: { try{ if(!OpenClipboard(this->GetHwnd())) throw "open"; void* pv = (void*)GetClipboardData(clip.GetID()); if(!pv) throw "Get"; ACheatEntry::VALUE** pp = (ACheatEntry::VALUE**)pv; HWND hwnd = (HWND)*pp++; if(hwnd != this->GetHwnd()) throw "抱歉, 当前不支持跨进程操作金手指~"; while(*pp){ ACheatEntry::VALUE* p = new ACheatEntry::VALUE; *p = **pp; m_pEntry->item.values.push_back(p); AddListItem(p->name.c_str(),0); pp++; } CloseClipboard(); m_pFile->bNeedSaving = true; } catch(const char* s){ CloseClipboard(); MessageBox(s,0,MB_ICONERROR); } return SetDlgResult(TRUE); } default: break; } return SetDlgResult(0); } } return 0; }
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); }