C++でウィンドウ上で操作するプログラムで複数の図形を描画するプログラムをつくりたいです。
知識は全然なく困っております。
楕円、長方形、直線、などを切り替えられるプログラムを作りたいと考えております。
現在、左クリックで範囲を決め、楕円を作れる状態です。
ここから、長方形、直線などを足していきたいのですがどのようにしたらいいでしょうか。
よろしくお願いします。
[C++]課題
Re: [C++]課題
//ex7_1.cpp
//モーダルダイアログボックスを表示するプログラム
//メニューを追加し、「ファイル」「オプション」「ヘルプ」を作成する
//メニューのIDは"MYMENU"とする
//「ファイル」には「終了」を「オプション」には「ダイアログを出す」を「ヘルプ」には「About」を作成する
//それぞれのIDはIDM_END(終了)、IDM_DLG(ダイアログを出す)、IDM_ABOUT(About)とする。
//ダイアログ("MYDLG")を追加し、スタティックテキスト(IDC_STATIC)を追加する
//スタティックテキストのキャプションは「初めてのダイアログボックス」などにする
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
void DrawRect(HWND, POINTS, POINTS);
TCHAR szClassName[] = TEXT("ex7_1"); //ウィンドウクラス
HINSTANCE hInst;
POINTS start, end, old_end;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
hInst = hCurInst; //インスタンスハンドルをグローバル変数にコピー
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウ・クラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = TEXT("MYMENU"); //メニュー名
wc.lpszClassName = szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,
TEXT("モーダルダイアログボックスを表示する"), //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
TCHAR szBuf[32];
HDC hdc;
HBRUSH hBrush;
static BOOL bDraw;
PAINTSTRUCT ps;
POINT points[5];
switch (msg) {
case WM_LBUTTONDOWN://マウス左ボタンをクリックしたとき行う処理
bDraw = TRUE;
old_end = start = MAKEPOINTS(lp);
DrawRect(hWnd, start, old_end);
break;
case WM_MOUSEMOVE://マウスを移動させているときに行う処理
if(bDraw) {
end = MAKEPOINTS(lp);
DrawRect(hWnd, start, old_end);
DrawRect(hWnd, start, end);
old_end = end;
} else {
return DefWindowProc(hWnd, msg, wp, lp);
}
break;
case WM_LBUTTONUP://マウス左ボタンを上げたときに行う処理
if(bDraw) {
DrawRect(hWnd, start, end);
bDraw = FALSE;
wsprintf(szBuf,
TEXT("(%d, %d) - (%d, %d)"),
start.x, start.y, end.x, end.y);
SetWindowText(hWnd, szBuf);
hdc = GetDC(hWnd);
hBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
SelectObject(hdc, hBrush);
Ellipse(hdc, start.x, start.y, end.x, end.y);
ReleaseDC(hWnd, hdc);
} else {
return DefWindowProc(hWnd, msg, wp, lp);
}
break;
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wp)) {
//以下、メニューの選択により該当処理を行う
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_DLG:
//ダイアログボックスの呼び出し(hInstはグローバル変数)
DialogBox(hInst, TEXT("MYDLG"), hWnd, (DLGPROC)MyDlgProc);
break;
case IDM_ABOUT:
MessageBox(hWnd,
TEXT("2014 Kanto Gakuin Univ."),
TEXT("About"),
MB_OK);
break;
}
break;
case WM_CLOSE:
id = MessageBox(hWnd,
TEXT("終了してもよろしいですか"),
TEXT("確認"),
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES)
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
void DrawRect(HWND hWnd, POINTS beg, POINTS end)
{
HDC hdc;
hdc = GetDC(hWnd);
SetROP2(hdc, R2_NOT);
MoveToEx(hdc, beg.x, beg.y, NULL);
LineTo(hdc, end.x, beg.y);
LineTo(hdc, end.x, end.y);
LineTo(hdc, beg.x, end.y);
LineTo(hdc, beg.x, beg.y);
LineTo(hdc, end.x, end.y);
ReleaseDC(hWnd, hdc);
return;
}
//ダイアログプロシージャ
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
return FALSE;
}
return FALSE;
}
//モーダルダイアログボックスを表示するプログラム
//メニューを追加し、「ファイル」「オプション」「ヘルプ」を作成する
//メニューのIDは"MYMENU"とする
//「ファイル」には「終了」を「オプション」には「ダイアログを出す」を「ヘルプ」には「About」を作成する
//それぞれのIDはIDM_END(終了)、IDM_DLG(ダイアログを出す)、IDM_ABOUT(About)とする。
//ダイアログ("MYDLG")を追加し、スタティックテキスト(IDC_STATIC)を追加する
//スタティックテキストのキャプションは「初めてのダイアログボックス」などにする
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
void DrawRect(HWND, POINTS, POINTS);
TCHAR szClassName[] = TEXT("ex7_1"); //ウィンドウクラス
HINSTANCE hInst;
POINTS start, end, old_end;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
hInst = hCurInst; //インスタンスハンドルをグローバル変数にコピー
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウ・クラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = TEXT("MYMENU"); //メニュー名
wc.lpszClassName = szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,
TEXT("モーダルダイアログボックスを表示する"), //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
TCHAR szBuf[32];
HDC hdc;
HBRUSH hBrush;
static BOOL bDraw;
PAINTSTRUCT ps;
POINT points[5];
switch (msg) {
case WM_LBUTTONDOWN://マウス左ボタンをクリックしたとき行う処理
bDraw = TRUE;
old_end = start = MAKEPOINTS(lp);
DrawRect(hWnd, start, old_end);
break;
case WM_MOUSEMOVE://マウスを移動させているときに行う処理
if(bDraw) {
end = MAKEPOINTS(lp);
DrawRect(hWnd, start, old_end);
DrawRect(hWnd, start, end);
old_end = end;
} else {
return DefWindowProc(hWnd, msg, wp, lp);
}
break;
case WM_LBUTTONUP://マウス左ボタンを上げたときに行う処理
if(bDraw) {
DrawRect(hWnd, start, end);
bDraw = FALSE;
wsprintf(szBuf,
TEXT("(%d, %d) - (%d, %d)"),
start.x, start.y, end.x, end.y);
SetWindowText(hWnd, szBuf);
hdc = GetDC(hWnd);
hBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
SelectObject(hdc, hBrush);
Ellipse(hdc, start.x, start.y, end.x, end.y);
ReleaseDC(hWnd, hdc);
} else {
return DefWindowProc(hWnd, msg, wp, lp);
}
break;
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wp)) {
//以下、メニューの選択により該当処理を行う
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_DLG:
//ダイアログボックスの呼び出し(hInstはグローバル変数)
DialogBox(hInst, TEXT("MYDLG"), hWnd, (DLGPROC)MyDlgProc);
break;
case IDM_ABOUT:
MessageBox(hWnd,
TEXT("2014 Kanto Gakuin Univ."),
TEXT("About"),
MB_OK);
break;
}
break;
case WM_CLOSE:
id = MessageBox(hWnd,
TEXT("終了してもよろしいですか"),
TEXT("確認"),
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES)
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
void DrawRect(HWND hWnd, POINTS beg, POINTS end)
{
HDC hdc;
hdc = GetDC(hWnd);
SetROP2(hdc, R2_NOT);
MoveToEx(hdc, beg.x, beg.y, NULL);
LineTo(hdc, end.x, beg.y);
LineTo(hdc, end.x, end.y);
LineTo(hdc, beg.x, end.y);
LineTo(hdc, beg.x, beg.y);
LineTo(hdc, end.x, end.y);
ReleaseDC(hWnd, hdc);
return;
}
//ダイアログプロシージャ
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
return FALSE;
}
return FALSE;
}