继续写……带滚动条的窗口

原创 2012年03月24日 08:45:25

  写完第一个窗口后发现没有滚动条,开始以为不久加个滚动条吗小菜,后来发现我错了,那个叫麻烦啊,而且极易出错,弄了n久终于弄出来了,哎麻烦啊抓狂

老规矩上代码:

#include "stdafx.h"
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevinstance,PSTR szCmdLine,int iCmdShow)
{
    static TCHAR szAppName[]=TEXT("hello windows 7");
    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;
    RegisterClassW(&wndclass);
    hwnd=CreateWindow(szAppName,TEXT("Display"),WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,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 cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
    int  x, y, iVertPos, iHorzPos ;
    HDC hdc;
    PAINTSTRUCT ps;
    SCROLLINFO si ;
    TEXTMETRIC tm ;
    int iLength;
        int a[10][10];
    int i,j;
    for(i=0;i<10;i++)
    {
        a[i][0]=1;
        a[i][i]=1;
    }
    for(i=2;i<10;i++)
        for(j=1;j<i;j++)
            a[i][j]=a[i-1][j]+a[i-1][j-1];
    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) ;
        iMaxWidth=cxChar*60;                return 0;
    case WM_SIZE:
        cxClient = LOWORD (lParam) ;
        cyClient = HIWORD (lParam) ;
        // Set vertical scroll bar range and page size
        si.cbSize = sizeof (si) ;
        si.fMask = SIF_RANGE | SIF_PAGE ;
        si.nMin = 0 ;
        si.nMax =10;
        si.nPage = cyClient / cyChar ;
        SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
        // Set horizontal scroll bar range and page size
        si.cbSize = sizeof (si) ;
        si.fMask = SIF_RANGE | SIF_PAGE |SIF_DISABLENOSCROLL;
        si.nMin = 0 ;
        si.nMax =  2 + iMaxWidth / cxChar;
        si.nPage = cxClient / (cxChar);
        SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
        return 0 ;
    case WM_VSCROLL:
        // Get all the vertical scroll bar information
        si.cbSize = sizeof (si) ;
        si.fMask = SIF_ALL ;
        GetScrollInfo (hwnd, SB_VERT, &si) ;
        // Save the position for comparison later on
        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 ;
        }
        // Set the position and then retrieve it. Due to adjustments
        // by Windows it may not be the same as the value set.
        si.fMask = SIF_POS ;
        SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
        GetScrollInfo (hwnd, SB_VERT, &si) ;
        // If the position has changed, scroll the window and update it
        if (si.nPos != iVertPos)
        {
        ScrollWindow (hwnd, 0, cyChar * (iVertPos - si.nPos),
        NULL, NULL) ;
        UpdateWindow (hwnd) ;
        }
        return 0 ;
    case WM_HSCROLL:
        // Get all the vertical scroll bar information
        si.cbSize = sizeof (si) ;
        si.fMask = SIF_ALL ;
        // Save the position for comparison later on
        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_THUMBTRACK:
        si.nPos = si.nTrackPos ;
        break ;
        default :
        break ;
        }
        // Set the position and then retrieve it. Due to adjustments
        // by Windows it may not be the same as the value set.
        si.fMask = SIF_POS ;
        SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
        GetScrollInfo (hwnd, SB_HORZ, &si) ;
        // If the position has changed, scroll the window
        if (si.nPos != iHorzPos)
        {
        ScrollWindow (hwnd, cxChar* (iHorzPos - si.nPos), 0,
        NULL, NULL) ;
        }
        return 0 ;

        case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
SendMessage (hwnd, WM_VSCROLL, SB_LINEUP, 0) ;
break ;
case VK_DOWN:
SendMessage (hwnd, WM_VSCROLL, SB_LINEDOWN, 0) ;
break ;
case VK_LEFT:
SendMessage (hwnd, WM_HSCROLL, SB_PAGEUP, 0) ;
break ;
case VK_RIGHT:
SendMessage (hwnd, WM_HSCROLL, SB_PAGEDOWN, 0) ;
break ;
}
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 ;
        // Get horizontal scroll bar position
        GetScrollInfo (hwnd, SB_HORZ, &si) ;
        iHorzPos = si.nPos ;
        int j;TCHAR szBuffer[10] ;
        for(i=0;i<10;i++)
            {
                y = cyChar * (i - iVertPos) ;
            for(j=0;j<=i;j++)
                {
                    x = cxChar * (j*6 - iHorzPos) ;
                iLength = wsprintf (szBuffer, TEXT ("%i"),a[i][j]);
                TextOut(hdc,x,y,szBuffer,iLength);
                
                }
            }
            
        
        EndPaint(hwnd,&ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}





Java对已有的文件续写操作FileWriter

FileWriter对已有的文件续写操作
  • hoho_12
  • hoho_12
  • 2016年05月04日 21:41
  • 2265

继续写

有好一阵子没写博,关于技术的。感觉,自己有一些领悟的话,及时的分享,可以让更多热爱技术的菜鸟们少走一些弯路,何乐不为。以后打算多发点时间,写一写 ...
  • zhouchengzu
  • zhouchengzu
  • 2010年06月10日 15:14
  • 138

java关于读取数据后简单写入一个文件中的总结

首先,写入文件有以下几种方法:           1) File file = new File(path);                    1.判断内存当中是否存在该文件,没有,则添加...
  • qq_33919114
  • qq_33919114
  • 2016年02月26日 15:14
  • 245

在result中还可以使用${属性名}表达式访问action中的属性

总结:     (1)对于Action中的属性,可以通过两种方式设值:一是在Action中直接赋值,二是在struts2的配置文件中为Action的属性注入值。如:                  ...
  • xh16319
  • xh16319
  • 2012年10月04日 21:54
  • 3049

qt 窗口的缩放和滚动条的使用

//窗口的缩放和滚动条的使用 #include #include #include #include #include #include #include #include #inc...
  • zhangbinsijifeng
  • zhangbinsijifeng
  • 2015年06月05日 14:35
  • 1443

OpenCV学习笔记(21)在OpenCV窗口中创建滚动条浏览大图

很久没发博客了,趁着近期项目需要,再和大家分享一个小程序,即在OpenCV窗口中创建水平、竖直滚动条来浏览大型图像。如果我们所要显示的图像像素较高,例如1440*900的,而显示器只有 1280*80...
  • chenyusiyuan
  • chenyusiyuan
  • 2011年06月24日 12:45
  • 14856

继续写博客,坚持。

      第一次写博客应该是大三的时候,那时坚持了几个月,也就不更新了,又是一次虎头蛇尾的工程。有时觉的自己太没有恒心了,这么容易就放弃是很难做成一件事的。这次看了《一公升的眼泪》,女主人公池内亚 ...
  • dfqiao1314
  • dfqiao1314
  • 2007年07月22日 23:50
  • 342

这两天继续写~(图)

        经过昨晚艰苦奋斗直到第二天早上6点左右,完成了管理系统的最重要部分-产品管理中心,嘻嘻,感觉还不错,所以贴一些图上来,以作纪念~  ...
  • yxz149
  • yxz149
  • 2006年03月25日 16:00
  • 721

继续写blog

许久不写blog了,7月上班,上班的时候,晚上精力和情绪不佳,python放一边了(大家可以上http://www.codecademy.com/学python),以后应该每周六都有一篇blog。 ...
  • baidang201
  • baidang201
  • 2013年08月13日 22:00
  • 342

继续写博客

说来也有一段时间没写博客了,一是因为培训,还有一个原因是前段时间实在是太忙了。现在开始继续我的博客,继续分享技术、生活等等。也希望能凭借这个平台交到更多的朋友(PS:CSDN的新版博客还是挺友好的)...
  • snoopy93
  • snoopy93
  • 2014年02月15日 16:35
  • 622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:继续写……带滚动条的窗口
举报原因:
原因补充:

(最多只允许输入30个字)