Diskuze: C++ Vykreslení polygonu z vektoru souřadnic
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


google = cpp draw polygon
#include <iostream.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
int driver=VGA;
int mode=VGAHI;
initgraph(&driver,&mode,"c:\\tc\\Bgi");
setcolor(15);
moveto(x0,y0);
lineto(x1,y1);
...
lineto(x0,y0);
# # #
VOID Example_DrawPolygon2(HDC hdc)
{
Graphics graphics(hdc);
// Create a Pen object.
Pen blackPen(Color(255, 0, 0, 0), 3);
// Create an array of PointF objects that define the polygon.
PointF point1(100.0f, 100.0f);
PointF point2(200.0f, 130.0f);
PointF point3(150.0f, 200.0f);
PointF point4(50.0f, 200.0f);
PointF point5(0.0f, 130.0f);
PointF points[5] = {point1, point2, point3, point4, point5};
PointF* pPoints = points;
// Draw the polygon.
graphics.DrawPolygon(&blackPen, pPoints, 5);
}
Caster:7.6.2018 17:04
Díky, ale Visual Studio 2017 většinu příkazů a knihoven z příkladu výše vůbec nezná. Navíc tam chybí hlavní funkce Main. Nefunguje to.
Radek Chalupa:7.6.2018 20:59
Ale zná, to jen kolega vzhledem k tomu že tohle je fórum C++, napsal
příklad v C++ (v tomto případě pro windows a s využitím GDI+), takže
buď to udělej v céčku nebo polož dotaz ve fóru věnovaném C#
PS: měl jsem samozřejmě na mysli pouze tu funkci Examle_DrawPolygon, to před tím není GUI pro windows, ale myslím nějaká borland knihovna pro kreslení do konzole..
Caster:7.6.2018 21:21
V úvodu jsem psal, že mi jde o C++. Trochu jsem hledal dál a teď bych ještě doplnit asi za použití funkcí Windows API. Netušil jsem, že to je takové harakiri zobrazit v okně binární obrázek a vynést do něj trasy podle souřadnic.
Radek Chalupa:7.6.2018 21:28
Takové harakiri to není, můžeš použít tu funkci od kolegy, akorát
musíš vědět odkud ji zavolat, konkrétně nejspíš v obsluze zprávy
WM_PAINT, aby tam ten výsledek byl "trvale", tj. provést to při každém
požadavku na překreslení okna nebo jeho části.
Jinak v čistém WinAPI (bez GDI+) viz příklad zde: https://www.radekchalupa.cz/…se-winapi/14
Caster:7.6.2018 21:45
Díky, vypadá to na dlouhé studium. Ideálně bych potřeboval odkaz na nějaký kompletní ukázkový příklad. O bitmapách jsem našel info zde Není tam ale příklad, jak to reálně použít v C++.
V QT, je mozne pouzit ruzne funkce s ruznych knihoven. Jen musis vedet, jak
ty knihovny pripojit k programu. Totez jiste jde ve VS.
Jinak, chtel jsem te naucit googlovat, jak postupovat v pripade, kdy chces
pouzit funkci z jineho jazyka
google = cpp visual studio 2017 DrawPolygon
https://msdn.microsoft.com/…vs.110).aspx?…
https://msdn.microsoft.com/…=vs.71).aspx
https://msdn.microsoft.com/…=vs.85).aspx
Caster:10.6.2018 2:27
Jak to zamontovat kreslení polygonů do programu ?
// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
// Global variables
// The main window class name.
static TCHAR szWindowClass[] = _T("DesktopApp");
// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");
HINSTANCE hInst;
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Windows Desktop Guided Tour"),
NULL);
return 1;
}
// Store instance handle in our global variable
hInst = hInstance;
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);
if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Windows Desktop Guided Tour"),
NULL);
return 1;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("Hello, Windows desktop!");
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Here your application is laid out.
// For this introduction, we just print out "Hello, Windows desktop!"
// in the top left corner.
TextOut(hdc,
5, 5,
greeting, _tcslen(greeting));
// End application-specific layout section.
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
Radek Chalupa:10.6.2018 7:39
Ve funkci WindowProc máš volání TextOut, místo toho tam jednoduše
zavoláš tu výše zmíněnou funkci Example_drawPolygon2 s tím parametrem
hdc.
Navíc pokud někde jinde v programu změníš ty data/body které chceš
vykreslovat, zavoláš
RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
tím se vyvolá okamžité překreslení okna, tj. bude zavolána ta obsluha
zprávy WM_PAINT.
Caster:10.6.2018 22:08
Doplnil jsem tam ten polygon (ukázka z roku 2012...)
// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
// Global variables
// The main window class name.
static TCHAR szWindowClass[] = _T("DesktopApp");
// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");
HINSTANCE hInst;
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Windows Desktop Guided Tour"),
NULL);
return 1;
}
// Store instance handle in our global variable
hInst = hInstance;
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);
if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Windows Desktop Guided Tour"),
NULL);
return 1;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
VOID Example_DrawPolygon2(HDC hdc)
{
Graphics graphics(hdc);
// Create a Pen object.
Pen blackPen(Color(255, 0, 0, 0), 3);
// Create an array of PointF objects that define the polygon.
PointF point1(100.0f, 100.0f);
PointF point2(200.0f, 130.0f);
PointF point3(150.0f, 200.0f);
PointF point4(50.0f, 200.0f);
PointF point5(0.0f, 130.0f);
PointF points[5] = { point1, point2, point3, point4, point5 };
PointF* pPoints = points;
// Draw the polygon.
graphics.DrawPolygon(&blackPen, pPoints, 5);
}
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("Hello, Windows desktop!");
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Here your application is laid out.
// For this introduction, we just print out "Hello, Windows desktop!"
// in the top left corner.
TextOut(hdc,
5, 5,
greeting, _tcslen(greeting));
// End application-specific layout section.
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
Ale Nezná to:
#include <graphics.h>
v apostrofech:
"Graphics" graphics(hdc);
"Pen" blackPen("Color"(255, 0, 0, 0), 3);
"PointF" point1(100.0f, 100.0f);
Radek Chalupa:10.6.2018 22:19
podle všeho by to měly být třídy z GDI+, takže zkus
#include <gdiplus.h>
$pragma comment (lib, "gdiplus.lib")
a graphics.h vyhoď, to bude asi z té staré konzolové grafiky od borlandu
Caster:10.6.2018 22:25
#include <gdiplus.h> to vzalo, nicméně na dalším řádku už ne tu
pragmu, chyby stejné.
Celý kód stačí zkopírovat do Visual Studio 2017 jako desktop aplikaci a
zkusit přeložit (po vložení té funkce Example_drawPolygon2)...
Radek Chalupa:10.6.2018 22:38
měl jsem na mysli visual studio nebo nějaké ide/kompilátor které umí windows sdk, ta knihovna gdiplus.lib je ve windows sdk a kompatibilní s microsoft kompilátorem, resp. linkerem
Caster:10.6.2018 22:48
Moc se v tom nevyznám. Mám instalován "Visual Studio 2017", které na běžné věci funguje zcela bez problémů viz ukázkový příklad vytvoření okna výše. Netuším, kde bych v něm měl ověřit, ža tam je nějaké ide...
Zobrazeno 18 zpráv z 18.