Статья
Версия для печати
Обсудить на форуме (1)
Советы по Windows (часть 4)



Код:
//Демонстрация работы 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
while (GetMessage(&msg, NULL, 0, 0)) //Получаем первое сообщение из стэка сообщений в msg
{ //Обратите внимание! Из общего стэка сообщений 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; //Дополнительный класс окна
wcex.cbWndExtra = 0; //Адрес функции рисования нашего окна, т.к. NULL, то стандартная перерисовка окна
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);//хендл маленькой иконки(свернутое окно)

return RegisterClassEx(&wcex); //Регистрируем класс нашего окна - API
}

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); //Показать окно
   UpdateWindow(hWnd); //Послать сообщение функции WinMain() о перерисовке окна!

   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++)
{
SetPixel(MyDC,x,y,RGB(r,0,0)); //Рисуем точку - RGB(RED,GREEN,BLUE) цвет точки
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));
}
break;
case WM_DESTROY: //сообщение от windows о том, что надо завершить работу нашей программы
KillTimer(hWnd,15); //Убиваем наш таймер с номером 15
PostQuitMessage(0); //Сообщение нашей программе - завершить работу
break;
default: //Если пришло сообщение, которое мы не обработали, то дать возможность windows обработать ето сообщение
return DefWindowProc(hWnd, message, wParam, lParam);
   }

   return 0;
}

void MyCreate(HWND hWnd)
{
RECT MyClientRect; //Прямоугольник
MyDC = GetDC(hWnd); //Получаем DC нашего окна
GetClientRect(hWnd,&MyClientRect); //Узнаем размер клиентской области нашего окна
//в глобальных координатах (от левого верхнего угла рабочего стола)
my = MyClientRect.bottom-MyClientRect.top; //Вычисляем максимальные координаты
mx = MyClientRect.right-MyClientRect.left; //клиентской области по X,Y
SetTimer(hWnd, //Куда посылать сообщения
15, //Уникальный номер именно этого таймера (В вашей программе их может быть много)
50, //Задержка в микросекундах
NULL   //Здесь можно повешать адрес своей функции - таймер будет вызывать именно эту функцию
); //Устанавливаем таймер
//Сообщения от этого таймера будут приходить только на hWnd (т.е., нашему окну)
}
Версия для печати
Обсудить на форуме (1)