|
|
|
Статья
//Демонстрация работы 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 (т.е., нашему окну) }
|
|
|