//Демонстрация работы SetPixel(),GetDC(),RGB(),
//GetClientRect(),SetTimer(),KillTimer()
//Окно без системного меню и системных кнопок
//Закрывать программу Alt+F4
//Писал и коментировал - p0et
//mail - p0et@bk.ru
#include <windows.h> //Windows API функции
HINSTANCE hInst; //Будем хранить хэндл нашего приложения!
HWND MyhWnd; //Handle Window
HDC MyDC; //a handle of a display device context (DC)
int x,y, //координаты точки
mx,my; //Максимальный размер клиентской области окна
int i,j; //Индексы массивов
int r=100,dr=5,g; //Переменные для работы с цветом
//Регистрируем класс окна!
ATOM MyRegisterClass(HINSTANCE hInstance);
//А сдесь само окно!
BOOL InitInstance(HINSTANCE, int);
//Вызывается при приходе сообщений нашему окну
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//Вызывается при создании окна
void MyCreate(HWND hWnd);
int APIENTRY WinMain(
HINSTANCE hInstance,//hInstanse нашего приложения в памяти
//hInstanse приложения стоящего выше нашего приложения
//по дереву связей приложений
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, //Командная строка :)
int nCmdShow) //Состояние нашего окна
//(Развернуто,Свернуто)
{
MSG msg; //Структура сообщений в Windows
//В ней мы зарегистрируем класс нашего окна
MyRegisterClass(hInstance);
if (!InitInstance (
hInstance, //Нашего приложения
nCmdShow //Состояние нашего окна -
//в котором нам надо его создать!
)
) //Создаем окно приложения
{
//если не создалось - выход из программы
return FALSE;
}
//Стандартный цикл обработки сообщений Windows
//Получаем первое сообщение из стэка сообщений в msg
while (GetMessage(&msg, NULL, 0, 0))
{
//Обратите внимание!
//Из общего стэка сообщений Windows получаем
TranslateMessage(&msg); //Транслируем сообщение дальше
DispatchMessage(&msg); //Сообщение для нашего окна
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//Класс нашего окна
WNDCLASSEX wcex;
//Заполняем его информацией о нашем окне
wcex.cbSize = sizeof(WNDCLASSEX); //Размер класса окна
//Стиль окна
wcex.style = CS_HREDRAW | CS_VREDRAW;
//Адрес функции обработки сообщений нашего окна
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0; //Дополнительный класс окна
//Адрес функции рисования нашего окна, т.к. NULL,
//то стандартная перерисовка окна
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance; //нашей программы
// загрузка хендла иконки (стандартная или из ресурсов)
wcex.hIcon = LoadIcon(NULL, IDI_ASTERISK);
// загрузка хендла курсора (стандартная или из ресурсов)
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
// Цвет заднего фона окна
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
// Цвет заднего фона окна// Название меню нашего окна
wcex.lpszMenuName = NULL;
// Имя класса нашего окна
wcex.lpszClassName = "WINCLASS";
//хендл маленькой иконки(свернутое окно)
wcex.hIconSm = LoadIcon(NULL, IDI_ASTERISK);
//Регистрируем класс нашего окна - API
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; //окна
hInst = hInstance;
//Создаем окно! - API
hWnd = CreateWindow(
"WINCLASS", //Класс окна
"Kill", //Информация в верней строке
//окна-Title Window
WS_VISIBLE, //Стиль окна
100, //Координата Х верхневого левого угла окна
//(Глобальные координаты)
100, //Координата Y верхневого левого угла окна
//(Глобальные координаты)
300, //Координата X правого нижнего угла от
//левого верхнего (локальные)
200, //Координата Y правого нижнего угла от
//левого верхнего (локальные)
NULL, //hWnd Родительского окна
NULL, //Handle Menu
hInstance, // нашей программы - привязываем
//окно к программе
NULL //
);
if (!hWnd) //Если окно не создано
{
MessageBox(NULL,"CreateWindow()","Error!",NULL);
//MessageBox с сообщением о невозможности создания окна
return FALSE;
}
MyhWnd = hWnd; //Сохраняем hWnd нашего окна
ShowWindow(hWnd, nCmdShow); //Показать окно
//Послать сообщение функции WinMain() о перерисовке окна!
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(
HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// данное сообщение приходит при создании нашей формы
case WM_CREATE:
MyCreate(hWnd);
break;
//Сообщение приходит при нажатии Лев.кнопки мыши
//на нашем окне
case WM_LBUTTONDOWN:
for(x=0;x<mx;x++)
for(y=0;y<my;y++)
SetPixel(MyDC,x,y,RGB(0,0,0));
break;
//Сообщение приходит от таймера
case WM_TIMER:
{
if(((r+=dr)>245)||(r<10)) dr=-dr;
g=255-r;
for(i=0;i<mx;i+=10)
{
for(j=0;j<my;j+=10)
{
for(x=i;x<i+5;x++)
{
for(y=j;y<j+5;y++)
{
//Рисуем точку - RGB(RED,GREEN,BLUE) цвет точки
SetPixel(MyDC,x,y,RGB(r,0,0));
SetPixel(MyDC,x+5,y+5,RGB(0,0,r));
SetPixel(MyDC,x+5,y,RGB(0,g,0));
SetPixel(MyDC,x,y+5,RGB(g,0,g));
}
}
}
}
}//case WM_TIMER:
break;
//сообщение от windows о том, что надо завершить
//работу нашей программы
case WM_DESTROY:
//Убиваем наш таймер с номером 15
KillTimer(hWnd,15);
//Сообщение нашей программе - завершить работу
PostQuitMessage(0);
break;
//Если пришло сообщение, которое мы не обработали,
//то дать возможность windows обработать ето сообщение
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void MyCreate(HWND hWnd)
{
RECT MyClientRect; //Прямоугольник
MyDC = GetDC(hWnd); //Получаем DC нашего окна
//Узнаем размер клиентской области нашего окна
//в глобальных координатах (от левого верхнего
//угла рабочего стола)
GetClientRect(hWnd,&MyClientRect);
//Вычисляем максимальные координаты
//клиентской области по X,Y
my = MyClientRect.bottom-MyClientRect.top;
mx = MyClientRect.right-MyClientRect.left;
//Устанавливаем таймер
//Сообщения от этого таймера будут приходить только
//на hWnd (т.е., нашему окну)
SetTimer(
hWnd,//Куда посылать сообщения
15, //Уникальный номер именно этого таймера
//(В вашей программе их может быть много)
50, //Задержка в микросекундах
NULL//Здесь можно повешать адрес своей
//функции - таймер будет вызывать
//именно эту функцию
);
}