VC++记事本程序

作者在 2013-02-01 16:14:51 发布以下内容

亲们,这是一个简单的记事本程序,但是第二行代码#define BUFFER(x,y) * (pBuffer + y * cxBuffer + x)是什么意思,到都有什么用途请详细解答。拜托哦

 

#include<windows.h>

#define BUFFER(x,y) * (pBuffer + y * cxBuffer + x)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
     HWND         hwnd;
     WNDCLASS     wndclass;
  MSG msg;
    
     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 = "文本编辑器";
    
     RegisterClass (&wndclass);
     hwnd = CreateWindow("文本编辑器", "文本编辑器",WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
                          CW_USEDEFAULT, 0,600, 500,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 DWORD   dwCharSet = DEFAULT_CHARSET;   //1
     static int     cxChar, cyChar, cxClient, cyClient, cxBuffer, cyBuffer, xCaret, yCaret;
     static TCHAR  *pBuffer = NULL;
     HDC            hdc;
     int            x, y, i;
     PAINTSTRUCT    ps;
     TEXTMETRIC     tm;
  HFONT          ft;  //字体句柄
  HGDIOBJ        GD,gd;
  static  int  V_ScrollValue, H_ScrollValue;
    
     switch(message)
     {
     case WM_INPUTLANGCHANGE:
          dwCharSet = wParam;                               // fall through
     case WM_CREATE:
    SetScrollRange(hwnd,SB_VERT,0,30,FALSE);
    SetScrollRange(hwnd,SB_HORZ,0,30,FALSE);
    SetScrollPos(hwnd,SB_VERT,0,TRUE);
    SetScrollPos(hwnd,SB_HORZ,0,TRUE);
          hdc = GetDC(hwnd);
    ft  = CreateFont(0, 0, 0, 0, 0, 0, 0, 0,dwCharSet, 0, 0, 0, FIXED_PITCH, NULL);
                   //返回一个当前字体的句柄          //1                    //1
    SelectObject(hdc,ft);
          GetTextMetrics(hdc, &tm);
          cxChar = tm.tmAveCharWidth;
          cyChar = tm.tmHeight;
    GD = GetStockObject(SYSTEM_FONT);//获取固定字体
    gd = SelectObject(hdc, GD);      //字体写入环境中
          DeleteObject(gd);
          ReleaseDC(hwnd, hdc);            // fall through               
     case WM_SIZE:
    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);
          // calculate window size in characters
          cxBuffer = max(1, cxClient / cxChar);//当前窗口每行可以写入字体的个数
          cyBuffer = max(1, cyClient / cyChar);
          // allocate memory for buffer and clear it
          if(pBuffer != NULL)
     free(pBuffer);
          pBuffer = (TCHAR *)malloc(cxBuffer*cyBuffer*sizeof(TCHAR)); 
          for(y = 0; y < cyBuffer; y++)
     for(x = 0; x < cxBuffer; x++)
      BUFFER(x,y) = ' '; 
          // set caret to upper left corner
          xCaret = 0;
          yCaret = 0;
                   
          if(hwnd == GetFocus())//GetFocus()函数没参数返回一个句柄
               SetCaretPos(xCaret * cxChar, yCaret * cyChar);

          InvalidateRect(hwnd, NULL, TRUE);
          return 0 ;       
     case WM_SETFOCUS:
          CreateCaret(hwnd, NULL, cxChar, cyChar);//创建插入符
          SetCaretPos(xCaret * cxChar, yCaret * cyChar);
          ShowCaret (hwnd);
          return 0;
     case WM_KILLFOCUS:
          // hide and destroy the caret
          HideCaret(hwnd);
          DestroyCaret();
          return 0;
  case WM_VSCROLL:
    switch(LOWORD(wParam))
    {
    case SB_LINEDOWN:
     V_ScrollValue += 1;
     //yCaret += cyChar;
     break;
    case SB_LINEUP:
     V_ScrollValue -= 1;
     break;
    case SB_PAGEUP:
     V_ScrollValue -= 5;
     break;
    case SB_PAGEDOWN:
     V_ScrollValue += 5;
     break;
    case SB_THUMBTRACK:
     V_ScrollValue = HIWORD(wParam);
     break;
    }
    SetScrollPos(hwnd,SB_VERT,V_ScrollValue,TRUE);
    InvalidateRect(hwnd,NULL,TRUE);
    return 0;
  case WM_HSCROLL:
    switch(LOWORD(wParam))
    {
    case SB_LINELEFT:
     H_ScrollValue -= 1;
     break;
    case SB_LINERIGHT:
     H_ScrollValue += 1;
     break;
    case SB_PAGELEFT:
     H_ScrollValue -= 5;
     break;
    case SB_PAGERIGHT:
     H_ScrollValue += 5;
     break;
    case SB_THUMBTRACK:
     H_ScrollValue = HIWORD(wParam);
     break;
    }
    SetScrollPos(hwnd,SB_HORZ,H_ScrollValue,TRUE);
    InvalidateRect(hwnd,NULL,TRUE);
    return 0;
     case WM_KEYDOWN:
          switch(wParam)
          {
          case VK_HOME:
               xCaret = 0;
               break;  
          case VK_END:
               xCaret = cxBuffer - 1;
               break;
          case VK_PRIOR:
               yCaret = 0;
               break;
          case VK_NEXT:
               yCaret = cyBuffer - 1;
               break;
              
          case VK_LEFT:
               xCaret = max(xCaret - 1, 0);
               break;
              
          case VK_RIGHT:
               xCaret = min(xCaret + 1, cxBuffer - 1);
               break;
          case VK_UP:
               yCaret = max(yCaret - 1, 0);
               break;
          case VK_DOWN:
               yCaret = min(yCaret + 1, cyBuffer - 1);
               break;
          case VK_DELETE:
               for(x = xCaret; x < cxBuffer - 1; x++)
                    BUFFER(x, yCaret) = BUFFER(x + 1, yCaret);
              
               BUFFER(cxBuffer - 1, yCaret) = ' ';
               HideCaret(hwnd);
               hdc = GetDC(hwnd);
               SelectObject(hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
                   
               TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret),cxBuffer - xCaret);

               DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
               ReleaseDC(hwnd, hdc);
               ShowCaret(hwnd);
               break;
          }
          SetCaretPos(xCaret * cxChar, yCaret * cyChar);
          return 0;
         
     case WM_CHAR:
          for(i = 0; i < (int)LOWORD(lParam); i++)
          {
               switch(wParam)
               {
               case '\b':                    // backspace
                    if (xCaret > 0)
                    {
                         xCaret--;
                         SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1);
                    }
                    break;
                   
               case '\t':                    // tab
                    do
                    {
                         SendMessage(hwnd, WM_CHAR, ' ', 1);
                    }
                    while (xCaret % 8 != 0);
                    break;
                   
               case '\n':                    // line feed换行
                    if (++yCaret == cyBuffer)
                         yCaret = 0;
                    break;
                   
               case '\r':                    // carriage return回车
                    xCaret = 0;
                   
                    if (++yCaret == cyBuffer)
                         yCaret = 0;
                    break;
                   
               case '\x1B':                  // escape   ESC键
                    for (y = 0; y < cyBuffer; y++)
                         for (x = 0; x < cxBuffer; x++)
                              BUFFER (x, y) = ' ';
                        
                    xCaret = 0;
                    yCaret = 0;
                        
                    InvalidateRect(hwnd, NULL, TRUE);
                    break;
                        
               default:                      // character codes
                    BUFFER(xCaret, yCaret) = (TCHAR)wParam;
                    HideCaret(hwnd);
                    hdc = GetDC(hwnd);
                    SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0,dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
                    TextOut(hdc, xCaret * cxChar, yCaret * cyChar,& BUFFER(xCaret, yCaret), 1);
                    DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
                    ReleaseDC(hwnd, hdc);
                    ShowCaret(hwnd);

                    if(++xCaret == cxBuffer)
                    {
                         xCaret = 0;
                         if(++yCaret == cyBuffer)
                              yCaret = 0;
                    }
                    break;
               }
          }
          SetCaretPos(xCaret * cxChar, yCaret * cyChar);
          return 0;
     case WM_PAINT:
          hdc = BeginPaint(hwnd, &ps);
          SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0,dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));                      
          for (y = 0; y < cyBuffer; y++)
               TextOut(hdc, 0, y * cyChar, &BUFFER(0,y), cxBuffer);

          DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
          EndPaint(hwnd, &ps);
          return 0;
         
     case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
     }
     return DefWindowProc (hwnd, message, wParam, lParam);
}

VC++ | 阅读 2696 次
文章评论,共0条
游客请输入验证码
文章归档