Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Рисование WinAPI


Автор: Wrestlerrr 16.5.2012, 19:48
Помогите дописать программу!
 Пользователь отмечает нажатиями левой клавиши мыши произвольные точки, не лежащие на одной прямой. Программа рисует крестики в отмеченных точках. По нажатию правой кнопкой программа должна отметить последнюю точку и нарисовать ломаную без сам оперетинань с вершинами в отмеченных точках!

Точки и крестики программа ставит! подскажите что тут дальше делать?



Код

// Включаем необходимый заголовочный файл для Windows-программ
#include <windows.h>
#include <math.h>
int q=0;

// Объявление функции окна (оконной процедуры)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst; // Идентификатор приложения

// Указатель на константную строку символов - имя программы и класса окна
LPCSTR AppName = "MyProgramm";

// Точка входа в программу - функция WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd; // Уникальный идентификатор окна (handle)
MSG msg; // Объявление структуры типа MSG, для работы с сообщениями

hInst = hInstance; // Сохраняем идентификатор приложения

// Заполняем структуру WNDCLASS
WNDCLASS wc;
    // Инициализируем выделенную для структуры память нулями
    ZeroMemory(&wc, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst; 
wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = AppName;

RegisterClass(&wc); // Создаем и регистрируем оконный класс

// Создаем окно программы
hWnd = CreateWindow(
    AppName, // Имя класса окна
    AppName, // Заголовок окна
    WS_OVERLAPPEDWINDOW, // Стиль окна
    CW_USEDEFAULT, 0, // Горизонтальная и вертикальная позиции окна
    300, 300, // Ширина и высота окна
    NULL, // Хендл родительского окна
    NULL, // Хендл меню
    hInst, // Идентификатор приложения
    NULL); // Дополнительные данные окна

ShowWindow(hWnd, SW_SHOW); // Отображаем окно
UpdateWindow(hWnd); // Перерисовываем окно

    // Стандартный цикл обработки сообщений
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

return msg.wParam;
}

// Оконная процедура
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{HDC hdc; //создаём контекст устройства
 PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
 LOGFONT lf;
 HFONT hFont;
 RECT r;
 HBRUSH hBrush;
 HPEN hPen;
 POINT pt;
LPPOINT Pt = &pt;
HDC hDC;

 hDC=GetDC(hWnd);

    switch(msg)
    {
        /*
    case WM_MOUSEMOVE:
       int x,y;
        x=LOWORD(lParam);
        y=HIWORD(lParam);
       char u[10];
        _itoa_s(x,u,10,10);
        if(u[1]==0)
            u[1]=' ';
        if(u[2]==0)
            u[2]=' ';
        _itoa_s(y,u+4,6,6);
        u[3]='x';
        SetWindowText(hWnd,u);
    
    */int x,y,x1[100],y1[100]; //координаты

        case WM_PAINT :
 {hdc=BeginPaint(hWnd, &ps);
 //здесь можно вставить какие-нибудь функции рисования
 
 
 
 
     //Если был щелчок левой 

 case WM_LBUTTONDOWN:
     {
          
 
 x=LOWORD(lParam); //узнаём координаты
 y=HIWORD(lParam);
 x1[q]=x;
 y1[q]=y;
 SetPixel(hDC, x,y,RGB(0,0,0));
 
  MoveToEx(hDC,x,y,&pt);
  LineTo(hDC,x+5,y-5);
 MoveToEx(hDC,x,y,&pt);
  LineTo(hDC,x+5,y+5);
  
  MoveToEx(hDC,x,y,&pt);
  LineTo(hDC,x-5,y+5);
 MoveToEx(hDC,x,y,&pt);
  LineTo(hDC,x-5,y-5);
  
  q=q++;
    break; }
  
     
     
     case WM_RBUTTONDOWN:
      { MoveToEx(hDC,15,15,&pt);
  LineTo(hDC,x1[0],y1[0]); 
 
     break; }/*
        Polyline(
  hDC,             // идентификатор контекста отображения
  const POINT FAR* lppt,// указатель на массив структур POINT
  int cPoints); 
 */

     
 ValidateRect(hWnd, NULL);



 //заканчиваем рисовать
 EndPaint(hWnd, &ps);
 break;
 }

    

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    default:
    return DefWindowProc(hWnd, msg, wParam, lParam);
    }

return 0;
}


Автор: GremlinProg 17.5.2012, 06:43
Цитата(Wrestlerrr @  16.5.2012,  21:48 Найти цитируемый пост)
без сам оперетинань

 smile это как?

Автор: Earnest 18.5.2012, 10:45
Может это "самопересечение"?
В любом случае, поставленные точки нужно запоминать, например в массиве. А дальше вопрос к автору: если ломаная должна проходить по точкам в порядке простановки, то задача тривиальна, только вот с самопересечениями (если это они) тут засада: уж как точки заданы, так и будет. А если нужно построить ломаную как-то по другому, то нужно определить критерий.

Автор: Dem_max 18.5.2012, 14:27
Тут без запоминания точек в массив не обойтись. Потом из массива рисовать уже.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)