#include<windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static struct
{
int idStockFont;
TCHAR *szStockFont;
}stockfont[]={
OEM_FIXED_FONT,TEXT("OEM_FIXED_FONT"),
ANSI_FIXED_FONT,TEXT("ANSI_FIXED_FONT"),
ANSI_VAR_FONT,TEXT("ANSI_VAR_FONT"),
DEVICE_DEFAULT_FONT,TEXT("DEVICE_DEFAULT_FONT"),
SYSTEM_FIXED_FONT,TEXT("SYSTEM_FIXED_FONT"),
DEFAULT_GUI_FONT,TEXT("DEFAULT_GUI_FONT")
};
static int iFont,cFont=sizeof(stockfont)/sizeof(stockfont[0]);
HDC hdc;
int i,x,y,cxGrid,cyGrid;
PAINTSTRUCT ps;
TCHAR szFaceName[LF_FACESIZE],szBuffer[LF_FACESIZE+64];
TEXTMETRIC tm;
switch(message)
{
case WM_CREATE:
SetScrollRange(hwnd,SB_VERT,0,cFont-1,true);
return 0;
case WM_DISPLAYCHANGE:
InvalidateRect(hwnd,NULL,true);
return 0;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_TOP: iFont=0;break;
case SB_BOTTOM: iFont=cFont-1;break;
case SB_LINEUP: iFont--;break;
case SB_LINEDOWN: iFont++;break;
case SB_PAGEDOWN: iFont++;break;
case SB_PAGEUP: iFont--;break;
case SB_THUMBPOSITION: iFont=HIWORD(wParam);break; //跟踪当前位置,保存在wParam的高字节
}
iFont=max(0,min(cFont-1,iFont));
SetScrollPos(hwnd,SB_VERT,iFont,true);
InvalidateRect(hwnd,NULL,true);
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_HOME:SendMessage(hwnd,WM_VSCROLL,SB_TOP,0);break;
case VK_END:SendMessage(hwnd,WM_VSCROLL,SB_BOTTOM,0);break;
case VK_PRIOR:
case VK_LEFT:
case VK_UP:SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0);break;
case VK_NEXT:
case VK_RIGHT:
case VK_DOWN:SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0);break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,GetStockObject(stockfont[iFont].idStockFont));
GetTextMetrics(hdc,&tm);
GetTextFace(hdc,LF_FACESIZE,szFaceName); //取得被选进设备环境的字体字样名
cxGrid=max(3*tm.tmAveCharWidth,2*tm.tmMaxCharWidth);
cyGrid=tm.tmHeight+3;
TextOut(hdc,0,0,szBuffer,wsprintf(szBuffer,TEXT("%s:Face Name=%s, CharSet=%i"),stockfont[iFont].szStockFont,szFaceName,tm.tmCharSet));
SetTextAlign(hdc,TA_TOP|TA_CENTER);
for(i=0;i<17;i++)
{
MoveToEx(hdc,(i+2)*cxGrid,2*cyGrid,NULL);
LineTo(hdc,(i+2)*cxGrid,19*cyGrid);
MoveToEx(hdc,cxGrid,(i+3)*cyGrid,NULL);
LineTo(hdc,18*cxGrid,(i+3)*cyGrid);
}
for(i=0;i<16;i++)
{
TextOut(hdc,(2*i+5)*cxGrid/2,2*cyGrid+2,szBuffer,wsprintf(szBuffer,TEXT("%X-"),i));
TextOut(hdc,3*cxGrid/2,(i+3)*cyGrid+2,szBuffer,wsprintf(szBuffer,TEXT("-%X"),i));
}
for(y=0;y<16;y++)
for(x=0;x<16;x++)
{
TextOut(hdc,(2*x+5)*cxGrid/2,(y+3)*cyGrid+2,szBuffer,wsprintf(szBuffer,TEXT("%c"),16*x+y)); //显示ASCII字符
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
static TCHAR szAppName[]=TEXT("STOKFONT");
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=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_VREDRAW|CS_HREDRAW;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("注册窗口类发生错误"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
第六章 STOCKFONT
最新推荐文章于 2020-06-03 14:21:15 发布