标题:Windows程序设计第5版滚动条的问题
只看楼主
糊涂鬼
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-11-5
结帖率:100%
已结贴  问题点数:20 回复次数:2 
Windows程序设计第5版滚动条的问题
我照着《Windows程序设计 第五版》中的SYSMETS3.c程序敲了一遍代码,可在编译的时候老是出错。

#include

#define NUMLINES ((int)((sizeof sysmetrics)/(sizeof sysmetrics[0]))

struct
{
    int    iTndex;
    TCHAR *szLabel;
    TCHAR *szDesc;
}
sysmetrics[]=
{
    SM_CXSCREEN,      TEXT("SM_CXSCREEN"),        TEXT("Screen width in pixels"),
    SM_CYSCREEN,      TEXT("SM_CYSCREEN"),        TEXT("Sxreen height in pixels"),
    SM_CXVSCROLL,     TEXT("SM_CXVSCROLL"),       TEXT("Vertical scroll width"),
    SM_CYHSCROLL,     TEXT("SM_CYHSCROLL"),       TEXT("Horizonta scroll height"),
    SM_CYCAPTION,     TEXT("SM_CYCAPTION"),       TEXT("Caption bar height"),
    SM_CXBORDER,      TEXT("SM_CXBORDER"),        TEXT("Window border width"),
    SM_CYBORDER,      TEXT("SM_CYBORDER"),        TEXT("Window border height")

};

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Code::Blocks Template Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int  cxChar,cxCaps,cyChar,cxClient,cyClient,iMaxWidth;
    HDC         hdc;
    int         i,x,y,iVertPos,iHorzPos,iPaintBeg,iPaintEnd;
    PAINTSTRUCT ps;
    SCROLLINFO  si;
    TCHAR       szBuffer[10];
    TEXTMETRIC  tm;

    switch (message)                  /* handle the messages */
    {
        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);
             iMaxWidth=40*cxChar+22*cxCaps;
             return 0;

        case WM_SIZE:
             cxClient = LOWORD(lParam);
             cyClient = HIWORD(lParam);

             si.cbSize= sizeof(si);
             si.fMask = SIF_RANGE|SIF_PAGE;
             si.nMin  = 0;
             si.nMax  = (NUMLINES - 1);
             si.nPage = cyClient/cyChar;
             SetScrollInfo(hwnd,SB_VERT,&si,TRUE);

             si.cbSize = sizeof(si);
             si.fMask  = SIF_RANGE|SIF_PAGE;
             si.nMin   = 0;
             si.nMax   = 2+iMaxWidth/cxChar;
             si.nPage  = cxClient/cxChar;
             SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
             return 0;

        case WM_VSCROLL:
             si.cbSize    =sizeof(si);
             si.fMask     =SIF_ALL;
             GetScrollInfo(hwnd,SB_VERT,&si);
             iVertPos=si.nPos;;
             iVertPos=si.nPos;
             switch(LOWORD(wParam))
             {
                case SB_TOP:
                     si.nPos=si.nMin;
                     break;
                case SB_BOTTOM:
                     si.nPos=si.nMax;
                     break;
                case SB_LINEUP:
                     si.nPos-=1;
                     break;
                case SB_LINEDOWN:
                     si.nPos+=1;
                     break;
                case SB_PAGEUP:
                     si.nPos-=si.nPage;
                     break;
                case SB_PAGEDOWN:
                     si.nPos+=si.nPage;
                     break;
                case SB_THUMBTRACK:
                     si.nPos=si.nTrackPos;
                     break;
                default:
                     break;
             }
             si.fMask=SIF_POS;
             SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
             GetScrollInfo(hwnd,SB_VERT,&si);
             if(si.nPos!=iVertPos)
             {
                 ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
                 UpdateWindow(hwnd);
             }
             return 0;
        case WM_HSCROLL:
            si.cbSize=sizeof(si);
            si.fMask=SIF_ALL;
            GetScrollInfo(hwnd,SB_HORZ,&si);
            iHorzPos=si.nPos;
            switch(LOWORD(wParam))
            {
            case SB_LINELEFT:
                si.nPos-=1;
                break;
            case SB_LINERIGHT:
                si.nPos+=1;
                break;
            case SB_PAGELEFT:
                si.nPos-=si.nPage;
                break;
            case SB_PAGERIGHT:
                si.nPos+=si.nPage;
                break;
            case SB_THUMBPOSITION:
                si.nPos=si.nTrackPos;
                break;
            default:
                break;
            }
            si.fMask=SIF_POS;
            SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
            GetScrollInfo(hwnd,SB_HORZ,&si);
            if(si.nPos!=iHorzPos)
            {
                ScrollWindow(hwnd,cxChar*(iHorzPos-si.nPos),0,NULL,NULL);
            }
            return 0;
            
        case WM_PAINT:
            hdc=BeginPaint(hwnd,&ps);
            si.cbSize=sizeof(si);
            si.fMask=SIF_POS;
            GetScrollInfo(hwnd,SB_VERT,&si);
            iVertPos=si.nPos;
            GetScrollInfo(hwnd,SB_HORZ,&si);
            iHorzPos=si.nPos;

            iPaintBeg = max(0,iVertPos+ps.rcPaint.top/cyChar);
            iPaintEnd = min(NUMLINES-1,iVertPos+ps.rcPaint.bottom/cyChar);
            for(i=iPaintBeg;i<=iPaintEnd;i++)
            {
                x=cxChar*(1-iHorzPos);
                y=cyChar*(i-iVertPos);
                TextOut(hdc,x,y,sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
                TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));
                SetTextAlign(hdc,TA_RIGHT|TA_TOP);
                TextOut(hdc,x+22*cxCaps+40*cxChar,y,szBuffer,wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iTndex)));
                SetTextAlign(hdc,TA_LEFT|TA_TOP);
            }
            EndPaint(hwnd,&ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            return 0;
      
    }

    return DefWindowProc(hwnd,message,wParam,lParam);
}
VC++6.0提示错误:
error C2143: syntax error : missing ')' before ';'
error C2143: syntax error : missing ')' before ':'
error C2143: syntax error : missing ')' before ';'

