消去だけ。
円は、円周全体のどこかをクリックすれば消えます。
メッセージは出していません。
winapiを使ったことがないので、無理やりのコードです (^^);
#include <stdio.h>
#include <windows.h>
#define N 10
int FigureHistory[N+1][9] = { 0 };
int FigureHistoryN = 0;
HWND Hwnd, button;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI main(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
MSG msg;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("GETDC");
RegisterClass(&wc);
Hwnd = CreateWindow(TEXT("GETDC"),
TEXT("Windos API Primer"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
NULL, NULL, hInstance, NULL);
button = CreateWindowEx(WS_EX_LEFT, TEXT("BUTTON"), TEXT("b"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 50, 0, 50,
30, Hwnd, (HMENU)1, hInstance, NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int x, y;
switch (msg)
{
case WM_LBUTTONDOWN:
if (FigureHistoryN == N) {
printf_s("TOO MANY FIGURES (%d)\n", N);
break;
}
hdc = GetDC(hwnd);
x = LOWORD(lParam);
y = HIWORD(lParam);
Rectangle(hdc, x - 10, y - 10, x + 10, y + 10);
ReleaseDC(hwnd, hdc);
FigureHistory[FigureHistoryN][0] = 1;
FigureHistory[FigureHistoryN][1] = x - 10;
FigureHistory[FigureHistoryN][2] = y - 10;
FigureHistory[FigureHistoryN][3] = x + 10;
FigureHistory[FigureHistoryN][4] = y + 10;
FigureHistoryN++;
break;
case WM_RBUTTONDOWN:
DWORD bkc;
bkc = GetSysColor(4);
hdc = GetDC(hwnd);
x = LOWORD(lParam);
y = HIWORD(lParam);
ReleaseDC(hwnd, hdc);
int i, j;
for (i = FigureHistoryN - 1; i >= 0; i--) {
if ((FigureHistory[i][1] <= x) &&
(FigureHistory[i][2] <= y) &&
(FigureHistory[i][3] >= x) &&
(FigureHistory[i][4] >= y)) {
HPEN pen;
HBRUSH brush;
pen = CreatePen(PS_SOLID, 1, bkc);
brush = CreateSolidBrush(bkc);
hdc = GetDC(hwnd);
SelectObject(hdc, pen);
SelectObject(hdc, brush);
switch (FigureHistory[i][0]) {
case 1:
Rectangle(hdc, FigureHistory[i][1], FigureHistory[i][2], FigureHistory[i][3], FigureHistory[i][4]);
break;
case 2:
Arc(hdc, FigureHistory[i][1], FigureHistory[i][2], FigureHistory[i][3], FigureHistory[i][4],
FigureHistory[i][5], FigureHistory[i][6], FigureHistory[i][7], FigureHistory[i][8]);
break;
default:
printf_s("Internal Error\n");
}
ReleaseDC(hwnd, hdc);
for (; i < FigureHistoryN; i++) {
for (j = 0; j < 9; j++) {
FigureHistory[i][j] = FigureHistory[i + 1][j];
}
}
FigureHistoryN--;
hdc = GetDC(hwnd);
for (i = 0; i < FigureHistoryN; i++) {
switch (FigureHistory[i][0]) {
case 1:
Rectangle(hdc, FigureHistory[i][1], FigureHistory[i][2], FigureHistory[i][3], FigureHistory[i][4]);
break;
case 2:
Arc(hdc, FigureHistory[i][1], FigureHistory[i][2], FigureHistory[i][3], FigureHistory[i][4],
FigureHistory[i][5], FigureHistory[i][6], FigureHistory[i][7], FigureHistory[i][8]);
break;
default:
printf_s("Internal Error\n");
}
}
ReleaseDC(hwnd, hdc);
break;
}
}
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
if (FigureHistoryN == N) {
printf_s("TOO MANY FIGURES (%d)\n", N);
break;
}
if (LOWORD(wParam) == 1) {
int x0, y0, x1, y1, xs, ys, xe, ye;
x0 = 50;
y0 = 50;
x1 = 150;
y1 = 150;
xs = 100;
ys = 200;
xe = 0;
ye = 100;
hdc = GetDC(Hwnd);
Arc(hdc, x0, y0, x1, y1, xs, ys, xe, ye);
ReleaseDC(Hwnd, hdc);
FigureHistory[FigureHistoryN][0] = 2;
FigureHistory[FigureHistoryN][1] = x0;
FigureHistory[FigureHistoryN][2] = y0;
FigureHistory[FigureHistoryN][3] = x1;
FigureHistory[FigureHistoryN][4] = y1;
FigureHistory[FigureHistoryN][5] = xs;
FigureHistory[FigureHistoryN][6] = ys;
FigureHistory[FigureHistoryN][7] = xe;
FigureHistory[FigureHistoryN][8] = ye;
FigureHistoryN++;
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}