|||
//---------------------------------------------------------
// 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);
}
//---------------------------------------------------------
注释:代码是书上的,注解是自己写的!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 07:03
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社