C-Free提示错误:
--------------------配置: mingw5 - GUI Release, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 C:\Users\Administrator\Documents\C-Free\Temp\未命名1.c...
[Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.c:122: error: syntax error before ';' token
[Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.c:219: error: syntax error before ':' token
[Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.c:232: error: case label not within a switch statement
[Error] C:\Users\Administrator\Documents\C-Free\Temp\未命名1.c:238: error: syntax error before "return"

构建中止 未命名1: 4 个错误, 0 个警告

CodeBlocks提示错误:
E:\Test\SYSMETS3\main.cpp:103:35: error: expected ')' before ';' token
E:\Test\SYSMETS3\main.cpp:200:25: error: expected ')' before ':' token
E:\Test\SYSMETS3\main.cpp:200:74: error: expected ':' before ';' token
E:\Test\SYSMETS3\main.cpp:200:74: error: expected primary-expression before ';' token
E:\Test\SYSMETS3\main.cpp:200:74: error: expected ')' before ';' token
E:\Test\SYSMETS3\main.cpp:200:74: error: expected ')' before ';' token
除此之外还有一大堆 “warning: deprecated conversion from string constant to 'TCHAR* {aka char*}' [-Wwrite-strings]”的警告。
 
仔细检查了好几遍也没找出错在哪,求前辈指点。
搜索更多相关主题的帖子: Windows 程序设计 include scroll 
2013-11-05 01:04
又一轮明月
Rank: 2
等 级:论坛游民
帖 子:13
专家分:50
注 册:2013-10-31
得分:14 
你的头文件呢
2013-11-07 11:40
糊涂鬼
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-11-5
得分:0 
回复 2楼 又一轮明月
并到.c文件里去了,以前这样也可以的,不至于到了这里就不行了吧。
2013-11-08 00:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-423063-1-1.html




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

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