第五章 繪圖基礎(ALTWIND)

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

線上箭頭表示畫線的方向。WINDING模式和ALTERNATE模式都會填充三個封閉的L型區域,號碼從1到3。兩個更小的內部區域,號碼為4和5,在ALTERNATE模式下不被填充。但是在WINDING模式下,號碼5的區域會被填充,這是因為區域的內部到達圖形的外部必須穿過兩條相同方向的線。號碼為4的區域 ...


線上箭頭表示畫線的方向。WINDING模式和ALTERNATE模式都會填充三個封閉的L型區域,號碼從1到3。兩個更小的內部區域,號碼為4和5,在ALTERNATE模式下不被填充。但是在WINDING模式下,號碼5的區域會被填充,這是因為區域的內部到達圖形的外部必須穿過兩條相同方向的線。號碼為4的區域不會被填充,因為射線必須穿越兩條邊框線,但是這兩條邊框線的繪製方向相反。

  1 /*-------------------------------------------
  2 ALTWIND.C -- Alternate and Winding Fill Modes
  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( __in HINSTANCE hInstance
 11                     , __in_opt HINSTANCE hPrevInstance
 12                     , __in LPSTR lpCmdLine
 13                     , __in int nShowCmd )
 14 {
 15     static TCHAR szAppName[] = TEXT("AltWind");
 16     HWND hwnd;
 17     MSG msg;
 18     WNDCLASS wndclass;
 19 
 20     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 21     wndclass.lpfnWndProc = WndProc;
 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("Alternate and Winding Fill Modes")
 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 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 57 {
 58     static POINT aptFigure[10] = {10, 70
 59                                 , 50, 70
 60                                 , 50, 10
 61                                 , 90, 10
 62                                 , 90, 50
 63                                 , 30, 50
 64                                 , 30, 90
 65                                 , 70, 90
 66                                 , 70, 30
 67                                 , 10, 30};
 68     static int cxClient, cyClient;
 69     HDC hdc;
 70     int i;
 71     PAINTSTRUCT ps;
 72     POINT apt[10];
 73 
 74     switch (message)
 75     {
 76     case WM_SIZE:
 77         cxClient = LOWORD(lParam);
 78         cyClient = HIWORD(lParam);
 79         return 0;
 80 
 81     case WM_PAINT:
 82         hdc = BeginPaint(hwnd, &ps);
 83         SelectObject(hdc, GetStockObject(GRAY_BRUSH));
 84 
 85         for (i = 0; i !=10; ++i)
 86         {
 87             apt[i].x = cxClient * aptFigure[i].x / 200;
 88             apt[i].y = cyClient * aptFigure[i].y / 100;
 89         }
 90         SetPolyFillMode(hdc, ALTERNATE);
 91         Polygon(hdc, apt, 10);
 92 
 93         for (i = 0; i != 10; ++i)
 94         {
 95             apt[i].x += cxClient / 2;
 96         }
 97         SetPolyFillMode(hdc, WINDING);
 98         Polygon(hdc, apt, 10);
 99 
100         EndPaint(hwnd, &ps);
101         return 0;
102 
103     case WM_DESTROY:
104         PostQuitMessage(0);
105         return 0;
106     }
107 
108     return DefWindowProc(hwnd, message, wParam, lParam);
109 }
ALTWIND.C

圖形的坐標(按一個100*100單位的區域設定)存儲在aptFigure數組中。這些坐標會根據客戶去的寬度和高度按比例縮放。程式顯示兩個圖形,一個使用ALTERNATE填充模式,另一個使用WINDING填充模式。結果如圖:


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

-Advertisement-
Play Games
更多相關文章
  • Ubuntu 下 vi 輸入方向鍵會變成 ABCD ,這個很煩人,這裡給出解決辦法,親測可行 ...
  • 今天在安裝 vim 的時候出現了 Package 'vim' has no installation candidate的問題 解決方法如下:# apt-get update# apt-get upgrade# apt-get install <packagename> 這樣就可以正常使用 apt- ...
  • 前言:前面有篇博客已經介紹了線程、線程的信號量和互斥鎖,請參考博客:http://www.cnblogs.com/liudw-0215/p/8966645.html,接下來將介紹線程池。 一、理解 線程池能有效的處理多個線程的併發問題,避免大量的線程因為互相強占系統資源導致阻塞現象,能夠有效的降低頻 ...
  • CentOS6關閉防火牆使用以下命令: CentOS7關閉防火牆使用以下命令: 若安裝了iptables-service,也可以使用下麵的命令: ...
  • [TOC] 靜態庫 先說說我們為什麼需要庫? 當有些代碼我們大量會在程式中使用比如(scanf,printf等)這些函數我們需要在程式中頻繁使用,於是我們就把這些代碼編譯為庫文件,在需要使用時我們直接鏈接即可。 定義: & 8195;程式在 時把靜態庫的代碼鏈接到可執行程式中,在代碼運行時不再需要靜 ...
  • 簡介 vim是Linux 系統下類似於Windows的記事本的編輯器。 vim 中經常使用的三種模式 一般模式:瀏覽文件內容。 插入模式:編輯文件內容。 底行模式:進行保存編輯內容,退出等操作。 基本命令操作 vim filename ,打開文件,進入一般模式。 那麼現在如果我想修改文件怎麼辦呢? ...
  • 一開始,坐著上機實驗,一直搞不通為什麼虛擬機上的客戶機可以ping通自己的ip也可以ping通自己本身的ip,但是主機ping不通虛擬機的客戶機,也ping不通虛擬機的網關。 嘗試了各種問題,也追出了一大串問題: 1.宿主上,乙太網屬性什麼都沒有,連接時使用的框+此連接使用下列項目(o)裡面都沒有內 ...
  • 在安裝配置完zabbix_agentd以後,網頁端出現 Get value error: cannot connect to [[192.168.238.139]:10050]: [113] No route to host 錯誤,客戶端主機無法被監聽 解決方法: 首先在服務端ping一下客戶端的I ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...