Советы по Windows (часть 3) - ОС и разработчик - Shelek
Код:
//Демонстрация работы Button,Edit,SendMessage
//Писал и коментировал - p0et
//mail - [email protected]

#include <windows.h> //Windows API функции
#include <string> //Класс для работы со строками
//Подключение пространства имен функций <string>
using namespace std;

HINSTANCE hInst; //Будем хранить хэндл нашего приложения!
HWND MyhWnd; //Handle Window
HWND MyBtn1,MyBtn2,MyEdit; //Handle Button1,Button2,Edit
BOOL flag=false; //Флаг состояния кнопки

//Регистрируем класс окна!
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 нашего приложения в памяти
HINSTANCE hPrevInstance,
//hInstanse приложения стоящего выше нашего приложения
//по дереву связей приложений
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); //Сообщение для нашего окна
//А это сообщение мы отправляем сами нашему окну -
// Сообщение от таймера(Эмулируем таймер)
SendMessage(MyhWnd,WM_TIMER,0,0);
}

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_OVERLAPPEDWINDOW, //Стиль окна
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)
{

char buf1[10]="Animation"; //Сообщения на кнопку
char buf2[17]="Нажми на кнопку!"; //и едит

switch (message)
{
case WM_CREATE: // данное сообщение приходит при создании нашей формы
MyCreate(hWnd);
break;
case WM_COMMAND: //Приходит при сообщении от дочерних окон
//Кстате кнопки и т.д. - дочерние окна
switch(LOWORD(wParam)) //проверяем, какое сообщение пришло
{
case BN_CLICKED:
//проверяем, от какого окна пришло сообщение
if(MyBtn1 == (HWND)lParam) PostQuitMessage(0);
//Сообщение нашей программе - завершить работу
if(MyBtn2 == (HWND)lParam)
{
if(!flag)
{
//Посылаем сообщение нашему едиту - установить строку!
SendMessage(MyEdit,WM_SETTEXT,20,(long)buf1);
//Посылаем сообщение нашей кнопке - установить строку!
SendMessage(MyBtn2,WM_SETTEXT,20,(long)buf2);
flag=true;
}
else
{
//Посылаем сообщение нашему едиту - установить строку!
SendMessage(MyEdit,WM_SETTEXT,20,(long)buf2);
//Посылаем сообщение нашей кнопке - установить строку!
SendMessage(MyBtn2,WM_SETTEXT,20,(long)buf1);
flag=false;
}
}
break;
}
break;
case WM_DESTROY: //сообщение от windows о том,
// что надо завершить работу нашей программы
PostQuitMessage(0); //Сообщение нашей программе - завершить работу
break;
default: //Если пришло сообщение, которое мы не обработали, то дать возможность
// windows обработать это сообщение
return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}

void MyCreate(HWND hWnd)
{
//Создание дочернего окна типа BUTTON на API
MyBtn1 = CreateWindow(
"BUTTON", //Класс
"Exit", //текст на кнопке
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,//дочернее|видимое|тип кнопки
210,150,80,20, //размеры
hWnd, //HWND нашей формы. На которой будет кнопка
NULL,
hInst, //hInstanse нашей программы
NULL);
//Создание дочернего окна типа BUTTON на API
MyBtn2 = CreateWindow(
"BUTTON",//Класс
"Animation",//текст на кнопке
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,//дочернее|видимое|тип кнопки
10,150,140,20,//размеры
hWnd,//HWND нашей формы. На которой будет кнопка
NULL,
hInst,
NULL);
//Создание дочернего окна типа EDIT на API
MyEdit = CreateWindow(
"EDIT",//Класс
"Нажми на кнопку!",//текст в EDIT
WS_CHILD|WS_VISIBLE|WS_BORDER,//дочернее|видимое|в рамке
10,120,180,20,//размеры
hWnd,//HWND нашей формы. На которой будет кнопка
NULL,
hInst,
NULL);
}
Information
  • Posted on 01.02.2010 00:39
  • Просмотры: 2453