| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 552 人关注过本帖
标题:奇怪的滚动条
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:20 回复次数:3 
奇怪的滚动条
这是windows程序设计的设计滚动条的代码:
程序代码:
#include  <Windows.h>
#include  "sysmets1.h"

LRESULT  CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI  WinMain(HINSTANCE  hInstance,
                    HINSTANCE  hPrevInstance,
                    LPCSTR     szCmdLine,
                    int        iCmdShow)
{
    static  TCHAR  szAppName[] = TEXT ("sysmets1");
    HWND   hwnd;
    MSG    msg;
    WNDCLASS  wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
        return  0;
    }

    hwnd = CreateWindow(szAppName, TEXT("Get system metrics No.1"),
                        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return  msg.wParam;
}

LRESULT  CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static  int cxCaps, cxChar, cyChar, cyClient, iVscrollPos;
    HDC hdc;
    PAINTSTRUCT  ps;
    int  i, y;
    TCHAR  szBuffer[10];
    TEXTMETRIC tm;

    switch (message)
    {
        case WM_CREATE:
            hdc = GetDC(hwnd);
            GetTextMetrics(hdc, &tm);
            cxChar = tm.tmAveCharWidth;
            cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
            cyChar = tm.tmHeight + tm.tmExternalLeading;
            ReleaseDC(hwnd, hdc);
            SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE);
            SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
            return 0;
        case WM_SIZE:
            cyClient = HIWORD(lParam);
            return 0;
        case WM_VSCROLL:
            switch(LOWORD(wParam))
            {
            case  SB_LINEUP:
                iVscrollPos -= 1;
                break;
            case SB_LINEDOWN:
                iVscrollPos += 1;
                break;
            case SB_PAGEUP:
                iVscrollPos -= cyClient / cyChar;
                break;
            case SB_PAGEDOWN:
                iVscrollPos += cyClient / cyChar;
                break;
            case SB_THUMBPOSITION:
                iVscrollPos =HIWORD(wParam);
                break;
            case SB_THUMBTRACK:
            default:
                break;
            }
            iVscrollPos =max(0, min(iVscrollPos, NUMLINES - 1));
            if (iVscrollPos != GetScrollPos(hwnd, SB_VERT))
            {
                SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
                InvalidateRect(hwnd, NULL, TRUE);
            }
            return 0;
        case WM_CLOSE:
            if (IDYES == MessageBox(NULL, TEXT("Do you want to exit?"), TEXT("warning!"), MB_YESNO))
            {
                DestroyWindow(hwnd);
            }
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            for (i = 0; i < NUMLINES; i++)
            {
                TextOut(hdc, 0, cyChar * i,
                    sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));

                TextOut(hdc, 22 * cxCaps, cyChar * i,
                    sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

                SetTextAlign(hdc, TA_TOP | TA_RIGHT);
                TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar * i,
                       szBuffer, wsprintf(szBuffer, TEXT("%5d"),
                       GetSystemMetrics(sysmetrics[i].iIndex)));
                SetTextAlign(hdc, TA_LEFT | TA_TOP);
            }
            EndPaint(hwnd, &ps);
            return  0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}
#include  "sysmets1.h"文件定义了一个结构体数组:
struct      
{   
   int     iIndex ;   
   TCHAR *       szLabel ;      
   TCHAR *       szDesc ;      
}      
sysmetrics [] =……
结果滚动条是出现了,但是下拉或者上拉滚动条,屏幕里的文字并没有随着滚动条移动而移动,什么原因?
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 程序设计 windows 
2012-02-17 14:18
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:10 
InvalidateRect 之后会响应WM_PAINT
但在响应Paint的代码中,没看到用到iVscrollPos的地方

API就是麻烦,MFC就是一个属性打勾的问题,实际原理是一样的
重要的是理解原理

为游戏狂~~!!    大家努力编哈!
2012-02-17 15:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
我跟你說過,C很強大什麼都能做的另一個意思是什麼都需要你自己做。好好體會這句話的意思吧。

[ 本帖最后由 TonyDeng 于 2012-2-17 15:48 编辑 ]

授人以渔,不授人以鱼。
2012-02-17 15:27
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哈哈 望后看才知道 这个消息循环没有调用ScrollWindow(HWND, int, int, const RECT *, const RECT *);
真还要在WM_HSCROLL / WM_VSCROLL里自己判断然后施令。

梅尚程荀
马谭杨奚







                                                       
2012-02-17 15:46
快速回复:奇怪的滚动条
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019343 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved