如何在c++创建窗口画线和画圆
时间: 2024-05-07 20:19:03 浏览: 99
如何在窗口中画线
在C语言中创建窗口需要用到图形库,比如Windows下的WinAPI或者Linux下的X11等。这里以Windows下的WinAPI为例,介绍如何创建窗口、画线和画圆。
1. 创建窗口
在WinAPI中,创建窗口需要使用CreateWindow函数,其原型为:
```c
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
```
其中,lpClassName是窗口类名,lpWindowName是窗口标题,dwStyle是窗口样式,x、y、nWidth、nHeight是窗口位置和大小,hWndParent是父窗口句柄,hMenu是菜单句柄,hInstance是当前应用程序实例句柄,lpParam是用户数据指针。
例如,下面的代码创建了一个宽度为400、高度为300的窗口:
```c
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MyWindowClass";
if (!RegisterClass(&wc))
return 0;
hWnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL);
if (!hWnd)
return 0;
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)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
2. 画线
在WinAPI中,画线需要使用LineTo函数和MoveToEx函数,其原型为:
```c
BOOL LineTo(
HDC hdc,
int x,
int y
);
BOOL MoveToEx(
HDC hdc,
int x,
int y,
LPPOINT lpPoint
);
```
其中,hdc是设备环境句柄,x、y是线的结束点坐标,lpPoint是起始点坐标。
例如,下面的代码在窗口中画一条从左上到右下的红色直线:
```c
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
HGDIOBJ hOldPen = SelectObject(hdc, hPen);
MoveToEx(hdc, 0, 0, NULL);
LineTo(hdc, 400, 300);
SelectObject(hdc, hOldPen);
DeleteObject(hPen);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
3. 画圆
在WinAPI中,画圆需要使用Ellipse函数,其原型为:
```c
BOOL Ellipse(
HDC hdc,
int left,
int top,
int right,
int bottom
);
```
其中,hdc是设备环境句柄,left、top、right、bottom是圆的左上角和右下角坐标。
例如,下面的代码在窗口中画一个绿色的圆:
```c
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));
HGDIOBJ hOldBrush = SelectObject(hdc, hBrush);
Ellipse(hdc, 100, 100, 300, 200);
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
以上是在C语言中创建窗口、画线和画圆的简单介绍。实际上,WinAPI提供了更多的函数和特性,可以实现更加复杂的图形界面和交互效果。
阅读全文