cwhe10的个人博客分享 http://blog.sciencenet.cn/u/cwhe10

博文

0020:Windows程序设计-滚动条使用(第四章)

已有 2589 次阅读 2016-12-2 20:57 |个人分类:科学研究|系统分类:科研笔记| win32

//---------------------------------------------------------

// windows程序设计一书所有仿真例子-何成文,2016-12-1

//---------------------------------------------------------

#include <windows.h>

#include "SYSMETS.h"


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


int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("HelloWin");

HWND hwnd;

MSG msg;

WNDCLASS wndclass;


wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.hInstance=NULL;

wndclass.lpfnWndProc=WndProc;

wndclass.lpszClassName=szAppName;

wndclass.lpszMenuName=NULL;

wndclass.style=CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("this program requires Windows NT"),szAppName,MB_ICONERROR);

}


hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),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)

{

HDC hdc;

int i,y,x,iVertPos,iHorzPos,iPaintBeg,iPaintEnd;

static int cxChar,cxCaps,cyChar,cxClient,cyClient,iVscrollPos,iMaxWidth;

TCHAR szBuffer [10];

TEXTMETRIC tm;

PAINTSTRUCT ps;

RECT rect;

SCROLLINFO si;


switch(message)

{

case WM_CREATE:

hdc=GetDC(hwnd);//得到设备环境句柄


GetTextMetrics(hdc,&tm);//得到窗口字体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:

cyClient=HIWORD(lParam);//客户区高度

cxClient=LOWORD(lParam);//客户区宽度


si.cbSize=sizeof(si);

si.fMask=SIF_RANGE|SIF_PAGE;//这个滚动条参数设置很重要

si.nMax=NUMLINES-1;//滚动条最大值

si.nMin=0;//滚动条初值

si.nPage=cyClient/cyChar;//滚动条翻页跳过的值

SetScrollInfo(hwnd,SB_VERT,&si,TRUE);//设置垂直滚动条


si.cbSize=sizeof(si);

si.fMask=SIF_RANGE|SIF_PAGE;

si.nMax=2+iMaxWidth/cxChar;

si.nMin=0;

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;//记录滚动条初值


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);//配套使用,同时产生WM_PAINT消息进行无效区的重绘

}

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);

UpdateWindow(hwnd);

}

return 0;


case WM_PAINT:

hdc=BeginPaint(hwnd,&ps);

si.cbSize=sizeof(si);

si.fMask=SIF_POS;


SetScrollInfo(hwnd,SB_VERT,&si,TRUE);

GetScrollInfo(hwnd,SB_VERT,&si);

iVertPos=si.nPos;//得到目前垂直滚动条位置

SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);

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++)

{

y=cyChar*(i-iVertPos);//重绘y坐标起点

x=cxChar*(1-iHorzPos);//重绘X坐标起点


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].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);

}

//---------------------------------------------------------

注释:代码是书上的,注解是自己写的!




https://wap.sciencenet.cn/blog-2777453-1018291.html

上一篇:0018:C++数组指针使用案例
下一篇:0024:《时频分析与小波变换》一本学习小波分析较好的书籍
收藏 IP: 116.1.3.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-3-29 08:08

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部