Excel怎样使用转动条控件计算动态面积?-英雄云拓展知识分享
336
2024-01-22
我有(旧的...)代码,可以在背景中更新转动条位置和最低最大值 SetScrollRange()
但是,当用户拖动转动式旋钮时,该代码不应运行,由于它使旋钮可在视觉上跳回原始位置,然后在用户拖动或释放鼠标时跳回用户所选位置。
是不是有一些简单的方法可以检测到拖动正在进行?
我可以想到两类方法。轻松(和骇客)的方法是调用getCapture()。它将返回捕获鼠标确当前窗口的HWND值,或如果未捕获鼠标,则null。这仅意味着用户在不释放鼠标按钮的情形下将鼠标按钮按下了转动栏控件中的鼠标按钮。
更好的方法是将控件分类。这是一些示例代码,有关如何设置转动条的“拇指”,如何设置标志:
// Somewhere in your code, subclass the scrollbar
WNDPROC originalScrollBarWndProc = (WNDPROC) SetWindowLongPtr(scrollBarHwnd, GWLP_WNDPROC, (LONG_PTR) myScrollBarWndProc);
LRESULT CALLBACK myScrollBarWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
{
// Get Y position of the mouse
uint16_t mouseYPos = HIWORD(lParam); // Change this to LOWORD for horizontal scrollbars
// Get the top and bottom coordinates of the scrollbar thumb
SCROLLBARINFO sbi = {0};
sbi.cbSize = sizeof(SCROLLBARINFO);
if(GetScrollBarInfo(hwnd, OBJID_CLIENT, &sbi) == 0)
{
// Failed to get scroll bar info, handle however you want
break;
}
// Check if the WM_LBUTTONDOWN event happened over the scrollbar thumb
if(mouseYPos >= sbi.xyThumbTop && mouseYPos <= sbi.xyThumbBottom)
{
// Set a flag to indicate that the thumb is being "dragged"
// I chose to do this using SetWindowLongPtr; Do it however you like.
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) 1);
}
}
break;
case WM_LBUTTONUP:
{
// Mouse button was released, clear the flag
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) 0);
}
break;
/* ... other cases here, if needed ... */
}
return CallWindowProc(originalScrollBarWndProc, hwnd, message, wParam, lParam);
}
使用上面的代码,您要做的就是调用getWindowlongptr(scrollbarhwnd,gwlp_userdata),并检查值是不是为0或1以查看是不是被拖动。
我不是积极的 最好的 解决这个问题,但我敢肯定,最少是一个很好的问题。
免责声明:
本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。
发表评论
暂时没有评论,来抢沙发吧~