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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2010, 19:55   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию МЕТАФАЙЛЫ

Добрый день. сделал всё как написано в книжке, но во-первых не работает, во-вторых есть вопросы (указаны в комментариях)
Код:
////////////////////////////////////////////////////////////
// KWnd.h
#include <windows.h>

class KWnd {
public:	
	KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
		LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
		LPCTSTR menuName = NULL,
		int x = CW_USEDEFAULT, int y = 0,
		int width = CW_USEDEFAULT, int height = 0,
		UINT classStyle =  CS_HREDRAW | CS_VREDRAW,
		DWORD windowStyle = WS_OVERLAPPEDWINDOW,
		HWND hParent = NULL);

	HWND GetHWnd() { return hWnd; }
protected:
	HWND hWnd;  
	WNDCLASSEX wc;
};
Код:
#include <windows.h>
#include "KWnd.h"

#define FILE_NAME "Pict1.emf"

void DrawSomething(HDC);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG msg;
	KWnd mainWnd("CreateMetaFile", hInstance, nCmdShow, WndProc);
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;
	static HDC hdcEMF; // ЗАЧЕМ static????
	HENHMETAFILE hemf;//метафайл расширенного типа
	switch (uMsg)
	{
	case WM_CREATE:
			hdcEMF = CreateEnhMetaFile(NULL, FILE_NAME, NULL, "CreateMetaFile\0Pict1\0");
			break;

	case WM_PAINT:
			hDC = BeginPaint(hwnd, &ps);
			DrawSomething(hDC);//для рисования на экране??????
			DrawSomething(hdcEMF);//для рисования в метафайле??????
			EndPaint(hWnd, &ps);
			break;

	case WM_DESTROY:
		hemf = CloseEnhMetaFile(hdcEMF);
		DeleteEnhMetaFile(hemf);
		PostQuitMessage(0);
		break;

	default: 
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
void DrawSomething (HDC hdc)
{
	RECT r;
	HPEN hPen, hOldPen;
	HBRUSH hBrush, hOldBrush;
	SetRect(&r, 20, 20, 220, 220);
	hPen = CreatePen(PS_SOLID, 10, RGC(255, 160, 140));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	/* что делают 
	hPen = CreatePen(PS_SOLID, 10, RGC(255, 160, 140));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	*/
	hBrush = CreateSolidBrush(RGB(140, 160, 255));
	hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
	Recttangle (hdc, r.left, r.top, r.right, r.bottom);
	
	hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
	SelectObject(hdc; hPen);
	hBrush = CreateSolidBrush(RGB(100, 100, 100));
	SelectObject(hdc, hBrush);
	InflateRect(&r, -40, -40);//что это такое
	Ellipse(hdc, r.left, r.top, r.right, r.bottom);
	SetTextColor(hdc, RGB(255, 255, 255));
	SetBkMode (hdc, TRANSPARENT);//тчто такое TRANSPARENT
	DrawText(hdc,"YES!", -1, &r, DT|CENTER|DT_SINGLE|DT|VCENTER);

	DeleteObject(SelectObject(hdc, hOldPen);
	DeleteObject(SelectObject(hdc, hOldPen);
}
P.S. сам не понимаю почему, но не было написано включить файл, где описан класс Kwnd (в смысле описана его реализация). но он тут:
Код:
////////////////////////////////////////////////////////////
// KWnd.cpp
#include "KWnd.h"

KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
				   LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
				   LPCTSTR menuName, int x, int y, int width, int height,
				   UINT classStyle, DWORD windowStyle, HWND hParent)
{
	char szClassName[] = "KWndClass";

	wc.cbSize        = sizeof(wc);
	wc.style         = classStyle;
	wc.lpfnWndProc   = pWndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInst;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = menuName;
	wc.lpszClassName = szClassName;
	wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		char msg[100] = "Cannot register class: ";
		strcat(msg, szClassName);
		MessageBox(NULL, msg, "Error", MB_OK);
		return;
	}
	
	// Создаем окно
	hWnd = CreateWindow(szClassName, windowName, windowStyle,
		x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);       
	
	if (!hWnd) {
		char text[100] = "Cannot create window: ";
		strcat(text, windowName);
		MessageBox(NULL, text, "Error", MB_OK);
		return;
	}

	// Показываем  окно
	ShowWindow(hWnd, cmdShow); 
}
Dimarik вне форума Ответить с цитированием
Старый 26.03.2010, 23:06   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
ЗАЧЕМ static????
для того, чтобы он не терялся при последующих вызовах функции WndProc (можно сделать глобальной переменной)

Цитата:
для рисования на экране??????
Цитата:
/для рисования в метафайле??????
Да.

Цитата:
/* что делают
hPen = CreatePen(PS_SOLID, 10, RGC(255, 160, 140));
hOldPen = (HPEN)SelectObject(hdc, hPen);
*/
CreatePen создает кисть для рисования
SelectObject выбирает созданную кисть в контекст устройства, и возвращает ранеее выбранную кисть

Цитата:
InflateRect(&r, -40, -40);//что это такое
попробуйте глянуть в MSDN:

The InflateRect function increases or decreases the width and height of the specified rectangle. The InflateRect function adds dx units to the left and right ends of the rectangle and dy units to the top and bottom. The dx and dy parameters are signed values; positive values increase the width and height, and negative values decrease them.

Цитата:
//тчто такое TRANSPARENT
TRANSPARENT означает прозрачный (в данном случае - цвет фона текста)

Последний раз редактировалось counter; 26.03.2010 в 23:14.
counter вне форума Ответить с цитированием
Старый 27.03.2010, 09:39   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а чего не работает???(((((
Dimarik вне форума Ответить с цитированием
Старый 27.03.2010, 10:28   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

я кажись понял чё не пашет.
во-первых у меня была кодировка юникода, во вторых синтаксис.
но есть важный вопрос по поводу компиляции. вот у нас есть многофайловый проект. например в файле f.h описано объявление класса, в файле f.cpp его реализация, а в файле main.cpp сама прога. как правильно подключить? у меня получилось только подлючить к f.cpp f.h, а к main.cpp f.cpp. но кажись это криво как-то . подскажите плиз как праивльно надо подключить и как всё компилится
Dimarik вне форума Ответить с цитированием
Старый 27.03.2010, 10:35   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

не компилится из-за ошибок синтаксиса (видимо это был копипаст из книги)

cpp не подключаются, надо подключать h-файлы
counter вне форума Ответить с цитированием
Старый 27.03.2010, 12:12   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

если я вот так пишу то нихрена не пашет:
Код:
////////////////////////////////////////////////////////////
#include <windows.h>
#include "KWnd.h"
#define FILE_NAME "Pict1.emf"

void DrawSomething(HDC);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG msg;
	KWnd mainWnd("CreateMetaFile", hInstance, nCmdShow, WndProc);
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	static HDC hdcEMF; // ЗАЧЕМ static????
	HENHMETAFILE hemf;//метафайл расширенного типа
	switch (uMsg)
	{
	case WM_CREATE:
			hdcEMF = CreateEnhMetaFile(NULL, FILE_NAME, NULL, "CreateMetaFile\0Pict1\0");
			break;

	case WM_PAINT:
			hDC = BeginPaint(hWnd, &ps);
			DrawSomething(hDC);//для рисования на экране??????
			DrawSomething(hdcEMF);//для рисования в метафайле??????
			EndPaint(hWnd, &ps);
			break;

	case WM_DESTROY:
		hemf = CloseEnhMetaFile(hdcEMF);
		DeleteEnhMetaFile(hemf);
		PostQuitMessage(0);
		break;

	default: 
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
void DrawSomething (HDC hdc)
{
	RECT r;
	HPEN hPen, hOldPen;
	HBRUSH hBrush, hOldBrush;
	SetRect(&r, 20, 20, 220, 220);
	hPen = CreatePen(PS_SOLID, 10, RGB(255, 160, 140));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	/* что делают 
	hPen = CreatePen(PS_SOLID, 10, RGC(255, 160, 140));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	*/
	hBrush = CreateSolidBrush(RGB(140, 160, 255));
	hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
	Rectangle (hdc, r.left, r.top, r.right, r.bottom);
	
	hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
	SelectObject(hdc, hPen);
	hBrush = CreateSolidBrush(RGB(100, 100, 100));
	SelectObject(hdc, hBrush);
	InflateRect(&r, -40, -40);//что это такое
	Ellipse(hdc, r.left, r.top, r.right, r.bottom);
	SetTextColor(hdc, RGB(255, 255, 255));
	SetBkMode (hdc, TRANSPARENT);//тчто такое TRANSPARENT
	DrawText(hdc,"YES!", -1, &r, DT_CENTER|DT_SINGLELINE|DT_VCENTER);

	DeleteObject(SelectObject(hdc, hOldPen));
	DeleteObject(SelectObject(hdc, hOldPen));
}
////////////////////////////////////////////////////////////
// KWnd.h
#include <windows.h>

class KWnd {
public:	
	KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
		LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
		LPCTSTR menuName = NULL,
		int x = CW_USEDEFAULT, int y = 0,
		int width = CW_USEDEFAULT, int height = 0,
		UINT classStyle =  CS_HREDRAW | CS_VREDRAW,
		DWORD windowStyle = WS_OVERLAPPEDWINDOW,
		HWND hParent = NULL);

	HWND GetHWnd() { return hWnd; }
protected:
	HWND hWnd;  
	WNDCLASSEX wc;
};

а всё скорее всего потому что главный файл никаким образом не связан с файлом *.срр










//а вот и сам файл
////////////////////////////////////////////////////////////
// KWnd.cpp
#include "KWnd.h"

KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
				   LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
				   LPCTSTR menuName, int x, int y, int width, int height,
				   UINT classStyle, DWORD windowStyle, HWND hParent)
{
	char szClassName[] = "KWndClass";

	wc.cbSize        = sizeof(wc);
	wc.style         = classStyle;
	wc.lpfnWndProc   = pWndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInst;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = menuName;
	wc.lpszClassName = szClassName;
	wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		char msg[100] = "Cannot register class: ";
		strcat(msg, szClassName);
		MessageBox(NULL, msg, "Error", MB_OK);
		return;
	}
	
	// Создаем окно
	hWnd = CreateWindow(szClassName, windowName, windowStyle,
		x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);       
	
	if (!hWnd) {
		char text[100] = "Cannot create window: ";
		strcat(text, windowName);
		MessageBox(NULL, text, "Error", MB_OK);
		return;
	}

	// Показываем  окно
	ShowWindow(hWnd, cmdShow); 
}
P.S. может я как-то криво подключаю??
как вооббще надо правильно было бы подключать?
Dimarik вне форума Ответить с цитированием
Старый 27.03.2010, 14:05   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

как я прочитал в книжке: "Использование любого графического объекта предполагает выполнение следующей последовательности операций:
1. Создать графический объект
2. Выбрать созданный объект в контекст устройства
3. Вызывать графическую функцию, работающую с объектом
4. Удалить объект из контекста устройства, вернув предшествующий объект.
5. Уничтожить объект
вроде бы первые 4 выполнены:
Код:
RECT r;
	HPEN hPen, hOldPen;
	HBRUSH hBrush, hOldBrush;
	SetRect(&r, 20, 20, 220, 220);
	hPen = CreatePen(PS_SOLID, 10, RGB(255, 160, 140));//1. Создаём графический объект
	hOldPen = (HPEN)SelectObject(hdc, hPen);//2. Выбираем созданный объект в контекст устройства
	hBrush = CreateSolidBrush(RGB(140, 160, 255));//1. Создаём графический объект
	hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);//2. Выбираем созданный объект в контекст устройства
	Rectangle (hdc, r.left, r.top, r.right, r.bottom);//3. Вызываем графическую функцию, раюотающую с объектом
	//в данном случае - рисуем прямоугольник
	
	hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));//1. Создаём графический объект
	SelectObject(hdc, hPen);//2. Выбираем созданный объект в контекст устройства
	hBrush = CreateSolidBrush(RGB(100, 100, 100));//1. Создаём графический объект
	SelectObject(hdc, hBrush);//2. Выбираем созданный объект в контекст устройства
	InflateRect(&r, -40, -40);
	Ellipse(hdc, r.left, r.top, r.right, r.bottom);
	SetTextColor(hdc, RGB(255, 255, 255));
	SetBkMode (hdc, TRANSPARENT);
	DrawText(hdc,"YES!", -1, &r, DT_CENTER|DT_SINGLELINE|DT_VCENTER);

	DeleteObject(SelectObject(hdc, hOldPen));
	DeleteObject(SelectObject(hdc, hOldBrush));
	DeleteObject(SelectObject(hdc, hPen));
	DeleteObject(SelectObject(hdc, hBrush));
и ещё одна проблема.





hPen = CreatePen(PS_SOLID, 10, RGB(255, 160, 140));//1. Создаём графический объект
hOldPen = (HPEN)SelectObject(hdc, hPen);//2. Выбираем созданный объект в контекст устройства
hBrush = CreateSolidBrush(RGB(140, 160, 255));//1. Создаём графический объект
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);//2. Выбираем созданный объект в контекст устройства
Rectangle (hdc, r.left, r.top, r.right, r.bottom);//3. Вызываем графическую функцию, раюотающую с объектом



