第七章 滑鼠(CHECKER4)

来源:https://www.cnblogs.com/web1013/archive/2018/05/10/9019685.html
-Advertisement-
Play Games

1 /* 2 CHECKER4.C -- Mouse Hit-Test Demo Program No.4 3 (c) Charles Petzold, 1998 4 */ 5 6 #include <Windows.h> 7 8 #define DIVISIONS 5 9 10 LRESULT C ...


  1 /*---------------------------------------------
  2 CHECKER4.C -- Mouse Hit-Test Demo Program No.4
  3               (c) Charles Petzold, 1998
  4 --------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 #define DIVISIONS 5
  9 
 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 11 LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
 12 
 13 int idFocus = 0;
 14 TCHAR szChildClass[] = TEXT("Checker4_Child");
 15 
 16 int WINAPI WinMain( __in HINSTANCE hInstance
 17                     , __in_opt HINSTANCE hPrevInstance
 18                     , __in LPSTR lpCmdLine
 19                     , __in int nShowCmd )
 20 {
 21     static TCHAR szAppName[] = TEXT("Checker4");
 22     HWND hwnd;
 23     MSG msg;
 24     WNDCLASS wndclass;
 25 
 26     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 27     wndclass.lpfnWndProc = WndProc;
 28     wndclass.cbClsExtra = 0;
 29     wndclass.cbWndExtra = 0;
 30     wndclass.hInstance = hInstance;
 31     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 32     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 33     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 34     wndclass.lpszMenuName = NULL;
 35     wndclass.lpszClassName = szAppName;
 36 
 37     if (!RegisterClass(&wndclass))
 38     {
 39         MessageBox(NULL, TEXT("Program requires Windows NT!")
 40             , szAppName, MB_ICONERROR);
 41         return 0;
 42     }
 43 
 44     wndclass.lpfnWndProc = ChildWndProc;
 45     wndclass.cbWndExtra = sizeof(long);
 46     wndclass.hIcon = NULL;
 47     wndclass.lpszClassName = szChildClass;
 48 
 49     RegisterClass(&wndclass);
 50 
 51     hwnd = CreateWindow(szAppName, TEXT("Checker4 Mouse Hit-Test Demo")
 52         , WS_OVERLAPPEDWINDOW
 53         , CW_USEDEFAULT, CW_USEDEFAULT
 54         , CW_USEDEFAULT, CW_USEDEFAULT
 55         , NULL, NULL, hInstance, NULL);
 56 
 57     ShowWindow(hwnd, nShowCmd);
 58     UpdateWindow(hwnd);
 59 
 60     while (GetMessage(&msg, NULL, 0, 0))
 61     {
 62         TranslateMessage(&msg);
 63         DispatchMessage(&msg);
 64     }
 65 
 66     return msg.wParam;
 67 }
 68 
 69 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 70 {
 71     static HWND hwndChild[DIVISIONS][DIVISIONS];
 72     int cxBlock, cyBlock, x, y;
 73 
 74     switch (message)
 75     {
 76     case WM_CREATE:
 77         for (x = 0; x != DIVISIONS; ++x)
 78             for (y = 0; y != DIVISIONS; ++y)
 79             {
 80                 hwndChild[x][y] = CreateWindow(szChildClass, NULL
 81                     , WS_CHILDWINDOW | WS_VISIBLE
 82                     , 0, 0, 0, 0
 83                     , hwnd, (HMENU)(y << 8 | x)
 84                     , (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
 85             }
 86         return 0;
 87 
 88     case WM_SIZE:
 89         cxBlock = LOWORD(lParam) / DIVISIONS;
 90         cyBlock = HIWORD(lParam) / DIVISIONS;
 91 
 92         for (x = 0; x != DIVISIONS; ++x)
 93             for (y = 0; y != DIVISIONS; ++y)
 94             {
 95                 MoveWindow(hwndChild[x][y]
 96                     , x * cxBlock, y * cyBlock
 97                     , cxBlock, cyBlock, TRUE);
 98             }
 99         return 0;
100 
101     case WM_LBUTTONDOWN:
102         MessageBeep(0);
103         return 0;
104 
105         //on set-focus message, set focus to child window
106     case WM_SETFOCUS:
107         SetFocus(GetDlgItem(hwnd, idFocus));
108         return 0;
109 
110         //on key-down message, possibly change the focus window
111     case WM_KEYDOWN:
112         x = idFocus & 0xff;
113         y = idFocus >> 8;
114 
115         switch (wParam)
116         {
117         case VK_UP:
118             --y;
119             break;
120 
121         case VK_DOWN:
122             ++y;
123             break;
124 
125         case VK_LEFT:
126             --x;
127             break;
128 
129         case VK_RIGHT:
130             ++x;
131             break;
132 
133         case VK_HOME:
134             x = y = 0;
135             break;
136 
137         case VK_END:
138             x = y = DIVISIONS - 1;
139             break;
140 
141         default:
142             return 0;
143         }
144 
145         x = (x + DIVISIONS) % DIVISIONS;
146         y = (y + DIVISIONS) % DIVISIONS;
147 
148         idFocus = y << 8 | x;
149         SetFocus(GetDlgItem(hwnd, idFocus));
150         return 0;
151 
152     case WM_DESTROY:
153         PostQuitMessage(0);
154         return 0;
155     }
156 
157     return DefWindowProc(hwnd, message, wParam, lParam);
158 }
159 
160 LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
161 {
162     HDC hdc;
163     PAINTSTRUCT ps;
164     RECT rect;
165 
166     switch (message)
167     {
168     case WM_CREATE:
169         SetWindowLong(hwnd, DWL_MSGRESULT, 0);    // on/off flag
170         return 0;
171 
172     case WM_KEYDOWN:
173         //send most key press to the parent window
174         if (wParam != VK_RETURN && wParam != VK_SPACE)
175         {
176             SendMessage(GetParent(hwnd), message, wParam, lParam);
177             return 0;
178         }
179 
180         //for Return and Space, fall through to toggle the square
181     case WM_LBUTTONDOWN:
182         SetWindowLong(hwnd, DWL_MSGRESULT, 1 ^ GetWindowLong(hwnd, DWL_MSGRESULT));
183         SetFocus(hwnd);
184         InvalidateRect(hwnd, &rect, FALSE);
185         return 0;
186 
187         //for focus message, invalidate the window for repaint
188     case WM_SETFOCUS:
189         idFocus = GetWindowLong(hwnd, GWL_ID);
190 
191         //fall through
192     case WM_KILLFOCUS:
193         InvalidateRect(hwnd, NULL, TRUE);
194         return 0;
195 
196     case WM_PAINT:
197         hdc = BeginPaint(hwnd, &ps);
198         
199         GetClientRect(hwnd, &rect);
200         Rectangle(hdc, 0, 0, rect.right, rect.bottom);
201 
202         //draw the "x" mark
203         if (GetWindowLong(hwnd, DWL_MSGRESULT))
204         {
205             MoveToEx(hdc, 0, 0, NULL);
206             LineTo(hdc, rect.right, rect.bottom);
207             MoveToEx(hdc, 0, rect.bottom, NULL);
208             LineTo(hdc, rect.right, 0);
209         }
210 
211         //draw the "focus" rectangle
212         if (hwnd == GetFocus())
213         {
214             rect.left += rect.right / 10;
215             rect.right -= rect.left;
216             rect.top += rect.bottom / 10;
217             rect.bottom -= rect.top;
218 
219             SelectObject(hdc, GetStockObject(NULL_BRUSH));
220             SelectObject(hdc, CreatePen(PS_DASH, 0, 0));
221             Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
222             DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));
223         }
224 
225         EndPaint(hwnd, &ps);
226         return 0;
227     }
228 
229     return DefWindowProc(hwnd, message, wParam, lParam);
230 }
CHECKER4.C

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近看了一句話,說的是在現實生活中,會寫字的人不見得會寫出好文章,學習編程語言就像是學會了寫字,學會了編程語言並不一定能寫出好程式。 我覺得就是很有道理,以前讀書的時候,基本學完了C#中的語法知識,算是入了個門,但是一到寫程式就毫無頭緒,做出來的程式就像是小學生日記,僅僅只是用一些簡單的api把功能 ...
  • 這兩天在摸索WCF中的共用埠,參考了下麵的博客WCF:如何將net.tcp協議寄宿到IIS[WCF實踐]1.WCF使用net.tcp寄宿到IIS中這兩篇博客中提到的內容解決了實際開發中大多數的問題。這裡根據自己實踐,也總結一下寫在這裡:依照上面的兩篇博文,如果還是遇到下麵的錯誤提示:已嘗試創建到達... ...
  • 1、pipe 本質: 匿名管道 內核緩衝區 偽文件(偽文件和操作文件類似) 創建方式: fd[0] 表示讀端 fd[1] 表示寫端 返回值: 成功返回0,失敗返回-1 特點: 有讀端和寫端,對應兩個文件描述符,數據從寫端流入,讀端流出 操作管道的進程掛掉後管道自動釋放 管道預設是阻塞的 管道原理: ...
  • 一、用戶與群組 Linux是多人多任務的操作系統,每個用戶有一個主目錄(或者叫家目錄 /home),其他用戶可以瀏覽,但是能否查看文件要看具體的許可權設置。文件擁有者可以修改許可權,選擇是否允許其他用戶進行查看或者編輯等操作。在團隊工作中,群組的概念非常有用,文件擁有者可以通過許可權設定,賦予相應群組一定 ...
  • 引言 程式員或者伺服器運維人員在日常工作中,經常會遇到很多台伺服器需要管理的情況,如果伺服器多了,一般的做法都是通過一個ssh客戶端工具來管理,例如:securityCRT、Xshell、putty等遠程工具,這類工具有兩個特點:1.可以將伺服器存儲成一個列表,配置一次伺服器信息之後,下次直接雙擊就 ...
  • 問題重述: 當我們使用天河機進行並行程式實驗的時候,都會使用到yhrun/srun命令。在超算環境下,yhrun 命令用來進行提交互動式作業,有屏幕輸出。但是容易受到網路波動影響導致斷網或者關閉視窗最終導致作業中斷。 思考: 為了,能夠更好地使用yhrun/srun 命令來進行提交作業。我們首先要保 ...
  • Linux系統初學第一課 虛擬機安裝CentOS6.5以及Root密碼找回 虛擬機安裝CentOS6.5 一.安裝虛擬機 1-1.安裝虛擬機VMware Station,新建虛擬機,選擇典型配置。 1-2.選擇稍後安裝操作系統。 1-3.客戶機操作系統選擇linux,版本選擇CentOS 6.5 6 ...
  • Kali自帶Wireshark,但一般的Linux系統是不帶的,需要自行下載,並且過程略複雜 而純字元界面的Linux系統無法使用Wireshark 但是,所有Linux系統都會安裝TCPDUMP:一種基於命令行的抓包工具 註意事項:預設只抓68位元組,能夠獲得基本信息,但無法做到完整分析 1:開始抓 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...