fork download
  1. // 謎の螺旋???.cpp : アプリケーションのエントリ ポイントを定義します。
  2. //
  3.  
  4. //#include "stdafx.h"
  5. //#include "謎の螺旋???.h"
  6.  
  7. #include <vector>
  8. #define WIN32_LEAN_AND_MEAN
  9. #include <windows.h>
  10. #include <tchar.h>
  11.  
  12. #define MAX_LOADSTRING 100
  13.  
  14. //////////////////////
  15.  
  16. #define IDS_APP_TITLE 103
  17.  
  18. #define IDR_MAINFRAME 128
  19. #define IDD_MY_DIALOG 102
  20. #define IDD_ABOUTBOX 103
  21. #define IDM_ABOUT 104
  22. #define IDM_EXIT 105
  23. #define IDI_MY 107
  24. #define IDI_SMALL 108
  25. #define IDC_MY 109
  26. #define IDC_MYICON 2
  27. #ifndef IDC_STATIC
  28. #define IDC_STATIC -1
  29. #endif
  30.  
  31. //////////////////////
  32.  
  33. // グローバル変数:
  34. HINSTANCE hInst; // 現在のインターフェイス
  35. TCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト
  36. TCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名
  37.  
  38. // このコード モジュールに含まれる関数の宣言を転送します:
  39. ATOM MyRegisterClass(HINSTANCE hInstance);
  40. BOOL InitInstance(HINSTANCE, int);
  41. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  42. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  43.  
  44.  
  45.  
  46.  
  47. bool MoveTo(HDC hdc, POINT To, LPPOINT LastPoint){
  48. ::MoveToEx(hdc, To.x, To.y, LastPoint);
  49. return true;
  50. }
  51. bool LineTo(HDC hdc, POINT To, HPEN Pen){
  52.  
  53. HPEN Old = (HPEN)SelectObject(hdc, Pen);
  54. ::LineTo(hdc, To.x, To.y);
  55. SelectObject(hdc, Old);
  56.  
  57. return 0;
  58. }
  59. bool DrawText(HDC hdc, LPTSTR Text, int TextCount, LPRECT Rect, UINT Format, COLORREF COLOR, HFONT Font){
  60. HFONT OldFont = (HFONT)SelectObject(hdc, Font);
  61. COLORREF Color = SetTextColor(hdc, COLOR);
  62.  
  63. ::DrawText(hdc, Text, TextCount, Rect, Format);
  64.  
  65. SelectObject(hdc, OldFont);
  66. SetTextColor(hdc, Color);
  67.  
  68. return true;
  69. }
  70.  
  71. std::vector<bool> Prime;
  72.  
  73. bool MakePrime(std::size_t N){//追記型エラトステネスの篩
  74. std::size_t Start = Prime.size();
  75. std::size_t End = N;
  76. bool F = false;
  77.  
  78. if (Prime.size() == 0){
  79. Prime.push_back(false);
  80. Prime.push_back(false);
  81. Prime.push_back(true);
  82. }
  83. Start = Prime.size();
  84. for (std::size_t i = Start; i < End; i++){
  85. F = true;
  86. for (std::size_t j = 1; j < i; j++){
  87. if (Prime[j] == false)continue;
  88. if (i%j == 0){
  89. F = false;
  90. break;
  91.  
  92. }
  93. }
  94. Prime.push_back(F);
  95. }
  96. return true;
  97. }
  98.  
  99. int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
  100. _In_opt_ HINSTANCE hPrevInstance,
  101. _In_ LPTSTR lpCmdLine,
  102. _In_ int nCmdShow)
  103. {
  104. UNREFERENCED_PARAMETER(hPrevInstance);
  105. UNREFERENCED_PARAMETER(lpCmdLine);
  106.  
  107. // TODO: ここにコードを挿入してください。
  108. MSG msg;
  109. HACCEL hAccelTable;
  110.  
  111. // グローバル文字列を初期化しています。
  112. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  113. LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
  114. MyRegisterClass(hInstance);
  115.  
  116. // アプリケーションの初期化を実行します:
  117. if (!InitInstance (hInstance, nCmdShow))
  118. {
  119. return FALSE;
  120. }
  121.  
  122. hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
  123.  
  124. // メイン メッセージ ループ:
  125. while (GetMessage(&msg, NULL, 0, 0))
  126. {
  127. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  128. {
  129. TranslateMessage(&msg);
  130. DispatchMessage(&msg);
  131. }
  132. }
  133.  
  134. return (int) msg.wParam;
  135. }
  136.  
  137.  
  138.  
  139. //
  140. // 関数: MyRegisterClass()
  141. //
  142. // 目的: ウィンドウ クラスを登録します。
  143. //
  144. ATOM MyRegisterClass(HINSTANCE hInstance)
  145. {
  146. WNDCLASSEX wcex;
  147.  
  148. wcex.cbSize = sizeof(WNDCLASSEX);
  149.  
  150. wcex.style = CS_HREDRAW | CS_VREDRAW;
  151. wcex.lpfnWndProc = WndProc;
  152. wcex.cbClsExtra = 0;
  153. wcex.cbWndExtra = 0;
  154. wcex.hInstance = hInstance;
  155. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
  156. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  157. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  158. wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY);
  159. wcex.lpszClassName = szWindowClass;
  160. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  161.  
  162. return RegisterClassEx(&wcex);
  163. }
  164.  
  165. //
  166. // 関数: InitInstance(HINSTANCE, int)
  167. //
  168. // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
  169. //
  170. // コメント:
  171. //
  172. // この関数で、グローバル変数でインスタンス ハンドルを保存し、
  173. // メイン プログラム ウィンドウを作成および表示します。
  174. //
  175. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  176. {
  177. HWND hWnd;
  178.  
  179. hInst = hInstance; // グローバル変数にインスタンス処理を格納します。
  180.  
  181. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  182. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  183.  
  184. if (!hWnd)
  185. {
  186. return FALSE;
  187. }
  188.  
  189. ShowWindow(hWnd, nCmdShow);
  190. UpdateWindow(hWnd);
  191.  
  192. return TRUE;
  193. }
  194.  
  195. //
  196. // 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
  197. //
  198. // 目的: メイン ウィンドウのメッセージを処理します。
  199. //
  200. // WM_COMMAND - アプリケーション メニューの処理
  201. // WM_PAINT - メイン ウィンドウの描画
  202. // WM_DESTROY - 中止メッセージを表示して戻る
  203. //
  204. //
  205. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  206. {
  207. int wmId, wmEvent;
  208. PAINTSTRUCT ps;
  209. HDC hdc;
  210.  
  211. static const int TW = 16;
  212. static const int TH = 16;
  213.  
  214. RECT rt;
  215. RECT Prog = { 0, };
  216. int Dir = 0;
  217. int Count = 0;
  218.  
  219. GetClientRect(hWnd, &rt);
  220.  
  221. int CW = rt.right - rt.left;
  222. int CH = rt.bottom - rt.top;
  223. int CX = CW / 2;
  224. int CY = CH / 2;
  225.  
  226. POINT Pos = { CX, CY };
  227. int L = 0;
  228. int M = 1;
  229. TCHAR Str[1024] = _T("");
  230.  
  231. POINT D[4] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
  232.  
  233. switch (message)
  234. {
  235. case WM_COMMAND:
  236. wmId = LOWORD(wParam);
  237. wmEvent = HIWORD(wParam);
  238. // 選択されたメニューの解析:
  239. switch (wmId)
  240. {
  241. case IDM_ABOUT:
  242. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  243. break;
  244. case IDM_EXIT:
  245. DestroyWindow(hWnd);
  246. break;
  247. default:
  248. return DefWindowProc(hWnd, message, wParam, lParam);
  249. }
  250. break;
  251. case WM_PAINT:
  252. hdc = BeginPaint(hWnd, &ps);
  253. MoveTo(hdc, { CX, CY }, NULL);
  254.  
  255. // TODO: 描画コードをここに追加してください...
  256. Prog.right = 1;
  257. L = 1;
  258. while (true){
  259. Dir++;
  260. Dir %= 4;
  261. if(Count == 0)goto Label;
  262.  
  263. if (Dir == 0){
  264. Prog.bottom = Prog.top + 2;
  265. L = Prog.bottom;
  266. }
  267. if (Dir == 1){
  268. Prog.right = Prog.left + 2;
  269. L = Prog.right;
  270. }
  271. if (Dir == 2){
  272. Prog.top = Prog.bottom + 2;
  273. L = Prog.top;
  274. }
  275. if (Dir == 3){
  276. Prog.left = Prog.right + 2;
  277. L = Prog.left;
  278. }
  279.  
  280. Label:
  281.  
  282.  
  283. for (int i = 0; i < L; i++){
  284. Pos.x = Pos.x + (D[Dir].x*TW);
  285. Pos.y = Pos.y + (D[Dir].y*TH);
  286.  
  287. LineTo(hdc, { Pos.x, Pos.y }, (HPEN)GetStockObject(BLACK_PEN));
  288. Count++;
  289. MakePrime(Count+1);
  290. if (Prime[Count] == true){
  291. wsprintf(Str, _T("%d"),Count);
  292. int Len = lstrlen(Str);
  293. RECT SR{Pos.x-64,Pos.y,Pos.x+64,Pos.y+16};
  294. DrawText(hdc, Str, Len, &SR, DT_CENTER);
  295. }
  296. //if (Count == 1024) goto End;
  297. if (Pos.x > CW) goto End;
  298. if (Pos.x < 0) goto End;
  299. if (Pos.y > CH) goto End;
  300. if (Pos.y < 0)goto End;
  301. }
  302.  
  303. }
  304. End:
  305. EndPaint(hWnd, &ps);
  306. break;
  307. case WM_DESTROY:
  308. PostQuitMessage(0);
  309. break;
  310. case WM_MOUSEMOVE:
  311. InvalidateRect(hWnd, NULL, FALSE);
  312. break;
  313. default:
  314. return DefWindowProc(hWnd, message, wParam, lParam);
  315. }
  316. return 0;
  317. }
  318.  
  319. // バージョン情報ボックスのメッセージ ハンドラーです。
  320. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  321. {
  322. UNREFERENCED_PARAMETER(lParam);
  323. switch (message)
  324. {
  325. case WM_INITDIALOG:
  326. return (INT_PTR)TRUE;
  327.  
  328. case WM_COMMAND:
  329. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  330. {
  331. EndDialog(hDlg, LOWORD(wParam));
  332. return (INT_PTR)TRUE;
  333. }
  334. break;
  335. }
  336. return (INT_PTR)FALSE;
  337. }
  338.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:9:21: fatal error: windows.h: No such file or directory
 #include <windows.h>
                     ^
compilation terminated.
stdout
Standard output is empty