не понятно, с чем функция работает с кистью или пером?
в первый раз мы в hdc записали перо, затем пререзаписали кисть. если записали перо в первый раз, а затем поверх кисть записали значит с кистью работали. но зачем тогда надо было в первый раз перо туда записывать?
За.ем. у нас 2 раза создаётся перо. Если уж так делаем то по идее мы дожны были бы 1 раз поработать с пером, удалить его, а потом заново создавать? или как? что-то я не догоняю.
Dimarik вне форума Ответить с цитированием
Старый 27.03.2010, 15:14   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
если я вот так пишу то нихрена не пашет
и в чем это проявляется?

Цитата:
а всё скорее всего потому что главный файл никаким образом не связан с файлом *.срр
Кто вам такое сказал? У вас же написано в главном файле #include "KWnd.h"

Цитата:
не понятно, с чем функция работает с кистью или пером?
с последним выбранным объектом, т.е. с кистью

Цитата:
Если уж так делаем то по идее мы дожны были бы 1 раз поработать с пером, удалить его, а потом заново создавать? или как? что-то я не догоняю.
В общем-то да.

Как вариант:

1. В начале программы создать перо и кисть (дескрипторы сохранить) CreatePen и CreateSolidBrush
2. Выбрать в контекст перо SelectObject
3. Работать с пером
4. Выбрать в контекст кисть SelectObject
5. Работать с кистью
6. В конце программы удалить объекты перо и кисть DeleteObject

