滚动对话框的时候把ScrollWindow改成ScrollWindowEx就不能用了,ScrollWindowEx后面几个参数该怎么设置? “ 用ScrollWindow来滚动客户区的内容,而不是重绘 ” ,例如上滚;ScrollWindow 就把 图 向上移动。 他本身不绘什么。而 图上移后 , 下面 缺的 部分, 应该 在 OnPaint 补上。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我不是用的MFC,用API做的,我把整个消息处理函数都发上来,对话框本身比较大,所以初始化的时候设置的比较小,就为了用滚动条,我根本就没有WM_PAINT的处理,但是用ScrollWindow一样把下面的部分移动上来了,运行都正常的!用ScrollWindowEx就是下面什么也没有!BOOL CALLBACK GoToProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { RECT rc; ::GetWindowRect(hwndDlg,&rc); ::SetWindowPos( hwndDlg, // handle to window NULL, // placement-order handle 5, // horizontal position 5, // vertical position rc.right-rc.left, // width 200, // height NULL // window-positioning options ); } return TRUE; case WM_VSCROLL : { switch(LOWORD(wParam)) { case SB_LINEDOWN: { ScrollWindow( hwndDlg, // handle to window 0, // horizontal scrolling -20, // vertical scrolling NULL, // client area NULL // clipping rectangle ); } break; } } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: return TRUE; case IDCANCEL: DestroyWindow(hwndDlg); ::PostQuitMessage(0); return TRUE; } } return FALSE; } "我根本就没有WM_PAINT的处理,但是用ScrollWindow一样把下面的部分移动上来了,"不是“我根本就没有WM_PAINT的处理” 而是 使用 默认的 。 int ScrollWindowEx (HWND hwnd, // 发生滚屏的窗口的句柄 int dx, // 水平滚屏的数值 int dy, // 垂直滚屏的数值 CONST RECT*prcScroll,//记录发生滚屏的矩形区域的RECT结构体的地址 CONST RECT* prcClip, //记录发生剪切的矩形区域的 RECT结构体的地址 HRGN hrgnUpdate,// 需要更新区域的句柄 LPRECT prcUpdate, // 记录需要更新矩形区域的 RECT结构体的地址 UINT flags // 滚屏控制标志这个 Flagstaff为:SW_ ERASE当和 SW_INVALIDATE值同时使用时,会通过向 window发送一个WM_ ERASEBKGND消息将最近变得无效的区域抹去; SW_INVALIDATE在发生滚屏后使由hrgnUpdate参数指定的区域无效; SW_SCROLLCHILDREN使所有的子窗口都发生滚屏; SW_ SMOOTHSCROLL在 Windows 95及以后的版本中使窗口发生平滑滚屏。返回值:如果函数运行成功,返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)如果函数运行失败,返回值为ERROR。请 检查 返回值 ! SW_ ERASE|SW_INVALIDATE 返回 2SW_INVALIDATE 返回 2SW_SCROLLCHILDREN 返回 2SW_ SMOOTHSCROLL 编译错误 error C2065: 'SW_SMOOTHSCROLL' : undeclared identifier ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); UpdateWindow(hwnd); MSDN上有例子代码的。另外你可以使用CScrollHelper类,codeproject上搜索一下,很容易使用的。 “SW_SMOOTHSCROLL:Windows NT 5.0或以上版本中:使用平滑滚动。”返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)2 =COMPLEXREGION 吧 向是 下面 没有 重绘, invalidate 看看。 搜索"SYSMET3"是"windows 编程(5版)"的例子 看过了,使用的textout函数,所以我在开始问 “ 而且关于窗口滚动的例子代码,都是滚动文本,用的是TextOut函数,我这是个对话框,客户区上面是控件不是文本,不能用TextOut吧,该把TextOut函数换成哪个函数呢?? ” 不是用不用TextOut的问题,重点是如何Paint 滚动后的区域 用CScrollHelper这个类,代码自己看下就知道了,跟你需求完全吻合http://www.codeproject.com/Articles/10902/Add-Scrolling-to-a-CWnd-or-CDialog-using-a-C-Helpe 谢谢大家,滚动的问题解决了,可是那个问题还是不明白,“ 用ScrollWindow来滚动客户区的内容,而不是重绘 ” 不是说只要客户区的内容发生变化就要重绘吗?向上移动了不还是要整个客户区显示都变了,虽说一部分内容没变,但是位置变了,在新的位置重新画出来那些内容,不都要重绘吗?就连移动一下窗口都要重绘,如果滚动不算重绘,到底什么是重绘??而且ScrollWindow也发送WM_PAINT消息的 "SYSMET3" 上不是说得很清楚了吗.1. ScrollWindow 滚动客户区的内容,而不是重绘, 指的说显示器缓冲区的起始地址改了.2. 会给窗口发重绘消息,要求用户把 空出来的部分 填满(因为滚动而未被覆盖的).3. ScrollWindow 不是GDI函数 (不要求dc). 关于指针的问题 编写调用其它DLL的DLL的问题 如何反监听? 并发与并收的问题--特急 如何通过发送消息的方式使得滚动条移动到指定的位置? 关于GlobalAlloc内存分配的问题? 远程文件修改 ADO连接的怪问题 100分来帮帮我!! 提一个问题!!!! 问问vs2005的程序怎样在win7具有管理员权限, matlab2013b 与 VS2013 混合编程 编译出现问题
{
switch (message)
{
case WM_INITDIALOG:
{
RECT rc;
::GetWindowRect(hwndDlg,&rc);
::SetWindowPos(
hwndDlg, // handle to window
NULL, // placement-order handle
5, // horizontal position
5, // vertical position
rc.right-rc.left, // width
200, // height
NULL // window-positioning options
);
}
return TRUE;
case WM_VSCROLL :
{
switch(LOWORD(wParam))
{
case SB_LINEDOWN:
{
ScrollWindow(
hwndDlg, // handle to window
0, // horizontal scrolling
-20, // vertical scrolling
NULL, // client area
NULL // clipping rectangle
);
}
break;
}
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
return TRUE;
case IDCANCEL:
DestroyWindow(hwndDlg);
::PostQuitMessage(0);
return TRUE;
}
}
return FALSE;
}
不是“我根本就没有WM_PAINT的处理” 而是 使用 默认的 。
int dx, // 水平滚屏的数值
int dy, // 垂直滚屏的数值
CONST RECT*prcScroll,//记录发生滚屏的矩形区域的RECT结构体的地址
CONST RECT* prcClip, //记录发生剪切的矩形区域的 RECT结构体的地址
HRGN hrgnUpdate,// 需要更新区域的句柄
LPRECT prcUpdate, // 记录需要更新矩形区域的 RECT结构体的地址
UINT flags // 滚屏控制标志这个 Flagstaff为:
SW_ ERASE当和 SW_INVALIDATE值同时使用时,会通过向 window发送一个WM_ ERASEBKGND消息将最近变得无效的区域抹去;
SW_INVALIDATE在发生滚屏后使由hrgnUpdate参数指定的区域无效;
SW_SCROLLCHILDREN使所有的子窗口都发生滚屏;
SW_ SMOOTHSCROLL在 Windows 95及以后的版本中使窗口发生平滑滚屏。返回值:如果函数运行成功,返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)如果函数运行失败,返回值为ERROR。请 检查 返回值 !
SW_INVALIDATE 返回 2
SW_SCROLLCHILDREN 返回 2
SW_ SMOOTHSCROLL 编译错误 error C2065: 'SW_SMOOTHSCROLL' : undeclared identifier
(CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL,
SW_INVALIDATE);
UpdateWindow(hwnd); MSDN上有例子代码的。
另外你可以使用CScrollHelper类,codeproject上搜索一下,很容易使用的。
返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)
2 =COMPLEXREGION 吧
是"windows 编程(5版)"的例子
看过了,使用的textout函数,所以我在开始问 “ 而且关于窗口滚动的例子代码,都是滚动文本,用的是TextOut函数,我这是个对话框,客户区上面是控件不是文本,不能用TextOut吧,该把TextOut函数换成哪个函数呢?? ”
1. ScrollWindow 滚动客户区的内容,而不是重绘, 指的说显示器缓冲区的起始地址改了.
2. 会给窗口发重绘消息,要求用户把 空出来的部分 填满(因为滚动而未被覆盖的).
3. ScrollWindow 不是GDI函数 (不要求dc).