В общем, вот отображение графа, заданного матрицей смежности:
#include <windows.h> #include <stdio.h> #include <math.h> #define BTN_ID 110 #define SIZE 5 #define R 150 #define E 30 POINT vertex[SIZE]; int adj_mx[SIZE][SIZE] = { {0, 0, 1, 1, 0}, {0, 0, 0, 1, 1}, {1, 0, 0, 0, 1}, {1, 1, 0, 0, 0}, {0, 1, 1, 0, 0} }; char szClassName[ ] = "CodeBlocksWindowsApp"; HWND hwnd; LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT r; switch (message) { case WM_PAINT: { PAINTSTRUCT ps; HDC hMyDC = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &r); int center_x = (r.right - r.left) / 2; int center_y = (r.bottom - r.top) / 2; double angle = 2 * M_PI / SIZE; for(int i = 0; i < SIZE; i++) { vertex[i].x = center_x + (int)(R * cos(M_PI/2 + i * angle)); vertex[i].y = center_y - (int)(R * sin(M_PI/2 + i * angle)); } HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); HGDIOBJ hpenOld = SelectObject(hMyDC, hPen); for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { if(adj_mx[i][j]) { MoveToEx(hMyDC, vertex[i].x, vertex[i].y, NULL); LineTo(hMyDC, vertex[j].x, vertex[j].y); } } } for(int i = 0; i < SIZE; i++) { Ellipse(hMyDC, vertex[i].x - E/2, vertex[i].y - E/2, vertex[i].x + E/2, vertex[i].y + E/2); RECT r; r.left = vertex[i].x - E/2; r.right = vertex[i].x + E/2; r.top = vertex[i].y - E/2; r.bottom = vertex[i].y + E/2; char s[3] = {0}; sprintf(s, "%d", i + 1); DrawText(hMyDC, s, -1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } SelectObject(hMyDC, hpenOld); DeleteObject(hPen); EndPaint(hwnd, &ps); } break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx(&wincl)) return 0; hwnd = CreateWindowEx ( 0, szClassName, "Graph Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (hwnd, nCmdShow); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; }
Вот что получается в результате: