我正在为Windows Mobile平台(在WM6.1上测试)制作一个win32程序。大多数主窗口由单个文本框组成,我想用手指滚动而不是选择文本。我会怎么做呢?如何使一个像iPhone一样的win32文本框滚动
0
A
回答
1
没有进入你应该关注的技术问题,将“鼠标”点击事件分为“鼠标”向下和“鼠标”向上事件。
如果自从关闭事件后指针位置没有改变,则执行up事件的选择。所以你需要在down事件中存储指针位置。
然后你可以处理指针移动事件来执行滚动。
1
我得到它的工作。这并不像我所希望的那样微不足道。顺便说一下,这应该在普通的Windows上工作,而不仅仅是Windows Mobile。它继续是这样的:
当您创建的窗口(如主窗口的子窗口)
HWND createCustomDrawArea(const LPCTSTR className, const HWND hWndParent) {
WNDCLASS wndClass = {
CS_HREDRAW | CS_VREDRAW,
(WNDPROC)wndProc,
0,
0,
hInstMain,
NULL,
0,
(HBRUSH)GetStockObject(HOLLOW_BRUSH),
0,
className
};
RegisterClass(&wndClass);
return CreateWindow(
className,
className,
WS_CHILD | WS_TABSTOP,
0, 0, 0, 0,
hWndParent,
NULL,
hInstMain,
NULL
);
}
然后在主函数(主消息循环):
while(GetMessage(&msg, NULL, 0, 0)) {
if(!handleScrollingMessages(msg.hwnd, msg.message, msg.wParam, msg.lParam) && !TranslateAccelerator(msg.hwnd, NULL, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
我这样做是为了一旦手指(鼠标)关闭,您可以将手指移动到其他地方(仍然在同一程序中,但可以在滚动窗口之外),并且它会继续滚动,直到您放开向上)。消息处理程序是这样的:
inline BOOL handleScrollingMessages(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
static BOOL mouseIsDown = FALSE;
static BOOL isScrolling;
static POINT firstMousePos;
static POINT lastMousePos;
POINT currentMousePos;
switch(message) {
case WM_MOUSEMOVE:
if(!mouseIsDown) {
return FALSE;
}
GetCursorPos(¤tMousePos);
scrollText(currentMousePos.y - lastMousePos.y);
if(!isScrolling && (
firstMousePos.x currentMousePos.x + FINGER_SCROLL_SENSITIVITY ||
firstMousePos.y currentMousePos.y + FINGER_SCROLL_SENSITIVITY
)) {
isScrolling = TRUE;
}
lastMousePos = currentMousePos;
return TRUE;
case WM_LBUTTONDOWN:
if(hWnd == whichPrimaryIsVisible) {
if(!mouseIsDown) {
GetCursorPos(&firstMousePos);
lastMousePos = firstMousePos;
mouseIsDown = TRUE;
isScrolling = FALSE;
}
return TRUE;
}
return FALSE;
case WM_LBUTTONUP:
if(mouseIsDown) {
mouseIsDown = FALSE;
if(isScrolling) {
isScrolling = FALSE;
} else {
if(hWnd == whichPrimaryIsVisible) {
jumpToSong(HIWORD(lParam));
}
}
return TRUE;
}
return FALSE;
}
return FALSE;
}
在正常的消息处理程序,你必须抓住WM_ERASEBKGND和WM_PAINT消息:
case WM_ERASEBKGND:
if(hWnd == whichPrimaryIsVisible) {
drawBackground(hWnd, (HDC)wParam);
return 1;
}
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_PAINT:
if(hWnd != hWndMain && drawWindowSection(hWnd)) {
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
然后你必须提请双方的背景和文字(前景)分开。滚动功能如下:
inline void scrollText(const int mouseChange) {
RECT wholeAreaRect;
RECT invalidatedRect;
scrollPos += mouseChange;
GetClientRect(whichPrimaryIsVisible, &wholeAreaRect);
ScrollWindowEx(whichPrimaryIsVisible, 0, mouseChange, NULL, &wholeAreaRect, NULL, &invalidatedRect, SW_ERASE | SW_INVALIDATE);
UpdateWindow(whichPrimaryIsVisible);
}
记住whichPrimaryIsVisible是滚动窗口(全局变量),并且scrollPos是一个全球性的INT。
唯一剩下的就是drawBackground()和drawWindowSection()。他们在我的程序中冗长而令人费解,因为我也让他们做其他事情(与绘制窗口有关)。如果你真的想要这个代码,那么给我发一条消息或其他东西。也让我知道,如果我已经发布的东西正确的方式,因为我是新的发布论坛等
相关问题
- 1. 如何创建一个像文本框一样的形状?
- 2. UIScrollView如何像滚动一样工作?
- 3. 如何使一个文本框移动
- 4. 如何创建一个像iPhone上的浮动滚动条?
- 5. 如何使网页像滚动的幻灯片一样移动
- 6. 一个像CLI一样运行的C#文本框
- 7. 如何像使用Win32 API一样使用RichEdit控件?
- 8. 如何像文字框一样动画文字视图?
- 9. Userform文本框像html文本框一样工作
- 10. 如何创建一个像iphone一样的搜索android
- 11. 滚动到新的文本框选择一个新的文本框
- 12. UITableView像轮子一样无限滚动
- 13. 使文本滚动一定的时间
- 14. iPad:如何制作像鼠标滚轮一样的单一滑动动作
- 15. SQL与多个文本框一样
- 16. 如何使一个自动滚动像flickr主页
- 17. 作为一个可滚动实体的文本和图像
- 18. 如何使android中的滚动条看起来像一个mac os滚动条
- 19. 像框一样自动展开的facebook
- 20. iPhone - 滚动一个UIScrollView保持移动
- 21. 如何添加一个滚动条到文本框中的wpf c#
- 22. 我如何滚动到一个富文本框中的字符串
- 23. C#winforms:将文本从一个文本框移动到另一个文本框
- 24. 如何让图像一个接一个地滚动
- 25. 使用C#和WIN32滚动记事本
- 26. 如何像滚动列表一样继续滚动列表视图
- 27. 如何在文本框中滚动?
- 28. 如何使用J2ME在Blackberry中显示像marque这样的滚动文本?
- 29. 如何让iframe像电影信用一样向下滚动?
- 30. Cocos2d-iphone像“植物VS僵尸”一样加载大型可滚动图像
嘿,我为什么没有想到这一点。非常感谢,我会试一试。 – Warpspace 2010-03-01 11:48:00