singlepost

Помогите, пожалуйста, с графикой С++/WinAPI << На главную или назад  

будьте милосердны, умоляю!!((

Задача: нарисовать правильные многоугольники с общей стороной с колличеством сторон п=3,..12. т.е. рисунок должен состоять из 10 фигур одновременно.

#include <windows.h>
#include <math.h>

HINSTANCE hInst;
char szAppName[] ="ApiWin";
char szTitle[] ="Window Application";

double RadPerDeg=0.0174532925199433;
int forvard(float dist, float n);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASSEX wc;
HWND hwnd;
hInst=hInstance;
memset(&wc,0,sizeof(wc));
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance= hInst;
//wc.hIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,32,32,0);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName= NULL;
wc.lpszClassName = szAppName;
wc.cbSize=sizeof(WNDCLASSEX);
//wc.hIconSm=LoadImage(hInst,MAKEINTRESOURCE(IDI_APPICON_SM),IMAGE_ICON,16,16,0);

if(!RegisterClassEx(&wc))
return FALSE;

hwnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInst, NULL);

if (!hwnd)
return (FALSE);

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}

LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{

PAINTSTRUCT ps;
HDC hdc;

switch (message)
{

case WM_PAINT:
{ hdc=BeginPaint(hwnd,&ps);
HGDIOBJ hPen=CreatePen(PS_DASH, 2, RGB(0,0,255));
HGDIOBJ hOldPen=SelectObject(hdc,hPen);
POINT A;
POINT FAR* lppt=&A;
float n;
float i,j,dist,k;
float x=400;
float y=250;
dist=20;
float x1;
float y1;

MoveToEx(hdc,x,y,NULL);

{for(i=3;i<13;i++)
{n=((i-2)*180)/i;
j=1;
if (i==3) j=0;

while (j!=i+1)//цикл повторяется столько раз, сколко сторон требуется нарисовать(кроме 3угольника, т.к. нужно вернуться на исходную позицию)
{MoveToEx(hdc,x,y,NULL);
x1=x+dist*cos(RadPerDeg*n);
y1=y+dist*sin(RadPerDeg*n);
LineTo(hdc,x1,y1);
x=x1;
y=y1;
j++;}

}
}

EndPaint(hwnd,&ps);
break;
}

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return (0);
}

130 ответов в теме “Помогите, пожалуйста, с графикой С++/WinAPI”

  1. 25
    Леонид Максимов ответил:

    > не знаю по какой причине, но от этих изменений в программе рисунок почти не изменился(

    ну это я с утра ошибся. странно, что у вас мои изменения вообще скомпилировались – там была синтаксическая ошибка:

    for(i=3;i<13;i++){
    n=360/i; // была пропущена точка с запятой
    MoveToEx(hdc,x1=x,y1=y,NULL);
    for(j=0;j<i;j++) LineTo(hdc
    ,x1+=dist*cos(RadPerDeg*n*j)
    ,y1+=dist*sin(RadPerDeg*n*j) // был написан косинус вместо синуса
    );
    }

    из-за косинуса вместо синуса оно ходило неправильно – по диагонали (я так думаю).

  2. 24
    Леонид Максимов ответил:

    > ммм…а разве есть в ТЗ это условие?

    явно указана связка C++/WinAPI

    > Извините,но ИМХО построение графики с помощью WinAPI похоже на изобретение велосипеда)

    преподавателей, насколько я понимаю, это не волнует. им-то как раз и нужны по-новому изобретенные велосипеды.

  3. 23
    Дмитрий Белокуров ответил:

    #21
    про изобретение велосипеда согласен, но это очевидно является каким-то учебным заданием. Не думаю что, преподу понравится, если предъявить ему программу, которая использует неоговоренные библиотеки

  4. 22
    Евгений Воронов ответил:

    Я имею ввиду кусок кода где "рисование" происходит проверить пошагово как работает программа.Эта возможность должна быть в меню компилятора. Более менее сложная программа обычно методом трасировки и отлаживается. В некоторых случаях без нее вообще не разберешься где что,особенно если код не тобой написан.

  5. 21
    Манька Воробьёва ответил:

    трасировку?…. смотря что имеется в виду под этим словом….:-[ не очень понимаю о чем вы…

  6. 20
    Евгений Воронов ответил:

    #16
    ммм…а разве есть в ТЗ это условие?
    Извините,но ИМХО построение графики с помощью WinAPI похоже на изобретение велосипеда)
    Автор,а вы трасировку пробовали делать?

  7. 19
    Манька Воробьёва ответил:

    Леонид maxleo Максимов : не знаю по какой причине, но от этих изменений в программе рисунок почти не изменился(

  8. 18
    Леонид Максимов ответил:

    по поводу вашего результата:
    > x1=x+dist*cos(RadPerDeg*n);
    прибавляет постоянную для многоугольника величину. зачем?

    должно было получиться что-то вроде:

    for(i=3;i<13;i++){
    n=/*180-*/360/i
    MoveToEx(hdc,x1=x,y1=y,NULL);
    for(j=0;j<i;j++) LineTo(hdc,x1+=dist*cos(RadPerDeg*n*j),y1+=dist*cos(RadPerDeg*n*j));
    }

  9. 17
    Манька Воробьёва ответил:

    я тут помозговала и изменила программу, по-моему к лучшему, но она все равно не работает(
    тут надо найти ошибку в функции(MoveToEx(hdc,x,y,NULL)…), но я ее не вижу(
    как-то непонятно у меня с углом дела обстоят…

    #include <windows.h>
    #include <math.h>

    HINSTANCE hInst;
    char szAppName[] ="ApiWin";
    char szTitle[] ="Window Application";

    double RadPerDeg=0.0174532925199433;
    int forvard(float dist, float n);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    MSG msg;
    WNDCLASSEX wc;
    HWND hwnd;
    hInst=hInstance;
    memset(&wc,0,sizeof(wc));
    wc.style=CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc= (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance= hInst;
    //wc.hIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,32,32,0);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName= NULL;
    wc.lpszClassName = szAppName;
    wc.cbSize=sizeof(WNDCLASSEX);
    //wc.hIconSm=LoadImage(hInst,MAKEINTRESOURCE(IDI_APPICON_SM),IMAGE_ICON,16,16,0);

    if(!RegisterClassEx(&wc))
    return FALSE;

    hwnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
    NULL, NULL, hInst, NULL);

    if (!hwnd)
    return (FALSE);

    ShowWindow(hwnd, nCmdShow);

    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return (msg.wParam);
    }

    LRESULT CALLBACK WndProc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam)
    {

    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {

    case WM_PAINT:
    { hdc=BeginPaint(hwnd,&ps);
    HGDIOBJ hPen=CreatePen(PS_DASH, 2, RGB(0,0,255));
    HGDIOBJ hOldPen=SelectObject(hdc,hPen);
    POINT A;
    POINT FAR* lppt=&A;
    float n;
    float i,j,dist,k;
    float x=400;
    float y=250;
    dist=20;
    float x1;
    float y1;

    MoveToEx(hdc,x,y,NULL);

    {for(i=3;i<13;i++)
    {n=((i-2)*180)/i;
    j=1;
    if (i==3) j=0;

    while (j!=i+1)//цикл повторяется столько раз, сколко сторон требуется нарисовать(кроме 3угольника, т.к. нужно вернуться на исходную позицию)
    {MoveToEx(hdc,x,y,NULL);
    x1=x+dist*cos(RadPerDeg*n);
    y1=y+dist*sin(RadPerDeg*n);
    LineTo(hdc,x1,y1);
    x=x1;
    y=y1;
    j++;}

    }
    }

    EndPaint(hwnd,&ps);
    break;
    }

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    default:
    return (DefWindowProc(hwnd, message, wParam, lParam));
    }
    return (0);
    }

  10. 16
    Манька Воробьёва ответил:

    на рисунок выходит какая-то штука, похожая на спираль, а это совсем не то, что надо…

  11. 15
    Дмитрий Белокуров ответил:

    2 Евгений Воронов
    А что если по постановке задачи нельзя использовать никакие иные библиотеки кроме заявленных

  12. 14
    Евгений Воронов ответил:

    Я бы подключил библиотеки DirectX и их функциями бы нарисовал все это дело) Код инициализации там стандартный.

  13. 13
    Дмитрий Белокуров ответил:

    рисовать все линии многоугольника.
    проходим n итераций, где n – число сторон

  14. 12
    Манька Воробьёва ответил:

    Кирилл ———————————————————————————————— Быков: ой, и правда 10))

  15. 11
    Манька Воробьёва ответил:

    Леонид maxleo Максимов: насчет нового цикла: не совсем поняла, что он должен делать?

  16. 10
    Леонид Максимов ответил:

    ваш алгоритм рисует по одной линии от каждого многоугольника. добавьте еще один цикл.

  17. 9
    Кирилл Быков ответил:

    От 3 до 12 включительно — 10 фигур.
            Ваш К.О.

  18. 8
    Леонид Максимов ответил:

    (оффтоп) из чего nbsp?

  19. 7
    Манька Воробьёва ответил:

    Марат Павлов еще раз могу повторить, что до case WM_PAINT идет стандартная часть, или вы не согласны? а программы совсем не похожи, там должно получиться что-то типа спирали, вроде. у меня же 9 целых фигур с общей стороной

  20. 6
    Манька Воробьёва ответил:

    Сергей Викторович Середенин: ТЗ? в смысле, условие?
    нарисовать правильные многоугольники с общей стороной с количеством сторон п=3,..12. т.е. рисунок должен состоять из 9 фигур одновременно.
    а если вас смущает функция, то я пыталась написать ее с помощью черепашьей графики, по всей видимости, не очень удачно..(

  21. 5
    Сергей Середенин ответил:

    Мань скинь с тему ТЗ или что-то похожее

  22. 4
    Марат Павлов ответил:

    Программисты>Обсуждения>WinApl

  23. 3
    Манька Воробьёва ответил:

    Марат Павлов: ??
    я,вроде, уже упомянула, что мало что в этом всем понимаю…

  24. 2
    Манька Воробьёва ответил:

    и до case WM_PAINT идет стандартная часть
    я не писала бы сюда если бы знала, что делать.
    и вообще, о том,что в С++ можно еще и рисовать, я узнала дня 2 назад, так, что еще раз умоляю быть милосердными((
    и вообще, данная программа пишется ночью, и мозг мой (или то, что на его месте), сейчас не особо функционирует((
    вот(

  25. 1
    Марат Павлов ответил:

    Че за дешевый стеб?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.