text 03 源代码

#include <windows.h>
#include <tchar.h>
#include "sysmets.h"

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{
 static TCHAR szAppName[] = TEXT("Text 03");
 HWND  hwnd  = NULL;
 MSG  msg  = {0};
 WNDCLASS wndclass = {0};

 //initlization 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_HREDRAW | CS_VREDRAW;

 //Register class
 if (!RegisterClass(&wndclass))
 {
  MessageBox(hwnd, TEXT("Program requird Win NT"), TEXT("text 03"), MB_ICONERROR);

  return 0;
 }

 hwnd = CreateWindow(szAppName, TEXT("text 03"), WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, 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 (int)msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 static int cxChar  = 0;
 static int cxCaps  = 0;
 static int cyChar  = 0;
 static int cxClient = 0;
 static int cyClient = 0;
 static int nMaxWidth = 0;

 HDC  hdc  = NULL;

 int  i  = 0;
 int  x  = 0;
 int  y  = 0;
 int  nVertPos = 0;
 int  nHorzPos = 0;
 int  nPaintBeg = 0;
 int  nPaintEnd = 0;

 PAINTSTRUCT ps  = {0};
 SCROLLINFO si  = {0};
 TCHAR  szBuffer[10] = "/0";
 TEXTMETRIC tm  = {0};


 switch (message)
 {
  case WM_CREATE:
  {
   hdc = GetDC(hwnd);

   GetTextMetrics(hdc, &tm);
   
   cxChar = tm.tmAveCharWidth;
   cyChar = tm.tmHeight + tm.tmExternalLeading;
   cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

   ReleaseDC(hwnd, hdc);

   nMaxWidth = 40 * cxChar + 22 * cxCaps;
  }

  return 0;

  case WM_SIZE:
  {
   cxClient = LOWORD(lParam);
   cyClient = HIWORD(lParam);

   si.cbSize = sizeof(si);
   si.fMask = SIF_RANGE | SIF_PAGE;
   si.nMin = 0;
   si.nMax = NUMLINES - 1;
   si.nPage = cyClient / cyChar;

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

   si.cbSize = sizeof(si);
   si.fMask = SIF_RANGE | SIF_PAGE;
   si.nMin = 0;
   si.nMax = 2 + nMaxWidth / cxChar;
   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);

   nVertPos = 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 != nVertPos)
   {
    ScrollWindow(hwnd, 0, cyChar * (nVertPos - si.nPos), NULL, NULL);
    UpdateWindow(hwnd);
   }
  }

  return 0;
    
  case WM_HSCROLL:
  {
   si.cbSize = sizeof (si) ;
   si.fMask  = SIF_ALL ;

   GetScrollInfo (hwnd, SB_HORZ, &si) ;
   nHorzPos = 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 != nHorzPos)
   {
    ScrollWindow (hwnd, cxChar * (nHorzPos - si.nPos), 0, NULL, NULL) ;
   }
  }
   
   return 0 ;

  case WM_PAINT :
  {
   hdc = BeginPaint (hwnd, &ps) ;
                       
   si.cbSize = sizeof (si) ;
   si.fMask  = SIF_POS ;
   GetScrollInfo (hwnd, SB_VERT, &si) ;
   nVertPos = si.nPos ;
                       
   GetScrollInfo (hwnd, SB_HORZ, &si) ;
   nHorzPos = si.nPos ;
                       
   nPaintBeg = max (0, nVertPos + ps.rcPaint.top / cyChar) ;
   nPaintEnd = min (NUMLINES - 1, nVertPos + ps.rcPaint.bottom / cyChar);
                       
   for (i = nPaintBeg ; i <= nPaintEnd ; i++)
   {
    x = cxChar * (1 - nHorzPos) ;
    y = cyChar * (i - nVertPos) ;
                               
    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) ;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值