WindowsでのC ++での描画、または「みんな、私もクレイジーです!」(30行以上のコード)

最近、Habrは単に「30行の投稿」でいっぱいです:



-JavaScriptレース(30行のコード)

- 小さなJavaScriptアルカノイド(30行のコード)

- 純粋なJavaScriptの小さなExcel(30行のコード)

-JavaScriptの小さな蛇(30行のコード)

-javascriptのテトリス(30行以上)



ファッションを追いかけたいという欲求に夢中になって、私も何かを書くことにしました。 しかし、JSとは複雑な関係にあるため、APIを使用してC ++で記述することにしました。これは、Windows OS(一般的にWinAPIと呼ばれます)から親切に提供されました。



だから、問題の本体に近い:



C ++コード(31行):

#include <Windows.h> #include <vector> #include "resource.h" BOOL CALLBACK PaintProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ POINT t; static std::vector<POINT> pos; HDC hdc; static bool status; PAINTSTRUCT pt; switch(uMsg) { case WM_INITDIALOG: status = false; return TRUE; break; case WM_PAINT: hdc = BeginPaint(hwnd, &pt); (!pos.size()) ? NULL : MoveToEx(hdc, pos[0].x, pos[0].y, NULL); for(size_t i=0;i<pos.size();++i) (pos[i].x==-1 && i<pos.size()-1) ? MoveToEx(hdc, pos[i+1].x, pos[i+1].y, NULL) : LineTo(hdc, pos[i].x, pos[i].y); EndPaint(hwnd, &pt); break; case WM_LBUTTONDOWN: status = true; break; case WM_LBUTTONUP: status = false; tx=-1; pos.push_back(t); break; case WM_MOUSEMOVE: GetCursorPos(&t); ScreenToClient (hwnd, &t); (status) ? pos.push_back(t) : NULL; (status) ? InvalidateRect(hwnd, NULL, true) : NULL; break; case WM_CLOSE: EndDialog(hwnd, 0); break; } return FALSE; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInst, MAKEINTRESOURCE(IDD_PAINT), NULL, PaintProc); return 0; }
      
      







「レイアウト」を考慮せずにメインコードでピペットを測定するため、ダイアログの説明をリソースとして考慮しませんが、この例を再現するには、ID- IDD_PAINTのダイアログを作成する必要があります。



実際には、それがすべて始まったために:



画像



特徴



-31行のC ++ shitコード

-使用済みライブラリ:STL



短所



-直接描画中の画面のちらつき(行を保存するため、ダブルバッファリングは省略されました)。

-プログラム(ala Paint )を作成する実際のタスクでは、ベクトルコンテナを使用することはおそらく最良のオプションではありませんが、それでもなお可能です。



まとめ



同意します。変数の宣言を1行に入れるのは少し間違っています。 しかし、これはコードの全体的な印象に影響を与えないと思います。

ご清聴ありがとうございました。 「異常」の総数に+1。



All Articles