Создание программы на Visual C++, выводящей в windows-окно эллипсов с использованием всех возможных вариантов заливки.
В среде Visual C++ наберём текст программы :
// Устанавливаем режим строгой проверки типов
// для Windows-программ
#define STRICT
#include<windows.h>
#include<windowsx.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define HNST HINSTANCE
WNDCLASS WCS; // Структура класса окна
int X,Y, // Координаты для вывода текста функцией TextOut
HatchStyle=0; // Стандартный тип заливки
char AName[]=" РГЗ №2 ";
// Обработчик сообщения WM_DESTROY : сообщает Windows о завершении работы
void OnDestroy (HWND)
{ PostQuitMessage(0L); }
void OnMouseMove(HWND hW, int x, int y, UINT Flags)
{ if(Flags&MK_LBUTTON) ::X=x,::Y=y,InvalidateRect(hW,0L,TRUE); }
// Обработчик сообщения WM_CREATE :
// загружает ресурс растрового изображения
BOOL OnCreat (HWND hW,CREATESTRUCT FAR*)
{ return TRUE; }
// Обработчик сообщения WM_PAINT :
// Перерисовывает необходимые фрагменты окна программы
void OnPaint (HWND hW)
{ PAINTSTRUCT PS;RECT RC;
RC.left=X-200,RC.top=Y-30,RC.right=X+200,RC.bottom=Y+50; HDC DC=BeginPaint(hW,&PS);
HBRUSH OLDB;
UINT B[]={HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL};
char*X[]={"HS_BDIAGONAL","HS_CROSS","HS_DIAGCROSS","HS_FDIAGONAL","HS_HORIZONTAL","HS_VERTICAL"};
OLDB=(HBRUSH)SelectObject(DC,CreateHatchBrush(B[::HatchStyle],RGB(0,0,0)));
COLORREF R=SetBkColor(DC,RGB(255,200,100)),T=SetTextColor(DC,RGB(0,0,255));
Ellipse(DC,::X-150,::Y-80,::X+150,::Y+80),
DrawText(DC,"Заливка ",-1,&RC,DT_CENTER),
RC.bottom+=20,RC.top+=20,DrawText(DC,X[::HatchStyle],-1,&RC,DT_CENTER),
SetBkColor(DC,R),SetTextColor(DC,T),SelectObject(DC,OLDB);
EndPaint(hW,&PS);
}
// Обработчики сообщений мыши и клавиатуры :
// формируют строку символов и передают её на контекст устройства
void OnLeftUp (HWND hW,int x,int y,UINT fl)
{ ::X=x,::Y=y,InvalidateRect(hW,0L,TRUE); }
// Обработчик сообщения WM_LBUTTONDBLCLICK
// ( двойной щелчок правой кнопкой мыши )
void OnLDBLCLICK(HWND hW, BOOL fDoubleClick, int x, int y, UINT /*keyFlags*/)
{ if(fDoubleClick)::X=x,::Y=y,++HatchStyle%=6,InvalidateRect(hW,0L,TRUE); }
// Оконная процедура WProc : обрабатывает все сообщения ,
// посылаемые окну hW
// Устанавливаем WProc в качестве оконной процедуры главного окна программы
LRESULT CALLBACK WProc(HWND hW,UINT msg,WPARAM wParam,LPARAM lParam)
{ switch(msg)
// Для обработки сообщений можно использовать
// макросы HANDLE_MSG из <windowsx.h>
// связывающие конкретные сообщения с соответствующими функциями-обработчиками
{
HANDLE_MSG(hW,WM_CREATE,OnCreat);
HANDLE_MSG(hW,WM_DESTROY,OnDestroy);
HANDLE_MSG(hW,WM_LBUTTONDBLCLK,OnLDBLCLICK);
HANDLE_MSG(hW,WM_LBUTTONUP,OnLeftUp);
HANDLE_MSG(hW,WM_PAINT,OnPaint);
HANDLE_MSG(hW,WM_MOUSEMOVE,OnMouseMove);
default:return DefWindowProc(hW,msg,wParam,lParam);
// Для необрабатываемых сообщений
// следует вызывать API-функцию DefWindowProc,
// обеспечивающую стандартную обработку соответствующих сообщений
}
}
// Функция RG - заполняет поля структуры класса окна (WCS)
// и регистрирует класс окна ,
// после чего можно создавать окна данного класса окна
BOOL RG(HNST h)
{ WCS.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
WCS.lpfnWndProc=WProc; WCS.hInstance=h;
WCS.cbClsExtra=WCS.cbWndExtra=0;
WCS.hIcon=LoadIcon(0L,IDI_APPLICATION);
WCS.hCursor=LoadCursor(0L,IDC_CROSS);
WCS.hbrBackground=GetStockBrush(LTGRAY_BRUSH);
WCS.lpszMenuName=0L;WCS.lpszClassName=AName;
return RegisterClass(&WCS);
}
#define def CW_USEDEFAULT
#define WStyle WS_OVERLAPPEDWINDOW
// Функция Creat - создаёт окно и показывает его
HWND Creat(HNST h,int Cmd)
{ auto HWND hW=CreateWindow(AName,AName,WStyle,def,def,def,def,0L,0L,h,0L);
if (hW) ShowWindow(hW,Cmd),UpdateWindow(hW);
return hW;
}
// Функция WinMain - главная функция Windows-приложения
// вызываемая при запуске программы
int PASCAL WinMain(HNST h,HNST Prev,LPSTR ,int Cmd)
{ MSG M; register MSG*P=&M;
if(!Prev&&!RG(h)||!Creat(h,Cmd)) return FALSE;
while(GetMessage(P,0,0,0))TranslateMessage(P),DispatchMessage(P);
return P->wParam;
}
Результат работы программы: