vs中编写了一个会显示水平和竖直滚动条的程序,但是运行时出现错误的结果,请问这是为啥?

问题描述

vs中编写了一个会显示水平和竖直滚动条的程序,但是运行时出现错误的结果,请问这是为啥?

这是源代码:
#include
#include"resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
static char szAppName[] = "SysMets2";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
if (!hPrevInstance)
{
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;

    RegisterClass(&wndclass);

}
hwnd = CreateWindow(szAppName, "Get System Metrics No.2",
    WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL
    );

ShowWindow(hwnd, nCmdShow);
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 short cxChar, cxCaps, cyChar, cxClient, cyClient, nHscrollPos,nMaxWidth,nVscrollPos,nVscrollMax,nHscrollMax;
char szBuffer[10];
HDC hdc;
short i,x,y,nPaintBeg,nPaintEnd,nVscrollInc,nHscrollInc;
PAINTSTRUCT ps;
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);
    nMaxWidth = 40 * cxChar + 18 * cxCaps;
    return 0;
case WM_SIZE:
    cyClient = HIWORD(lParam);
    cxClient = LOWORD(lParam);

    nVscrollMax = max(0, NUMLINES + 2 - cyClient / cyChar);
    nVscrollPos = min(nVscrollPos, nVscrollMax);

    SetScrollRange(hwnd, SB_VERT, 0, nVscrollMax, FALSE);
    SetScrollPos(hwnd, SB_VERT, nVscrollPos, TRUE);

    nHscrollMax = max(0, 2 + (nMaxWidth - cxClient) / cxChar);
    nHscrollPos = min(nHscrollPos, nHscrollMax);

    SetScrollRange(hwnd, SB_HORZ, 0, nHscrollMax, FALSE);
    SetScrollPos(hwnd, SB_HORZ, nHscrollPos, TRUE);
    return 0;
case WM_VSCROLL:
    switch (wParam)
    {
    case SB_TOP:
        nVscrollInc = -nVscrollPos;
        break;
    case SB_BOTTOM:
        nVscrollInc = nVscrollMax - nVscrollPos;
        break;
    case SB_LINEUP:
        nVscrollInc = -1;
        break;
    case SB_LINEDOWN:
        nVscrollInc = 1;
    case SB_PAGEUP:
        nVscrollPos = min(-1, -cyClient / cyChar);
        break;
    case SB_PAGEDOWN:
        nVscrollPos = max(1, cyClient / cyChar);
        break;
    case SB_THUMBTRACK:
        nVscrollInc = LOWORD(lParam) - nVscrollPos;
        break;
    default:
        nVscrollInc = 0;
    }
    if (nVscrollInc == max(-nVscrollPos, min(nVscrollInc, nVscrollMax - nVscrollPos)))
    {
        nVscrollPos += nVscrollInc;
        ScrollWindow(hwnd, 0, -cyChar*nVscrollInc, NULL, NULL);
        SetScrollPos(hwnd, SB_VERT, nVscrollPos, TRUE);
        UpdateWindow(hwnd);
    }
    return 0;

case  WM_HSCROLL:
    switch (wParam)
    {
    case SB_LINEDOWN:
        nHscrollPos = 1;
        break;
    case SB_LINEUP:
        nHscrollPos =- 1;
        break;
    case SB_PAGEUP:
        nHscrollPos = -8;
        break;
    case SB_PAGEDOWN:
        nHscrollPos = 8;
        break;
    case SB_THUMBPOSITION:
        nHscrollInc = LOWORD(lParam) - nHscrollPos;
        break;
    default:
        nHscrollInc=0;
    }
    if (nHscrollPos = max(-nHscrollPos, min(nHscrollInc, nHscrollMax - nHscrollPos)))
    {
        nHscrollPos += nHscrollInc;
        ScrollWindow(hwnd, -cxChar*nHscrollInc, 0, NULL, NULL);
        SetScrollPos(hwnd, SB_HORZ, nHscrollPos, TRUE);
    }
    return 0;

case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    nPaintBeg = max(0,nVscrollPos+ps.rcPaint.top/cyChar-1);
    nPaintEnd = min(NUMLINES,nVscrollPos=ps.rcPaint.bottom/cyChar);
    for (i = nPaintBeg; i < nPaintEnd; i++)
    {
        x = cxChar*(1-nHscrollPos);
        y = cyChar*(1-nVscrollPos+i);
        TextOut(hdc,cxChar,y,
            sysmetrics[i].szLabel,
            lstrlen(sysmetrics[i].szLabel)
            );
        TextOut(hdc, x+18*cxCaps,y,
            sysmetrics[i].szDesc,
            lstrlen(sysmetrics[i].szDesc)
            );
        SetTextAlign(hdc,TA_RIGHT | TA_TOP);

        TextOut(hdc,x+18*cxCaps+40*cxChar,
            y, szBuffer,
            wsprintf(szBuffer, "%5d",
            GetSystemMetrics(sysmetrics[i].nIndex))
            );
        SetTextAlign(hdc, TA_LEFT| TA_TOP);
    }
    EndPaint(hwnd, &ps);
    return 0;
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);

}
这是resource.h中的代码:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Win32Project1.rc

// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
#define NUMLINES (sizeof sysmetrics/sizeof sysmetrics[0])
struct
{
int nIndex;
char *szLabel;
char *szDesc;

}
sysmetrics[] =
{
SM_CXSCREEN, "SM_CXSCREEN", "Screen with in pixels",
SM_CYSCREEN, "SM_CYSCREEN", "Screen height in pixels",
SM_CXVSCROLL, "SM_CXVSCROLL", "Vertical scroll arrow width",
SM_CYHSCROLL, "SM_CYHSCROLL", "Horizontal scroll arrow height",
SM_CYCAPTION, "SM_CYCAPTION", "Caption bar height",
SM_CXBORDER, "SM_CXBORDER", "border width",
SM_CYBORDER, "SM_CYBORDER", "border height",
SM_CXDLGFRAME, "SM_CXDLGFRAME", "Dialog window frame width",
SM_CYDLGFRAME, "SM_CYDLGFRAME", "Dialog window frame height",
SM_CYVTHUMB, "SM_CYVTHUMB", "Vertical scroll thumb height",
SM_CXHTHUMB, "SM_CXHTHUMB", "Horizontal scroll thumb height",
SM_CXICON, "SM_CXICON", "Icon width",
SM_CYICON, "SM_CYICON", "icon height",
SM_CXCURSOR, "SM_CXCURSOR", "Cursor width",
SM_CYCURSOR, "SM_CYCURSOR", "Cursor height",
SM_CYMENU, "SM_CYMENU", "Menu bar height",
SM_CXFULLSCREEN, "SM_CXFULLSCREEN", "Full-screen client window width",
SM_CYFULLSCREEN, "SM_CYFULLSCREEN", "Full-screen client window height",
SM_CYKANJIWINDOW, "SM_CYKANJIWINDOW", "Kanji window height",
SM_MOUSEPRESENT, "SM_MOUSEPRESENT", "Mouse present flag",
SM_CYVSCROLL, "SM_CYVSCROLL", "vertical scroll arrow height",
SM_CXHSCROLL, "SM_CXHSCROLL", "Horiozntal scroll arrow width",
SM_DEBUG, "SM_DEBUG", "Debug version flag",
SM_SWAPBUTTON, "SM_SWAPBUTTON", "Mouse buttons swapped flag",
SM_RESERVED1, "SM_RESERVED1", "Reserved",
SM_RESERVED2, "SM_RESERVED2", "Reserved",
SM_RESERVED3, "SM_RESERVED3", "Reserved",
SM_RESERVED4, "SM_RESERVED4", "Reserved",
SM_CXMIN, "SM_CXMIN", "Mininum window width",
SM_CYMIN, "SM_CYMIN", "Mininum window height",
SM_CXSIZE, "SM_CXSIZE", "Minimize/Maximize icon width",
SM_CYSIZE, "SM_CYSIZE", "Minimize/Maximize icon height",
SM_CXFRAME, "SM_CXFRAME", "Window frame width",
SM_CYFRAME, "SM_CYFRAME", "Window frame height",
SM_CXMINTRACK, "SM_CXMINTRACK", "Minimize tracking width of window",
SM_CYMINTRACK, "SM_CYMINTRACK", "Minimize tracking height of window",
SM_CMETRICS, "SM_CMETRICS", "Number of system metrics"
};

下面是运行结果:

解决方案

处理滚动条时的常见问题。
就是你首先要有显示内容的大小。其次在 WM_SIZE 中要算出有无水平、竖直滚动条时的4种客户区大小,直接选定1种,设定是否显示滚动条,避免反复调整。最后还要设定一个标志变量,跳过在 WM_SIZE 消息中更改滚动条而再次触发的 WM_SIZE 消息。
最简单的处理方案其实是让滚动条始终显示。

解决方案二:

单步调试一下,看出错的具体语句是什么

时间: 2025-01-07 16:34:24

vs中编写了一个会显示水平和竖直滚动条的程序,但是运行时出现错误的结果,请问这是为啥?的相关文章

myeclipse-MyEclipse中编写的一个完整的jsp程序包括后台文件的运行流程

