Консультация № 136545
12.05.2008, 20:58
0.00 руб.
0 1 1
Имеется очень хитрая задача:

На месте щелчка левой клавишей мыши появляется квадрат, всякий раз другого цвета. Обеспечить отображение всех квадратов при сворачивании-разворачивании окна. Хранить координаты щелчков мыши в списочной структуре данных.

Не представляю как её сделать... Прошу помочь исходником(или самим решением) или хотя бы советом. Заранее благодарю!

Обсуждение

Неизвестный
13.05.2008, 06:54
общий
это ответ
Здравствуйте, Якимов Иван Юрьевич!

Код в приложении, все квадраты со сторойно 20 точек
Проект создан был под VC6 как обычное Win32 приложение
CQuad - структура с координатами и цветом для одного квадрата
iTop - число квадратиков

DlgProc - функция обработки сообщений окна диалога
WM_PAINT - событие отрисовки, там отрисовываются в цикле все квадратики
WM_LBUTTONDOWN - событие мышки, добавляются координаты и случайный цвет.

если что непонятно, спрашивайте

Приложение:
// Win_temp2.cpp : Defines the entry point for the application.//#include "stdafx.h"#include <time.h>#include <stdlib.h>#define IDC_CLEAR 0x1024// descrclass CQuad{public: POINT m_pt; COLORREF m_cr;};// dataCQuad quads[1024];int iTop;// winHWND hMain;// methsLRESULT CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ switch (message) { case WM_COMMAND: if(LOWORD(wParam) == IDCANCEL) { if(IDYES == MessageBox(hWnd, "quit ?", "confirmation", MB_YESNO)) PostQuitMessage(0); } else if(LOWORD(wParam) == IDC_CLEAR) { iTop = 0; InvalidateRect(hWnd, NULL, TRUE); } break; case WM_ERASEBKGND: { HBRUSH hBr = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); RECT rt; HDC hdc = GetDC(hWnd); GetClientRect(hWnd, &rt); FillRect(hdc, &rt, hBr); DeleteObject(hBr); ReleaseDC(hWnd, hdc); SendMessage(hWnd, WM_PAINT, 0, 0); } return TRUE; case WM_PAINT: { HDC hdc = GetDC(hWnd); HBRUSH hBr; RECT rt; for(int i=0; i<iTop; i++) { hBr = CreateSolidBrush(quads[i].m_cr); SetRect(&rt, quads[i].m_pt.x-10, quads[i].m_pt.y-10, quads[i].m_pt.x+10, quads[i].m_pt.y+10); FillRect(hdc, &rt, hBr); DeleteObject(hBr); } ReleaseDC(hWnd, hdc); return FALSE; } break; case WM_LBUTTONDOWN: quads[iTop].m_pt.x = LOWORD(lParam); quads[iTop].m_pt.y = HIWORD(lParam); quads[iTop].m_cr = rand()%0xffffff; iTop++; InvalidateRect(hWnd, NULL, TRUE); //SendMessage(hWnd, WM_PAINT, 0, 0); break; } return 0;}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ // data init iTop = 0; srand(time(NULL)); // win init hMain = CreateWindowEx(WS_EX_TOPMOST|WS_EX_CLIENTEDGE, "#32770", "quad graphics editor", WS_VISIBLE|WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_THICKFRAME|ES_READONLY, 200, 200, 400, 200, NULL, 0, GetModuleHandle(NULL), NULL); SetWindowLong(hMain, DWL_DLGPROC, (long)DlgProc); HMENU hMenu = CreateMenu(); InsertMenu(hMenu, 0, MF_STRING, IDCANCEL, "&quit"); InsertMenu(hMenu, 0, MF_STRING, IDC_CLEAR, "&clear"); SetMenu(hMain, hMenu); // Main message loop: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0;}
Форма ответа