Покажу и надеюсь что объясню как нарисовать чекБокс....
Внешне итог выглядит так:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Все будет на примере исходника Dimedrol1536(2) (ТЫК)...
Приступим:
Сначало будем работать с фаилом cBase.cpp
Добавляем:
Код:
BOOL cMenu::IsInBox(int x,int y,int w,int h)
{
POINT MousePosition;
GetCursorPos(&MousePosition);
ScreenToClient(GetForegroundWindow(),&MousePosition);
return(MousePosition.x >= x && MousePosition.x <= x + w && MousePosition.y >= y && MousePosition.y <= y + h);
}
Данная функция(или метод, в терминалогии я не сильно силен) будет отслеживать положение курсора в заданных нами координатах...
Добавляем сам метод прорисовки и взаимодействия элементов:
Код:
void cMenu::Draw_Button_Test(int x ,int y , int w , int h ,int &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,DEEPSKYBLUE,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
DrawBorder(x-1,y-1,w,h,GREEN,pDevice);
if(Var == 1 && Var !=0)
{
Var = 0;
}
else
if(Var == 0)
{
Var = 1;
}
}
}
if(Var == 0)//Если выключено, то рисуем
{
DrawBox(x,y,w,h,TxtOFF,pDevice);
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);
}
if(Var == 1)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,GREEN,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
Переходим в фаил cMain.h и прописываем прототипы функций внутри класса меню:
Код:
BOOL IsInBox(int x,int y,int w,int h);
void Draw_Button_Test(int x ,int y , int w , int h ,int &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice);
Все это используем таким образом:
Draw_Button_Test(x ,y , w , h ,opt.структура.функция , "Название функции" , pDevice);
x,y - положение по осям X и Y
w, h - ширина и высота квадратика соответственно
opt.структура.функция - ссылка на функцию
"Название функции" - собственно название функции
void cMenu:raw_Button_Test(int x ,int y , int w , int h ,int &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,DEEPSKYBLUE,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
DrawBorder(x-1,y-1,w,h,GREEN,pDevice);
if(Var == 1 && Var !=0)
{
Var = 0;
}
else
if(Var == 0)
{
Var = 1;
}
}
}
if(Var == 1)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,GREEN,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHAD OW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
цвет фона в чек боксе поменяй и пропиши функцию для него
Скорее всего он имел ввиду вот это:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сам долго сообразить не мог как организовать нормальное действие для такого элемента... Но когда реализацию написал Дмитрий, даже удивился насколько все выходит просто...
________________
-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!
а не легче было бы для такой функции использовать переменную типа bool ?
Вот как выглядила бы функция:
Код:
void cMenu::Draw_Button_Test(int x ,int y , int w , int h ,bool &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,DEEPSKYBLUE,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
DrawBorder(x-1,y-1,w,h,GREEN,pDevice);
if(Var == TRUE) Var = FALSE;
else
if(Var == FALSE) Var = TRUE;
}
}
if(Var == FALSE)//Если выключено, то рисуем
{
DrawBox(x,y,w,h,TxtOFF,pDevice);
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);
}
if(Var == TRUE)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,GREEN,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
Добавлено через 15 минут
а вот функция для самостоятельного выбора цвета отрисовки (как у крайслер'а):
Код:
void cMenu::Draw_Button_Test(int x ,int y , int w , int h ,bool &Var ,char *Button_Text ,D3DCOLOR colors,D3DCOLOR colorOff,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,colors,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
if(Var == TRUE) Var = FALSE;
else
if(Var == FALSE) Var = TRUE;
}
}
if(Var == FALSE)//Если выключено, то рисуем
{
DrawBox(x,y,w,h,colorsOff,pDevice);
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);
}
if(Var == TRUE)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,colors,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHADOW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
//где colors - цвет отрисовки при наведении/или активированной функции(переменно больше нуля) - отрисовки внутреннего квадратика
//где colors - цвет отрисовки в выключенном состоянии функции (переменно равно нулю) - отрисовки внутреннего квадрата
можно было бы сделать намного "лучше" там типо "зеркального" цвета при активированной/деактевированной функции, но увы я с телефона пишу
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось Skilful; 31.07.2012 в 23:16.
Причина: Добавлено сообщение
void cMenu:raw_Button_Test(int x ,int y , int w , int h ,int &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,DEEPSKYBLUE,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
DrawBorder(x-1,y-1,w,h,GREEN,pDevice);
if(Var == 1 && Var !=0)
{
Var = 0;
}
else
if(Var == 0)
{
Var = 1;
}
}
}
if(Var == 1)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,GREEN,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHAD OW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
я так понимаю, это тоже в cBase.cpp прописывать?
а то у меня ошибки _http://3.firepic.org/3/images/2012-07/29/n1zdbpqcq1sp.jpg
void cMenu::Draw_Button_Test(int x ,int y , int w , int h ,bool &Var ,char *Button_Text ,D3DCOLOR colors,D3DCOLOR colorOff,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x +w+2;
int y__ = ((h) - (h/2));
int x__ = (x + w/2);
if(IsInBox(x,y-5,w,h))//при поподании курсора в заданное место выполняем следующее
{
DrawBorder(x-2,y-2,w+3,h+3,colors,pDevice);//прорисовываем квадрат при наведении
if(GetAsyncKeyState(VK_LBUTTON)&1)//при нажатии ЛКМ в заданных координатах выполняем следующее(в зависимости от состояния)
{
if(Var == TRUE) Var = FALSE;
else
if(Var == FALSE) Var = TRUE;
}
}
if(Var == FALSE)//Если выключено, то рисуем
{
DrawBox(x,y,w,h,colorsOff,pDevice);
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHAD OW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);
}
if(Var == TRUE)//Если включено, то рисуем
{
DrawBox(x+1,y+1,w-3,h-3,colors,pDevice);//рисуем квадратик меньшим размером чем основной
font->DrawText(x_,y_,C_TITL,Button_Text,DT_LEFT|DT_SHAD OW);
DrawBorder(x-1,y-1,w,h,RED,pDevice);//окрашиваем бордюр в красный
}
}
________________
-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!
Последний раз редактировалось крайслер; 30.07.2012 в 00:37.
Первые два числа это координаты положения, Х - положение по оси Х(влево\вправа) , Y - положение по оси Y(вверх\вниз)
хочешь этим сказать, что надо расширить бокс и по координатам поместить ЧекБокс?
хотя нет, размер сам делается по X (WIDTH=160; // MENU WIDTH), а Y не как не правиш
да и сам ЧекБокс не паподает на Бокс к меню, меню бокса его перекрывает ...
так как можно поставить ЧекБокс на бокс к меню, а то я уже все перепробывал(
Draw_Button_Test(168 ,35 , 10 , 10 ,opt.glavnay.Button5, "TEST" , pDevice);
Последний раз редактировалось Lubot; 30.07.2012 в 15:57.
хочешь этим сказать, что надо расширить бокс и по координатам поместить ЧекБокс?
зачем?
Цитата:
Сообщение от Lubot
а Y не как не правиш
как не изменишь? Просто изменяешь значение и все.
Цитата:
Сообщение от Lubot
сам ЧекБокс не паподает на Бокс к меню, меню бокса его перекрывает ...
А это легко решается. Прорисовка деталей происходит сверху вниз. Значит нужно прорисовку фона вставлять в первую очередь, а потом уже этот "чекбокс". В некоторых случаях, нужно делать по другому, это может быть связано с методом прорисовки, то нужно делать в противоположном варианте.
Допустим у тебя вот прорисовка фона:
DrawBox(x,y,w,h,D3DCOLOR,pDevice);
вот после него и вставляй "чекбокс".
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).