Последний раз редактировалось counter; 27.03.2010 в 15:17.
counter вне форума Ответить с цитированием
Старый 27.03.2010, 16:43   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

хм. странно как-то
hPen = CreatePen(PS_SOLID, 10, RGB(255, 160, 140));//1. Создаём графический объект
hOldPen = (HPEN)SelectObject(hdc, hPen);//2. Выбираем созданный объект в контекст устройства
hBrush = CreateSolidBrush(RGB(140, 160, 255));//1. Создаём графический объект
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);//2. Выбираем созданный объект в контекст устройства
Rectangle (hdc, r.left, r.top, r.right, r.bottom);//3. Вызываем графическую функцию, раюотающую с объектом
удаляю первые 2 строчки - другой результат.
получается что функция
Rectangle (hdc, r.left, r.top, r.right, r.bottom)
работает с 2мя объектами почему-то, только непонятно почему


вот заголовочный файл
Код:
#include <windows.h>

class KWnd {
public:	
	KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
		LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
		LPCTSTR menuName = NULL,
		int x = CW_USEDEFAULT, int y = 0,
		int width = CW_USEDEFAULT, int height = 0,
		UINT classStyle =  CS_HREDRAW | CS_VREDRAW,
		DWORD windowStyle = WS_OVERLAPPEDWINDOW,
		HWND hParent = NULL);

	HWND GetHWnd() { return hWnd; }
