• 用白色画笔再画一遍,代替擦除


    windows程序设计里面,画贝塞尔曲线的程序

    看到它对鼠标点击之后,重画曲线的处理方法:

    首先设置画笔为白色,重画一遍(相当于把原来的擦除了)

    然后更新新的坐标,把画壁设为黑色

    再画一遍

    觉得这真是一个新奇的思路

    代码如下:

      1 /*---------------------------------------
      2    BEZIER.C -- Bezier Splines Demo
      3                (c) Charles Petzold, 1998
      4   ---------------------------------------*/
      5 
      6 #include <windows.h>
      7 
      8 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
      9 
     10 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
     11                     PSTR szCmdLine, int iCmdShow)
     12 {
     13      static TCHAR szAppName[] = TEXT ("Bezier") ;
     14      HWND         hwnd ;
     15      MSG          msg ;
     16      WNDCLASS     wndclass ;
     17      
     18      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     19      wndclass.lpfnWndProc   = WndProc ;
     20      wndclass.cbClsExtra    = 0 ;
     21      wndclass.cbWndExtra    = 0 ;
     22      wndclass.hInstance     = hInstance ;
     23      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     24      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     25      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     26      wndclass.lpszMenuName  = NULL ;
     27      wndclass.lpszClassName = szAppName ;
     28      
     29      if (!RegisterClass (&wndclass))
     30      {
     31           MessageBox (NULL, TEXT ("Program requires Windows NT!"), 
     32                       szAppName, MB_ICONERROR) ;
     33           return 0 ;
     34      }
     35      
     36      hwnd = CreateWindow (szAppName, TEXT ("Bezier Splines"),
     37                           WS_OVERLAPPEDWINDOW,
     38                           CW_USEDEFAULT, CW_USEDEFAULT,
     39                           CW_USEDEFAULT, CW_USEDEFAULT,
     40                           NULL, NULL, hInstance, NULL) ;
     41      
     42      ShowWindow (hwnd, iCmdShow) ;
     43      UpdateWindow (hwnd) ;
     44      
     45      while (GetMessage (&msg, NULL, 0, 0))
     46      {
     47           TranslateMessage (&msg) ;
     48           DispatchMessage (&msg) ;
     49      }
     50      return msg.wParam ;
     51 }
     52 
     53 void DrawBezier (HDC hdc, POINT apt[])
     54 {
     55      PolyBezier (hdc, apt, 4) ;
     56      
     57      MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;
     58      LineTo   (hdc, apt[1].x, apt[1].y) ;
     59      
     60      MoveToEx (hdc, apt[2].x, apt[2].y, NULL) ;
     61      LineTo   (hdc, apt[3].x, apt[3].y) ;
     62 }
     63 
     64 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     65 {
     66      static POINT apt[4] ;
     67      HDC          hdc ;
     68      int          cxClient, cyClient ;
     69      PAINTSTRUCT  ps ;
     70      
     71      switch (message)
     72      {
     73      case WM_SIZE:
     74           cxClient = LOWORD (lParam) ;
     75           cyClient = HIWORD (lParam) ;
     76           
     77           apt[0].x = cxClient / 4 ;
     78           apt[0].y = cyClient / 2 ;
     79           
     80           apt[1].x = cxClient / 2 ;
     81           apt[1].y = cyClient / 4 ;
     82           
     83           apt[2].x =     cxClient / 2 ;
     84           apt[2].y = 3 * cyClient / 4 ;
     85           
     86           apt[3].x = 3 * cxClient / 4 ;
     87           apt[3].y =     cyClient / 2 ;
     88           
     89           return 0 ;
     90 
     91      case WM_LBUTTONDOWN:
     92      case WM_RBUTTONDOWN:
     93      case WM_MOUSEMOVE:
     94           if (wParam & MK_LBUTTON || wParam & MK_RBUTTON)
     95           {
     96                hdc = GetDC (hwnd) ;
     97                
     98                //擦除原来的线条
     99                SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
    100                DrawBezier (hdc, apt) ;
    101                
    102                if (wParam & MK_LBUTTON)
    103                {
    104                     apt[1].x = LOWORD (lParam) ;
    105                     apt[1].y = HIWORD (lParam) ;
    106                }
    107                
    108                if (wParam & MK_RBUTTON)
    109                {
    110                     apt[2].x = LOWORD (lParam) ;
    111                     apt[2].y = HIWORD (lParam) ;
    112                }
    113                
    114                //画出新的线条
    115                SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
    116                DrawBezier (hdc, apt) ;
    117                ReleaseDC (hwnd, hdc) ;
    118           }
    119           return 0 ;
    120           
    121      case WM_PAINT:
    122           InvalidateRect (hwnd, NULL, TRUE) ;
    123           
    124           hdc = BeginPaint (hwnd, &ps) ;
    125           
    126           DrawBezier (hdc, apt) ;
    127           
    128           EndPaint (hwnd, &ps) ;
    129           return 0 ;
    130           
    131      case WM_DESTROY:
    132           PostQuitMessage (0) ;
    133           return 0 ;
    134      }
    135      return DefWindowProc (hwnd, message, wParam, lParam) ;
    136 }
  • 相关阅读:
    Redis 学习目录
    Knockout 官网学习文档目录
    C# 知识点回忆..
    爬虫-HtmlAgilityPack
    net core 3.1 知识累积
    共享文件夹(局域网)报错:The username or password is incorrect
    使用 Beyond Compare 工具比较合并 TFS 管理的代码
    创建索引,SQL优化
    LINQ SelectMany代替for循环赋值,把联合查询的值赋值给第1个集合
    判断文件编码
  • 原文地址:https://www.cnblogs.com/02xiaoma/p/2543354.html
Copyright © 2020-2023  润新知