在控件中画图超出边界 如何让他自动产生滚动条?
在控件中画图超出边界 如何让他自动产生滚动条?
谢谢!
问题点数:30、回复次数:9Top
1 楼playboy132(一塌糊涂)回复于 2004-05-05 11:57:41 得分 30
判断所有图形所需的最小区域,和当前的用户区域比较。
然后。。。。。。。。。
给分!!!!!!Top
2 楼zjfzju(zjf)回复于 2004-05-05 14:36:58 得分 0
upTop
3 楼playboy132(一塌糊涂)回复于 2004-05-05 16:22:24 得分 0
判断所有图形所需的最小区域,储存在CSize size中
然后在View中调用SetScrollSizes(MM_TEXT, size);//重新设置滚动条
快给分!!!!!!
Top
4 楼puhuofeie(扑火飞蛾)回复于 2004-05-05 20:27:55 得分 0
这个问题我也想知道!
比如,用CStatic控件画图,如果图片大于控件大小,怎样在CStatic上产生滚动条!Top
5 楼puhuofeie(扑火飞蛾)回复于 2004-05-05 20:28:37 得分 0
我没有产生滚动条,我是将图片缩小!Top
6 楼zjfzju(zjf)回复于 2004-05-06 00:29:09 得分 0
有没有好的办法啊Top
7 楼byry(百事罐头)回复于 2004-05-06 12:05:51 得分 0
在Windows 应 用 程 序 中, 大 多 数 应 用 程 序 通 过 滚 动
条 来 实 现 窗 口 客 户 区 域 的 滚 动。 在 某 些 情 况 下, 使
用 滚 动 条 则 有 些 不 方 便。 例 如, 在 绘 图 软 件 中 使 用
鼠 标 拖 动 的 方 法 画 线 时, 若 两 端 点 不 能 同 时 出 现 在
客 户 区 域 内, 则 不 能 用 滚 动 条 来 实 现 客 户 区 域 的 滚
动。 本 文 仅 就 实 现 窗 口 客 户 区 域 自 动 滚 动 的 方 法 谈
谈 自 己 的 看 法, 并 且 编 写 了 一 个 能 绘 制 直 线 的 绘 图
小 程 序。
当 光 标 移 动 到 窗 口 边 界 附 近 时, 客 户 区 域 自 动 滚 动
, 将 用 户 操 作 的 位 置 向 窗 口 中 心 移 动, 这 是 该 绘 图 小 程
序 总 的 设 计 思 想。 在 实 际 操 作 过 程 中, 用Workshop 制 作 了
形 状 为 向 上 箭 头、 向 下 箭 头、 向 左 箭 头、 向 右 箭 头 的 光 标,
作 为 窗 口 滚 动 时 的 光 标。 在WinMain() 函 数 登 记 窗 口 类 时 将
窗 口 类 的hCursor 设 置 为NULL。 程 序 中 保 留 了 滚 动 条, 也 可 通
过 滚 动 条 来 操 作。 在WM_MOUSEMOVE 消 息 的 处 理 中, 如 果 光 标
移 到 边 界 附 近, 并 且 客 户 区 域 可 以 滚 动, 则 将 光 标 置 为 相
应 形 状 的 光 标, 并 设 置 一 个 定 时 器 ; 如 果 光 标 移 出 边 界
附 近 的 区 域 并 且 已 设 置 定 时 器, 则 删 除 定 时 器。 在WM_TIMER
消 息 的 处 理 中, 如 果 窗 口 不 需 要 滚 动 则 删 除 定 时 器, 否 则
判 断 滚 动 方 向 并 发 送 相 应 的WM_HSCROLL 或WM_VSCROLL 消 息。 在WM_HSCROLL
或WM_VSCROLL 消 息 的 处 理 中 实 现 窗 口 客 户 区 域 的 滚 动。 在WM_CREATE
和WM_SIZE 消 息 的 处 理 中, 获 得 窗 口 的 客 户 区 域 大 小 并 保 存 在 静
态 变 量nClientWidth 和nClientHeight 中。
Top
8 楼byry(百事罐头)回复于 2004-05-06 12:05:58 得分 0
程 序 清 单 如 下, 其 中 省 略 了WinMain() 函 数、rc 文 件、def 文 件、
rh 文 件。
// pan.c
#define LINE_UP 100
#define VIRTUE_WIDTH 4000
#define VIRTUE_HEIGHT 3000
HINSTANCE hInst;
static char szAppName[] = "PanExample" ;
LRESULT FAR PASCAL _export WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int nVirtueWidth ,nVirtueHeight ,nClientWidth ,nClientHeight;
static BOOL bDraw;
static HCURSOR hLeft,hRight,hUp,hDown,hCursor,hDraw;
static HPEN hPen;
HDC hdc;
PAINTSTRUCT ps;
RECT rectClient;
POINT point;
static RECT* pRect;
static int nNum;
static HANDLE hMem;
int n,x,y;
RECT* p;
static UINT IdTimer=0;
switch (message)
{
case WM_CREATE:
// 装 入 光 标 资 源
hLeft=LoadCursor(hInst,LEFT_CURSOR);
hRight=LoadCursor(hInst,RIGHT_CURSOR);
hUp=LoadCursor(hInst,UP_CURSOR);
hDown=LoadCursor(hInst,DOWN_CURSOR);
hCursor=LoadCursor(NULL,IDC_ARROW);
hDraw=LoadCursor(NULL,IDC_CROSS);
hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
// 分 配 内 存 保 存 线 数 据
hMem=GlobalAlloc(GMEM_MOVEABLE,100*sizeof(RECT));
pRect=(RECT*)(GlobalLock(hMem));
nNum=0;
hdc=GetDC(hwnd);
// 获 得 客 户 区 域 的 大-
GetClientRect( hwnd , &rectClient );
nClientWidth = rectClient.right;
nClientHeight = rectClient.bottom;
ReleaseDC(hwnd,hdc);
nVirtueWidth=VIRTUE_WIDTH;
nVirtueHeight=VIRTUE_HEIGHT;
// 设 置 滚 动 范 围
SetScrollRange(hwnd,SB_HORZ,0,nVirtueWidth,TRUE) ;
SetScrollRange(hwnd,SB_VERT,0,nVirtueHeight,TRUE);
break;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
SelectObject(hdc,hPen);
SetROP2(hdc,R2_XORPEN);
x=GetScrollPos(hwnd,SB_HORZ);
y=GetScrollPos(hwnd,SB_VERT);
for (p=pRect,n=0;n {
MoveTo(hdc,p->left-x,p->top-y);
LineTo(hdc,p->right-x,p->bottom-y);
}
EndPaint( hwnd, &ps );
break;
case WM_LBUTTONDOWN:
if(SetCapture(hwnd))
return (1);
bDraw=TRUE;
x=GetScrollPos(hwnd,SB_HORZ);
y=GetScrollPos(hwnd,SB_VERT);
// 保 存 直 线 的 起 始 位 置
pRect[nNum].right=LOWORD(lParam)+x;
pRect[nNum].left=pRect[nNum].right;
// 终 止 位 置 与 起 始 位 置 相 同
pRect[nNum].bottom=HIWORD(lParam)+y;
pRect[nNum].top=pRect[nNum].bottom;
nNum++;
break;
case WM_LBUTTONUP:
x=GetScrollPos(hwnd,SB_HORZ);
y=GetScrollPos(hwnd,SB_VERT);
// 保 存 直 线 的 终 止 位 置
pRect[nNum-1].right=LOWORD(lParam)+x;
pRect[nNum-1].bottom=HIWORD(lParam)+y;
ReleaseCapture();
bDraw=FALSE;
break;
case WM_MOUSEMOVE:
// 获 得 滚 动 块 的 位 置
x=GetScrollPos(hwnd,SB_HORZ);
y=GetScrollPos(hwnd,SB_VERT);
// 获 得 光 标 的 位 置
point.x=LOWORD(lParam)+x;
point.y=HIWORD(lParam)+y;
if (bDraw)
{
hdc=GetDC(hwnd);
SelectObject(hdc,hPen);
SetROP2(hdc,R2_XORPEN);
// 擦 除 上 次 画 的 线
MoveTo(hdc,pRect[nNum-1].left-x,pRect[nNum-
1].top-y);
LineTo(hdc,pRect[nNum-1].right-x,pRect[nNum-
1].bottom-y);
pRect[nNum-1].right=point.x;
pRect[nNum-1].bottom=point.y;
// 绘 制- 孪
MoveTo(hdc,pRect[nNum-1].left-x,pRect[nNum- 1].top-y);
LineTo(hdc,pRect[nNum-1].right-x,pRect[nNum-
1].bottom-y);
ReleaseDC(hwnd,hdc);
}
if ((point.x-x<10)&&(x!=0))
// 光 标 在 左 边 界 附 近 并 且 滚 动 块 不 在 最 左 方
{
SetCursor(hLeft); // 设 置 光 标 为 左 箭 头
if (!IdTimer) // 未 设 置 定 时 器
IdTimer=SetTimer(hwnd,1,500,NULL); }
else if ((point.x-x>nClientWidth-10)&&(x!=VIRTUE_WIDTH))
// 光 标 在 右 边 界 附 近 并 且 滚 动 块 不 在 最 右 方
{
SetCursor(hRight);// 设 置 光 标 为 右 箭 头
if (!IdTimer)
IdTimer=SetTimer(hwnd,1,500,NULL); }
else if ((point.y-y<10)&&(y!=0))
// 在 上 边 界 附 近 并 且 滚 动 块 不 在 最 上 方
{
SetCursor(hUp); // 设 置 光 标 为 上 箭 头
if (!IdTimer)
IdTimer=SetTimer(hwnd,1,500,NULL); }
else if ((point.y-y>nClientHeight-10)&& (y!=VIRTUE_HEIGHT))
// 光 标 在 下 边 界 附 近 并 且 滚 动 块 不 在 最 下 方
{
SetCursor(hDown); // 设 置 光 标 为 下 箭 头
if (!IdTimer)
IdTimer=SetTimer(hwnd,1,500,NULL); }
else // 不- 枰 龆 突
{
if (bDraw)
SetCursor(hDraw); // 设 置 光 标 为 十 字 叉 丝
else
SetCursor(hCursor); // 设 置 光 标 为 普 通 光 标
if (IdTimer) //-- 设 置 定 时 器
{
KillTimer(hwnd,IdTimer);
IdTimer=0;
}
}
break;
case WM_SIZE:
// 获 得 客 户 区 域 的 大-
nClientWidth=LOWORD(lParam);
nClientHeight=HIWORD(lParam);
break;
case WM_HSCROLL:
x=GetScrollPos(hwnd,SB_HORZ);
switch (wParam)
{
case SB_LINEDOWN: // 单 击 滚 动 条 右 箭 头
if (x>nVirtueWidth-LINE_UP )
x=nVirtueWidth;
else
x+=LINE_UP;
SetScrollPos(hwnd,SB_HORZ,x,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
break;
case SB_LINEUP: // 单 击 滚 动 条 左 箭 头
if (x x=0;
else
x-=LINE_UP;
SetScrollPos(hwnd,SB_HORZ,x,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
break; }
break;
case WM_VSCROLL:
y=GetScrollPos(hwnd,SB_VERT);
switch (wParam)
{
case SB_LINEDOWN: // 单 击 滚 动 条 下 箭 头
if (y>nVirtueHeight-LINE_UP )
y=nVirtueHeight;
else
y+=LINE_UP;
SetScrollPos(hwnd,SB_VERT,y,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
break;
case SB_LINEUP:// 单 击 滚 动 条 上 箭 头
if (y y=0;
else
y-=LINE_UP;
SetScrollPos(hwnd,SB_VERT,y,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
break; }
break;
case WM_TIMER:
// 获 得 滚 动 块 的 位 置
x=GetScrollPos(hwnd,SB_HORZ);
y=GetScrollPos(hwnd,SB_VERT);
// 获 得 光 标 的 位 置
GetCursorPos(&point);
ScreenToClient(hwnd,&point);
// 滚 动 块-- 到 尽 头
if(((x==0)&&(point.x<10))||((x==VIRTUE_WIDTH)&&(point.
x>nClientWidth-10))||((y==0)&&(point.y<10))||
((y==VIRTUE_HEIGHT)&&(point.y>nClientHeight-10)))
{
if(IdTimer)
KillTimer(hwnd,IdTimer); }
else
{
if (point.x<10)
// 向 左 滚 动
SendMessage(hwnd,WM_HSCROLL,SB_LINEUP,0);
else if (point.x>nClientWidth-10)
// 向 右 滚 动
SendMessage(hwnd,WM_HSCROLL,SB_LINEDOWN,0);
else if (point.y<10)
// 向 上 滚 动
SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0);
else if(point.y>nClientHeight-10)
// 向 下 滚 动
SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0);
}
break;
case WM_DESTROY:
// 释 放 所- 资 源
GlobalUnlock(hMem);
GlobalFree(hMem);
DestroyCursor(hLeft);
DestroyCursor(hRight);
DestroyCursor(hUp);
DestroyCursor(hDown);
DeleteObject(hPen);
PostQuitMessage (0) ;
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam) ; }
return (0L);
}
Top
9 楼playboy132(一塌糊涂)回复于 2004-05-08 11:48:11 得分 0
不好意思,说错了。
我说的是在文档中自动产生滚动条!Top




