Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 17:26   #1
Sylar9
Форумчанин
 
Регистрация: 22.10.2011
Сообщений: 252
Вопрос Нарисовать эллипс в низу окна программы

У меня такое задание было нарисовать эллипс в низу окна. Функция которая рисует эллипс -это Ellipse(); , но у меня возник вопрос, как узнать координаты низа окна, одним словом не как не могу понят как задать координаты что бы эллипс был в низу окна (программы)
Sylar9 вне форума Ответить с цитированием
Старый 20.04.2012, 18:15   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

GetClientRect()
counter вне форума Ответить с цитированием
Старый 20.04.2012, 19:20   #3
Sylar9
Форумчанин
 
Регистрация: 22.10.2011
Сообщений: 252
Вопрос

Цитата:
Сообщение от counter Посмотреть сообщение
GetClientRect()
я только начал учить WinApi можешь написать кусок кода с комментариями, который рисует внизу окна эллипс
Sylar9 вне форума Ответить с цитированием
Старый 20.04.2012, 19:51   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Sylar9 Посмотреть сообщение
я только начал учить WinApi можешь написать кусок кода с комментариями, который рисует внизу окна эллипс
ну ты же уже начал что-то делать, вот и покажи что есть ... с коментариями
counter вне форума Ответить с цитированием
Старый 20.04.2012, 20:43   #5
Sylar9
Форумчанин
 
Регистрация: 22.10.2011
Сообщений: 252
Радость

Цитата:
Сообщение от counter Посмотреть сообщение
ну ты же уже начал что-то делать, вот и покажи что есть ... с коментариями
Код:
#define _WIN32_WINNT 0x500
#include <windows.h>
#define ID_BUTTON1 1000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	HWND button;
	char szClassName[] = "mywindowclass";
	WNDCLASSEX wc = {};
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
	wc.hCursor =  LoadCursor(NULL, IDC_CROSS);
	wc.lpszClassName = szClassName;
	wc.lpfnWndProc = WndProc;
	wc.style = CS_HREDRAW|CS_VREDRAW | CS_NOCLOSE;
	wc.hIcon = LoadIcon(NULL, IDI_ERROR);

	RegisterClassEx(&wc);
	
	HWND hMainWnd = CreateWindow(szClassName, "Hello", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);
	button=CreateWindow("button","Кнопка №1",WS_OVERLAPPEDWINDOW, 100, 10, 100, 0,hMainWnd,(HMENU)ID_BUTTON1,NULL,NULL);
	ShowWindow(hMainWnd, SW_SHOW);
	
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
		DispatchMessage(&msg);
	return 0;
}



LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HPEN hPen;
	int w, l;
	POINT pt[5] = {{100, 100}, {200, 100}, {200, 200}, {100, 200}, {100, 100}}; 
	switch (uMsg)
	{
	case WM_PAINT:
		PAINTSTRUCT ps;
		BeginPaint(hWnd, &ps);
		DrawText(ps.hdc, "Hello Word", -1, &ps.rcPaint, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		Arc(ps.hdc, 100, 100, 400, 300, 350, 50, 50, 300); // Дуга вырисовуеться
		MoveToEx(ps.hdc, pt[0].x, pt[0].y, NULL);
		for(int i=0; i<5; ++i)
			LineTo(ps.hdc, pt[i].x, pt[i].y);
		// Крывая
		PolyBezierTo(ps.hdc, pt, 8);
		//Перо
		hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
		SelectObject(ps.hdc, hPen);
		DeleteObject(hPen);
		//Кисть
		HBRUSH hd;
		hd = (HBRUSH)GetStockObject(GRAY_BRUSH);
		// Рисуем прямоугольник
		Rectangle(ps.hdc, 110, 110,250,250);
		// элипс
		Ellipse(ps.hdc, 741, 150, 860, 350);
		// Закругленый прямогугольник
		RoundRect(ps.hdc, 1036, 150, 1036, 555, 369, 1036);
		EndPaint(hWnd, &ps);
		break;
    case WM_COMMAND:
       if(wParam==ID_BUTTON1){
		   MessageBox(NULL, "Вы нажали на кнопку №1", "Test", MB_OK|MB_ICONEXCLAMATION); }
         break;
	case WM_SIZE:
		w = LOWORD(lParam);
		l = HIWORD(lParam);
		return 0;
	case WM_CLOSE:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Sylar9 вне форума Ответить с цитированием
Старый 20.04.2012, 21:07   #6
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Возможно так )
Ellipse(ps.hdc, 741, 150, 860,ps.rcPaint.bottom)
Мастак вне форума Ответить с цитированием
Старый 20.04.2012, 21:30   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Ellipse(ps.hdc, 741, 150, 860,ps.rcPaint.bottom)
в rcPaint не клиентские координаты, а инвалидная область для прорисовки, поэтому наверное не корректно.

Раз уж автор обрабатывает WM_SIZE, то видимо так:

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static W = 0, H = 0;
	switch (uMsg)
	{
	case WM_PAINT:
		PAINTSTRUCT ps;
		BeginPaint(hWnd, &ps);
		{
			HGDIOBJ hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
			HGDIOBJ hprevpen = SelectObject(ps.hdc, hPen);
			Ellipse(ps.hdc, 741, 150, 860, H);
			DeleteObject(SelectObject(ps.hdc, hprevpen));
		}
		EndPaint(hWnd, &ps);
		break;
	case WM_SIZE:
		W = LOWORD(lParam);
		H = HIWORD(lParam);
		break;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Да и с пером ТС намудрил:
Цитата:
hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
SelectObject(ps.hdc, hPen);
DeleteObject(hPen);
EUGY вне форума Ответить с цитированием
Старый 20.04.2012, 21:43   #8
Sylar9
Форумчанин
 
Регистрация: 22.10.2011
Сообщений: 252
Вопрос

Цитата:
Сообщение от EUGY Посмотреть сообщение
в rcPaint не клиентские координаты, а инвалидная область для прорисовки, поэтому наверное не корректно.

Раз уж автор обрабатывает WM_SIZE, то видимо так:

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static W = 0, H = 0;
	switch (uMsg)
	{
	case WM_PAINT:
		PAINTSTRUCT ps;
		BeginPaint(hWnd, &ps);
		{
			HGDIOBJ hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
			HGDIOBJ hprevpen = SelectObject(ps.hdc, hPen);
			Ellipse(ps.hdc, 741, 150, 860, H);
			DeleteObject(SelectObject(ps.hdc, hprevpen));
		}
		EndPaint(hWnd, &ps);
		break;
	case WM_SIZE:
		W = LOWORD(lParam);
		H = HIWORD(lParam);
		break;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Да и с пером ТС намудрил:
а что надо исправить с пером, прост я только начал учить винапи не могу понят как преминять перо

А можешь твой код прокомментировать а то многое не понятно
Sylar9 вне форума Ответить с цитированием
Старый 20.04.2012, 21:55   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
а что надо исправить с пером, прост я только начал учить винапи не могу понят как преминять перо
А можешь твой код прокомментировать а то многое не понятно
С пером я показал исправленный вариант.

Вот есть контекст. Device Context
В нем по умолчанию выбрано перо, кисть, фонт.. И еще много всего.

Код:
//Создаешь новое перо
HGDIOBJ hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
//Выбираешь его в контексте.
//SelectObject при выборе нового пера возвращает предыдущее перо. Оно было в контексте по умолчанию.
//Его надо сохранить.
HGDIOBJ hprevpen = SelectObject(ps.hdc, hPen);
//Рисуем элипс нужным пером
Ellipse(ps.hdc, 741, 150, 860, H);

//Новое перо больше не нужно? Выбираем в контексте сохраненное.
SelectObject(ps.hdc, hprevpen));
//Удаляем ненужное перо. Перо обязательно должно быть свободно,
//то есть не выбрано ни в каком контексте
DeleteObject(hPen);
// Тоже самое, но в одну строчку:
//DeleteObject(SelectObject(ps.hdc, hprevpen));
EUGY вне форума Ответить с цитированием
Старый 20.04.2012, 22:22   #10
Sylar9
Форумчанин
 
Регистрация: 22.10.2011
Сообщений: 252
Вопрос

Цитата:
Сообщение от EUGY Посмотреть сообщение
С пером я показал исправленный вариант.

Вот есть контекст. Device Context
В нем по умолчанию выбрано перо, кисть, фонт.. И еще много всего.

Код:
//Создаешь новое перо
HGDIOBJ hPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));
//Выбираешь его в контексте.
//SelectObject при выборе нового пера возвращает предыдущее перо. Оно было в контексте по умолчанию.
//Его надо сохранить.
HGDIOBJ hprevpen = SelectObject(ps.hdc, hPen);
//Рисуем элипс нужным пером
Ellipse(ps.hdc, 741, 150, 860, H);

//Новое перо больше не нужно? Выбираем в контексте сохраненное.
SelectObject(ps.hdc, hprevpen));
//Удаляем ненужное перо. Перо обязательно должно быть свободно,
//то есть не выбрано ни в каком контексте
DeleteObject(hPen);
// Тоже самое, но в одну строчку:
//DeleteObject(SelectObject(ps.hdc, hprevpen));
а зачем надо сообщение WM_SIZE ?
Sylar9 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать эллипс с наклонной пунктирной штриховкой Ajmda Помощь студентам 17 18.03.2015 12:57
Объединить программы в подпрограммы(использование procedure) и нарисовать блок схему. Camelot_2012 Паскаль, Turbo Pascal, PascalABC.NET 7 16.04.2012 22:31
Футер не прилипает к низу окна antmihlin HTML и CSS 2 07.01.2011 13:41
Нарисовать блок-схему программы prikolist Общие вопросы C/C++ 4 20.05.2009 19:46
Не могу нарисовать блок-схему маленькой программы prikolist Паскаль, Turbo Pascal, PascalABC.NET 4 25.11.2008 23:40