#include <windows.h>
#include <tchar.h>
const int WINDOW_WIDTH = 500;
const int WINDOW_HEIGHT = 500;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
const int Num = 1000;
double g_x[Num];
double g_y[Num];
double MyRandom(){
//0.0~10.0のランダムを発生
//rand()は初期化してないので何度プログラムを実行しても同じ結果
return static_cast<double>(rand()) / static_cast<double>(RAND_MAX) * 10.0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
//数値計算
ZeroMemory(g_x,sizeof(g_x));//一応初期化
ZeroMemory(g_y,sizeof(g_y));
for(int i = 0 ; i < Num ; ++i){
g_x[i] = MyRandom();
g_y[i] = MyRandom();
}
WNDCLASSEX wc;
HWND hWnd;
MSG msg;
// ウィンドウクラスの情報を設定
wc.cbSize = sizeof(wc); // 構造体サイズ
wc.style = CS_HREDRAW | CS_VREDRAW; // スタイル
wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ
wc.cbClsExtra = 0; // 拡張情報1
wc.cbWndExtra = 0; // 拡張情報2
wc.hInstance = hInst; // インスタンスハンドル
wc.hIcon = (HICON)LoadImage( // アイコン
NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
0, 0, LR_DEFAULTSIZE | LR_SHARED
);
wc.hIconSm = wc.hIcon; // 子アイコン
wc.hCursor = (HCURSOR)LoadImage( // マウスカーソル
NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
0, 0, LR_DEFAULTSIZE | LR_SHARED
);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景
wc.lpszMenuName = NULL; // メニュー名
wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名
// ウィンドウクラスを登録する
if( RegisterClassEx( &wc ) == 0 ){ return 1; }
DWORD WndStyle = WS_OVERLAPPEDWINDOW & ~(WS_MAXIMIZEBOX | WS_SIZEBOX);
RECT WndRect={0, 0,WINDOW_WIDTH,WINDOW_HEIGHT};
AdjustWindowRect( &WndRect, WndStyle, false );
// ウィンドウを作成する
hWnd = CreateWindow(
wc.lpszClassName, // ウィンドウクラス名
_T("散布図"), // タイトルバーに表示する文字列
WndStyle, // ウィンドウの種類
CW_USEDEFAULT, // ウィンドウを表示する位置(X座標)
CW_USEDEFAULT, // ウィンドウを表示する位置(Y座標)
WndRect.right-WndRect.left, // ウィンドウの幅
WndRect.bottom-WndRect.top, // ウィンドウの高さ
NULL, // 親ウィンドウのウィンドウハンドル
NULL, // メニューハンドル
hInst, // インスタンスハンドル
NULL // その他の作成データ
);
if( hWnd == NULL ){ return 1; }
// ウィンドウを表示する
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
// メッセージループ
while(1)
{
BOOL ret = GetMessage( &msg, NULL, 0, 0 ); // メッセージを取得する
if( ret == 0 || ret == -1 )
{
// アプリケーションを終了させるメッセージが来ていたら、
// あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける
break;
}
else
{
// メッセージを処理する
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return 0;
}
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hDC;
PAINTSTRUCT ps;
switch( msg )
{
case WM_DESTROY: // ウィンドウを破棄するとき
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
//描画
/*
左下の端の座標を(0.0,0.0)
右上の端の座標を(10.0,10.0)
として描画
*/
hDC = BeginPaint(hWnd,&ps);//GDI関数による描画を開始する
for(int i = 0 ; i < Num ; ++i){
int x,y;
x = static_cast<int>(g_x[i] / 10.0 * WINDOW_WIDTH);//まあ素直に書いた 0.0~10.0 を 0~500の間に収める
y = static_cast<int>(g_y[i] / 10.0 * WINDOW_HEIGHT);
//スクリーン座標は→+x ↓+yなのでyを調整
y = WINDOW_HEIGHT - y;//
SetPixelV(hDC,x,y,RGB(0,0,0)); //に黒い点を描画
}
EndPaint(hWnd,&ps);
return 0;
}
// 他のメッセージは、デフォルトの処理を行う
return DefWindowProc( hWnd, msg, wp, lp );
}