第五章 繪圖基礎(BEZIER)

来源:https://www.cnblogs.com/web1013/archive/2018/04/27/8961124.html
-Advertisement-
Play Games

1 /* 2 BEZIER.C -- Bezier Splines Demo 3 (c) Charles Petzold, 1998 4 */ 5 6 #include <Windows.h> 7 8 LRESULT CALLBACK WndPorc(HWND, UINT, WPARAM, LPAR ...


  1 /*-----------------------------
  2 BEZIER.C -- Bezier Splines Demo
  3 (c) Charles Petzold, 1998
  4 -----------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 LRESULT CALLBACK WndPorc(HWND, UINT, WPARAM, LPARAM);
  9 
 10 int WINAPI WinMain( __in HINSTANCE hInstance
 11                     , __in_opt HINSTANCE hPrevInstance
 12                     , __in LPSTR lpCmdLine
 13                     , __in int nShowCmd )
 14 {
 15     static TCHAR szAppName[] = TEXT("Bezier");
 16     HWND hwnd;
 17     MSG msg;
 18     WNDCLASS wndclass;
 19 
 20     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 21     wndclass.lpfnWndProc = WndPorc;
 22     wndclass.cbClsExtra = 0;
 23     wndclass.cbWndExtra = 0;
 24     wndclass.hInstance = hInstance;
 25     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 26     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 27     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 28     wndclass.lpszMenuName = NULL;
 29     wndclass.lpszClassName = szAppName;
 30 
 31     if (!RegisterClass(&wndclass))
 32     {
 33         MessageBox(NULL, TEXT("Program requires Windows NT!")
 34             , szAppName, MB_ICONERROR);
 35         return 0;
 36     }
 37 
 38     hwnd = CreateWindow(szAppName, TEXT("Bezier Splines")
 39         , WS_OVERLAPPEDWINDOW
 40         , CW_USEDEFAULT, CW_USEDEFAULT
 41         , CW_USEDEFAULT, CW_USEDEFAULT
 42         , NULL, NULL, hInstance, NULL);
 43 
 44     ShowWindow(hwnd, nShowCmd);
 45     UpdateWindow(hwnd);
 46 
 47     while (GetMessage(&msg, NULL, 0, 0))
 48     {
 49         TranslateMessage(&msg);
 50         DispatchMessage(&msg);
 51     }
 52 
 53     return msg.wParam;
 54 }
 55 
 56 void DrawBezier(HDC hdc, POINT apt[])
 57 {
 58     PolyBezier(hdc, apt, 4);
 59 
 60     MoveToEx(hdc, apt[0].x, apt[0].y, NULL);
 61     LineTo(hdc, apt[1].x, apt[1].y);
 62 
 63     MoveToEx(hdc, apt[2].x, apt[2].y, NULL);
 64     LineTo(hdc, apt[3].x, apt[3].y);
 65 }
 66 
 67 LRESULT CALLBACK WndPorc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 68 {
 69     static POINT apt[4];
 70     HDC hdc;
 71     int cxClient, cyClient;
 72     PAINTSTRUCT ps;
 73 
 74     switch (message)
 75     {
 76     case WM_SIZE:
 77         cxClient = LOWORD(lParam);
 78         cyClient = HIWORD(lParam);
 79 
 80         apt[0].x = cxClient / 4;
 81         apt[0].y = cyClient / 2;
 82         
 83         apt[1].x = cxClient / 2;
 84         apt[1].y = cyClient / 4;
 85 
 86         apt[2].x = cxClient / 2;
 87         apt[2].y = 3 * cyClient / 4;
 88 
 89         apt[3].x = 3 * cxClient / 4;
 90         apt[3].y = cyClient / 2;
 91 
 92         return 0;
 93 
 94     case WM_LBUTTONDOWN:
 95     case WM_RBUTTONDOWN:
 96     case WM_MOUSEMOVE:
 97         if (wParam & MK_LBUTTON || wParam & MK_RBUTTON)
 98         {
 99             hdc = GetDC(hwnd);
100             SelectObject(hdc, GetStockObject(WHITE_PEN));
101 
102             DrawBezier(hdc, apt);
103 
104             if (wParam & MK_LBUTTON)
105             {
106                 apt[1].x = LOWORD(lParam);
107                 apt[1].y = HIWORD(lParam);
108             }
109 
110             if (wParam & MK_RBUTTON)
111             {
112                 apt[2].x = LOWORD(lParam);
113                 apt[2].y = HIWORD(lParam);
114             }
115 
116             SelectObject(hdc, GetStockObject(BLACK_PEN));
117 
118             DrawBezier(hdc, apt);
119 
120             ReleaseDC(hwnd, hdc);
121         }
122         return 0;
123 
124     case WM_PAINT:
125         InvalidateRect(hwnd, NULL, TRUE);
126         hdc = BeginPaint(hwnd, &ps);
127 
128         DrawBezier(hdc, apt);
129 
130         EndPaint(hwnd, &ps);
131         return 0;
132 
133     case WM_DESTROY:
134         PostQuitMessage(0);
135         return 0;
136     }
137 
138     return DefWindowProc(hwnd, message, wParam, lParam);
139 }
BEZIER.C

BEZIER程式的顯示結果


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天用U盤的時候不小心感染上了病毒,用自己的電腦打開後裡面只剩下一個U盤的快捷方式,選中顯示隱藏文件之後依然沒有任何顯示,但是查看U盤的屬性的時候可以看到,U盤已經使用了300多M,所以就上網查了一下顯示被隱藏文件的方法,試了一些沒有用,這裡寫下自己試過之後有用的解決方法 1、新建文本文檔,寫入以 ...
  • vi命令是UNIX操作系統和類UNIX操作系統中最通用的全屏幕純文本編輯器。Linux中的vi編輯器叫vim,它是vi的增強版(vi Improved),與vi編輯器完全相容,而且實現了很多增強功能。 在此記錄vi編輯器一些使用技巧,方便後續進行日誌查詢。 From:linux中常用的幾個命令技巧 ...
  • Docker 第一篇 認識Docker 的作用好處 (1)什麼是Docker (2)Docker 優勢劣勢 Docker是去年開始關註並學習的,因為項目用到了AspnetCore 瞭解了之後總感覺會用到DocKer,我就先學習了,每天熬夜去學去瞭解,看玩笑的是到現在都沒有用到,不過寫下來做個記錄有天 ...
  • 一定要先學會的指令:ls, more, cd, pwd, rpm, ifconfig, find 登入與登出(開機與關機):telnet, login, exit, shoudown, reboot Linux 多人多工與背景執行功能:& 與 [ctrl]+[z], fg, ps, kill 檔案與 ...
  • centos系統中文支持配置: 1.系統中必須安裝中文語言包 yum -y groupinstall chinese-support 2.修改環境變數 vi $HOME/.bash_profile export LANG="zh_CN.UTF-8" 使環境變數生效:source $HOME/.bas ...
  • 前提是已經安裝好了zk集群 1.下載 kafka_2.11-1.0.0.tgz 下載網址 http://kafka.apache.org/documentation.html 2.解壓 tar -zxvf kafka_2.11-1.0.0.tgz 3.修改配置文件 進入config目錄修改serve ...
  • 1.進入linux命令行,輸入cd /進入到根目錄,然後再輸入ll,查看列表信息 說明:比如:dr-xr-xr-x. 2 root root 4096 4月 26 12:53 bin,第一個d:表示directory,文件夾,-表示普通的二進位文件,l表示link,表示軟鏈接文件,類似於window ...
  • 一、未安裝GCC 解決方法:執行yum install gcc-c++命令安裝GCC,完成後再次執行make命令 Linux無法連接網路 http://www.cnblogs.com/guoxiangyue/p/8916854.html 二、jemalloc/jemalloc.h 問題 信息顯示出現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...