protected:
	HWND hWnd;  
	WNDCLASSEX wc;
};
нету там определений. они есть в файле KWnd.cpp

Код:
////////////////////////////////////////////////////////////
// KWnd.cpp
#include "KWnd.h"

KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
				   LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),
				   LPCTSTR menuName, int x, int y, int width, int height,
				   UINT classStyle, DWORD windowStyle, HWND hParent)
{
	char szClassName[] = "KWndClass";

	wc.cbSize        = sizeof(wc);
	wc.style         = classStyle;
	wc.lpfnWndProc   = pWndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInst;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = menuName;
	wc.lpszClassName = szClassName;
	wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		char msg[100] = "Cannot register class: ";
		strcat(msg, szClassName);
		MessageBox(NULL, msg, "Error", MB_OK);
		return;
	}
	
	// Создаем окно
	hWnd = CreateWindow(szClassName, windowName, windowStyle,
		x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);       
	
	if (!hWnd) {
		char text[100] = "Cannot create window: ";
		strcat(text, windowName);
		MessageBox(NULL, text, "Error", MB_OK);
		return;
	}

	// Показываем  окно
	ShowWindow(hWnd, cmdShow); 
}
Dimarik вне форума Ответить с цитированием
Старый 27.03.2010, 17:23   #10
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

глянул MSDN:
Цитата:
The Ellipse function draws an ellipse. The center of the ellipse is the center of the specified bounding rectangle. The ellipse is outlined by using the current pen and is filled by using the current brush.
тоже и для Rectangle

Pen для контура, Brush - для заливки - потому и могут существовать одновременно

Удаляйте не нужные объекты
Код:
void DrawSomething (HDC hdc)
{
	RECT r;
	HPEN hPen, hOldPen;
	HBRUSH hBrush, hOldBrush;
	SetRect(&r, 20, 20, 220, 220);
	hPen = CreatePen(PS_SOLID, 10, RGB(255, 160, 140));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	hBrush = CreateSolidBrush(RGB(140, 160, 255));
	hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
	Rectangle (hdc, r.left, r.top, r.right, r.bottom);
	
	DeleteObject(hPen);
	DeleteObject(hBrush);

	hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
	SelectObject(hdc, hPen);
	hBrush = CreateSolidBrush(RGB(100, 100, 100));
	SelectObject(hdc, hBrush);
	
	InflateRect(&r, -40, -40);//что это такое
	
	Ellipse(hdc, r.left, r.top, r.right, r.bottom);
	SetTextColor(hdc, RGB(255, 255, 255));
	SetBkMode (hdc, TRANSPARENT);//тчто такое TRANSPARENT
	DrawText(hdc,"YES!", -1, &r, DT_CENTER|DT_VCENTER);

	DeleteObject(hPen);
	DeleteObject(hBrush);
}
counter вне форума Ответить с цитированием
Ответ


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