问题描述 MyEclipse中编写的一个完整的jsp程序包括后台文件的运行流程 一个程序在MyEclipse中的运行流程,也就是先加载那个文件,后运行那个文件,求指点 解决方案 你不如找一本web开发教程的书看看 解决方案二: 去学一下jsp就知道了,,很快的,,

PPT文档中怎么水平或竖直镜像翻转图片?

  PPT文档中怎么水平或竖直镜像翻转图片? 1.首先插入一张图片,这个不多说了.方法有很多,直接拖动图片到PPT相应位置,或者点击插入→图片. 2.选择格式,在格式下面有一个旋转.这个就可以解决常用的水平/竖直翻转图片. 3.如果需要更加精准的调节图片的旋转角度,比如微调一下人脸角度之类的.可以右键图片.选择设置图片格式. 4.在"设置图片格式"中,选择"三维旋转".里面可以进行角度控制的旋转. 5.水平/竖直/按角度旋转都可以. 6.其实最简单最常用的还是图片的

PPT文档中怎么水平或竖直镜像翻转图片

  PPT中如何水平或者竖直镜像翻转图片呢?这个功能可能不常用,但是很有用! 1.首先插入一张图片,这个不多说了.方法有很多,直接拖动图片到PPT相应位置,或者点击插入→图片. 文档中怎么水平或竖直镜像翻转图片-ps镜像翻转"> 2.选择格式,在格式下面有一个旋转.这个就可以解决常用的水平/竖直翻转图片. 3.如果需要更加精准的调节图片的旋转角度,比如微调一下人脸角度之类的.可以右键图片.选择设置图片格式. 4.在"设置图片格式"中,选择"三维旋转"

google地图-如何实现一个能够显示带有经纬度信息的地图的程序

问题描述 如何实现一个能够显示带有经纬度信息的地图的程序 我的意思是这样的: 本地实现一个UI,在窗口中显示某一个特定区域带有经纬度坐标的地图(如下图),然后当鼠标移动到地图中时能实时的显示当前鼠标所指向的经纬度信息.还要求能在地图中根据所给经纬度进行连线(划线)工作. 实现这样的功能一般用什么工具呢? 能使用google earth吗? 解决方案 不知道 你要用什么编程技术实现? 解决方案二: 如果只有这一张图:某一个特定区域带有经纬度坐标的地图,可以考虑按区域统计好经纬度. 这样可以将图分成

api-c#控制系统主音量 画一个主窗体 上面就一个竖直滚动条控件 用它控制音量求代码

问题描述 c#控制系统主音量 画一个主窗体 上面就一个竖直滚动条控件 用它控制音量求代码 音量从0到100 我是新手 网上给的源代码看不懂 直接给出API代码 我都不会用 光给了调音大或者小的代码 但没给直接用数值赋值的方式来调节 而且好像是十六进制的 解决方案 这个只能用windows API.http://m.baidu.com/from=1086k/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1002%2Cta%40iphone_2

锁定ctrl+alt+delete程序,运行时出错。显示:无法加载“native.dll”:找不到指定的模块(异常来自HRESULT:0x8007007E)

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;usingMicrosoft.Win32;usingSystem.Diagnostics;namespaceWorkHelper{classSysHook{[DllImport("user32")]publicstaticexternboolBlock

等待匿名线程-delphi xe中同时等待几个匿名线程,运行时结果错误(没cb了,无法悬赏)

问题描述 delphi xe中同时等待几个匿名线程,运行时结果错误(没cb了,无法悬赏) 我原本是想创建几个线程,同时写如数字在memo中.然后用waitformultipleobjects等待 全部线程全部完成后写入ok.可问题是运行后结果错误如下. (搞到了2cb,如何添加?) 1:等待不到结束线程.超时3秒过后写入ok.然后再写入数字. 2:原本我想写的应该是0-5的数字,可运行后基本是写入6最多. 代码如下.我该如何改?没cb了.请各位不吝赐教. var Testthread: TThr

C#程序在运行时不在任务栏显示运行程序,再自定义通知可以显示

问题描述 本人初学C#,想写一个程序想QQ那样运行时在任务栏没有显示,但在自定义通知里有显示.请问有什么方法可以实现?

J2SE基础之命令行中编写第一个 Hello World_java

大家真正在工作中开发 java 应用都会使用eclipse,myeclipse, IntelliJ等等 不过依然值得花10分钟学习如何使用最原始的命令行格式编译和执行java 程序 使用最原始的命令行方式来执行Hello World 步骤 1 : 先看运行效果 在控制台下运行第一个Java程序,可以看到输入了字符串 hello world 步骤 2 : 准备项目目录 通常都会在e: 创建一个project目录 在这个例子里,我们用的是e:/project/how2java 目录作为项目目录 所有