Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 07.12.2013, 08:00   #1
 Старший сержант
Аватар для крайслер
 
крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(
Регистрация: 04.02.2011
Сообщений: 198
Популярность: 12244
Сказал(а) спасибо: 453
Поблагодарили 435 раз(а) в 242 сообщениях
Отправить сообщение для крайслер с помощью Skype™
 
По умолчанию D3D9_Menu от А до Я (DirectX, C++,Dll)

Иногда нечем занятся, поэтому решил написать серию туториалов на тему "написания своего "скелета" для ......". Постараюсь обьяснить все от А до Я(хотя это зависит от настроения и желания).
Сразу огаворюсь: Описание будет направлено на юзера которы хоть немного знаком с матчастью(т.е. тот которому не придется подробно объяснять чем переменная int отличается от переменной bool, и какие значения они могут принимать.)

После каждого "тутора" будет прикреплен исходный код проделанного(полнаценный проект). Писаться будет все на одном проекте и с каждым последующем уроком выкладываться будет дополненный предыдущий проект. Таким образом в конце всей ленейки будет предаставлен полноценный "скелет" .

Пока не решил каким образом будет оформлены уроки. варианта два: - Все будет в одной теме, каждый урок в новом сообщении, либо второй вариант - каждый новый урок в новой теме.





Текст скорее всего будет с орф. ошибками и иправлять их скорее всего не буду(хотя постараюсь писать грамотно), поэтому по этому поводу прошу не поднимать шум и принять это как стиль написания автора)


Les #1 - SDK
ИСПОЛЬЗУЕТСЯ "Microsoft Visual Studio 2010"

Первым делом сделаем свою жизнь проще, а именно подключим DirectX Software Development Kit(SDK). Но делать это мы будем не указывая пути в настройках проекта, а используя для этого стандартные пути включаемых фаилов и библиотек Microsoft Visual Studio(MVS).

Узнаем где у нас установлена MVS. Если во время установки все осталось по дефолту, то искать нужно в папке "С:\Program Files\Microsoft Visual Studio 10.0" (это для 32-х битных систем, какой дефолтный путь на 64-х я не знаю).
Открыв папку с MVS видим среди всего прочего папку "VC", именно сюда нужно поместить фаилы SDK.

Скачиваем относительно своей системы: [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
Распаковываем архив в папку "VC", соглашаясь на слияние папок и замену фаилов.

С установкой SDK мы закончили. Теперь нет необходимости вручную указывать пути в настройках, тем самым экономим время в будующем и избигаем некоторых проблем)\


Les #2 - Создание проекта

Открываем MVS. Создаем новый проект:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Нажимаем "Далее". Настраиваем проект:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Нажимаем по проекту ПКМ -> Свойства и выставляем все согласно скрину:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Добавляем к проекту фаил .cpp: ПКМ по проекту - Добавить - Создать новый фаил - Выбираем "Фаил .cpp" - называем его любым именем(я назову Base.cpp).Это будет основной фаил проекта и "на него" будем лепить все остальное.


Теперь заполним минимум, а именно напишем точку иницализации\входа нашей dll.
Подключаем к проекту:

Код:
#include <Windows.h>
Справка
Цитата:
windows.h является Windows-конкретный файл заголовков для языка C программирования, который содержит заявления для всех функций в Windows API...


Сама точка доступа имеет вид:

Код:
BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason==DLL_PROCESS_ATTACH)
{

}
return TRUE;
}
Пока из всех значений dwReason нам потребуется только "DLL_PROCESS_ATTACH"
Справка
Цитата:
[Ссылки могут видеть только зарегистрированные пользователи. ]

[Ссылки могут видеть только зарегистрированные пользователи. ]



Les #3 - d3d9 hook & EndScene

Напишем функцию которая будет перехватывать оригинальный метод DirectX9 - EndScene(ES), выполнять необходимые нам действия и возвращала бы все "на круги своя"...
Цитата:
EndScene - метод который вызывается после окончания сцены.

Работать будем пока только с этим методом(впринципе его достаточно для наших действий)

Для описания хука нам потребуется несколько функций для работы с памятью. Завернем их все в класс cMemory.
Будем добавлять с помощью "Мастера классов"
Цитата:
ПКМ по проекту -> Добавить -> Класс

в открывшемся окне нажимаем "Далее" и заполняем согласно скрину:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Можно и вручную создать фаилы, но зачем нужны лишние движения?

После этого у вас появятся два фаила: cMemory.cpp и cMemory.h
Работаем с cMemory.h:
подключим "Windows.h"

Код:
#include <Windows.h>
добавим три прототипа для функций в класс:

Код:
class cMemory
{
public:
cMemory(void);
~cMemory(void);
BOOL  bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
void *Create_Hook(BYTE *src, const BYTE *dst, const int len);
};
FindPattern - функция для поиска адресса по уникальному набору байт.
Create_Hook - функция для установки хука.

работаем с cMemory.cpp
Описываем указанные функции:

Код:
BOOL   cMemory::bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
  if(*szMask=='x' && *pData!=*bMask)
   return false;
return (*szMask) == NULL;
}
DWORD  cMemory::FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
  if( bCompare((BYTE*)(dwAddress+i),bMask,szMask))
   return (DWORD)(dwAddress+i);
return 0;
}
void * cMemory::Create_Hook(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp;
DWORD dwback;
DWORD jumpto, newjump;
VirtualProtect(src,len,PAGE_READWRITE,&dwback);
if(src[0] == 0xE9)
{
  jmp = (BYTE*)malloc(10);
  jumpto = (*(DWORD*)(src+1))+((DWORD)src)+5;
  newjump = (jumpto-(DWORD)(jmp+5));
  jmp[0] = 0xE9;
  *(DWORD*)(jmp+1) = newjump;
  jmp += 5;
  jmp[0] = 0xE9;
  *(DWORD*)(jmp+1) = (DWORD)(src-jmp);
}
else
{
  jmp = (BYTE*)malloc(5+len);
  memcpy(jmp,src,len);
  jmp += len;
  jmp[0] = 0xE9;
  *(DWORD*)(jmp+1) = (DWORD)(src+len-jmp)-5;
}
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
for(int i = 5; i < len; i++)
  src[i] = 0x90;
VirtualProtect(src,len,dwback,&dwback);
return (jmp-len);
}
Подключаем cMemory.h к Base.cpp:

Код:
#include "cMemory.h"
И задаем указатель на класс
Код:
cMemory *MemHack;

Теперь будем описывать перехват ES(работаем с Base.cpp).
Подключаем необходимые фаилы и либы:

Код:
#include <d3d9.h>
#include <d3dx9.h>
#define D3DparamX  , UINT paramx
#define D3DparamvalX , paramx
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
Далее указываем:
Код:
typedef HRESULT (WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene = NULL;
Более менее сносное объяснение этому:
Цитата:
oEndScene - указатель на функцию с соглашением вызова WINAPI, принимающую один параметр типа LPDIRECT3DDEVICE9 и возвращающую HRESULT

Описываем метод ES:

Код:
typedef HRESULT (WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene = NULL;
HRESULT APIENTRY myEndScene( LPDIRECT3DDEVICE9 pDevice )
{
return pEndScene( pDevice );
}
именно здесь мы будем "рисовать")


И непосредственно сам поток с хуком:

Код:
int D3d9_Hook(void)
{
DWORD*vtbl=0;
DWORD hD3D9=(DWORD)LoadLibraryA("d3d9.dll");
DWORD table=MemHack->FindPattern(hD3D9,0x128000,(PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86","xx????xx????xx");
memcpy(&vtbl,(void*)(table+2),4);
pEndScene=(oEndScene)MemHack->Create_Hook((PBYTE)vtbl[42],(PBYTE)myEndScene,5);
return 0;
}

Код самый примитивный) подробно разбирать его не вижу смысла.

Теперь на иницализацию нашей DLL запустим поток. Что бы не писать постоянно всю функцию CreateThread(вдруг еще гне нужно будет) опишем для нее небольшой макрос:

Код:
#define new_My_Thread(Function) CreateThread(0,0,(LPTHREAD_START_ROUTINE)Function,0,0,0);

и на дописываем к точке доступа:

Код:
BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason==DLL_PROCESS_ATTACH)
{
  new_My_Thread(D3d9_Hook);
}
return TRUE;
}

[Ссылки могут видеть только зарегистрированные пользователи. ]




ЗЫ:Будет дополнятся в зависимости от свободного времени и настроения

Добавлено через 2 минуты
Писать в одном сообщении все - сложно, поэтому туторы быдут разбиты на сообщения. На усмотрение администрации все останется в таком виде, либо соеденятся со стартовым сообщением.


Les #4 - Text
Для рисования(текста, боксов, бордеров и прочего) опишим еще один класс - cRender.как это сделать было описано выше.

Подключаем cRender.h к Base.cpp:

Код:
#include "cRender.h"
задаем указатель на класс
Код:
cRender Render;

Также для всего нам понадобится определения цветов. Создадим фаил Colors.h.
Для определения будем использовать структуру enum:

Код:
enum Colors : D3DCOLOR
{
};
У меня это выглядит так:

Код:
enum Colors : D3DCOLOR
{
ORANGE       =   D3DCOLOR_ARGB(255,255,125,0),
YELLOW        =   D3DCOLOR_ARGB(255,255,255,0),
GREY          =   D3DCOLOR_ARGB(255,128,128,128),
PURPLE        =   D3DCOLOR_ARGB(255,125,0,255),
WHITE    =   D3DCOLOR_ARGB(255, 255, 255, 255),
RED     =   D3DCOLOR_ARGB(255, 255, 000, 000),
GREEN    =   D3DCOLOR_ARGB(255, 000, 255, 000),
BLUE    =   D3DCOLOR_ARGB(255, 000, 000, 255),
BLACK    =   D3DCOLOR_ARGB(255, 000, 000, 000),
AliceBlue = 0xFFF0F8FF,
RED_1    =   D3DCOLOR_ARGB(40, 255, 000, 000),
line_Color = 0xff00ffff,
AntiqueWhite = 0xFFFAEBD7,
Aqua = 0xFF00FFFF,
Aquamarine = 0xFF7FFFD4,
Azure = 0xFFF0FFFF,
Beige = 0xFFF5F5DC,
Bisque = 0xFFFFE4C4,
BlanchedAlmond = 0xFFFFEBCD,
BlueViolet = 0xFF8A2BE2,
Brown = 0xFFA52A2A,
BurlyWood = 0xFFDEB887,
CadetBlue = 0xFF5F9EA0,
Chartreuse = 0xFF7FFF00,
Chocolate = 0xFFD2691E,
Coral = 0xFFFF7F50,
CornflowerBlue = 0xFF6495ED,
Cornsilk = 0xFFFFF8DC,
Crimson = 0xFFDC143C,
Cyan = 0xFF00FFFF,
DarkBlue = 0xFF00008B,
DarkCyan = 0xFF008B8B,
DarkGoldenrod = 0xFFB8860B,
DarkGray = 0xFFA9A9A9,
DarkGreen = 0xFF006400,
DarkKhaki = 0xFFBDB76B,
DarkMagenta = 0xFF8B008B,
DarkOliveGreen = 0xFF556B2F,
DarkOrange = 0xFFFF8C00,
DarkOrchid = 0xFF9932CC,
DarkRed = 0xFF8B0000,
DarkSalmon = 0xFFE9967A,
DarkSeaGreen = 0xFF8FBC8B,
DarkSlateBlue = 0xFF483D8B,
DarkSlateGray = 0xFF2F4F4F,
DarkTurquoise = 0xFF00CED1,
DarkViolet = 0xFF9400D3,
DeepPink = 0xFFFF1493,
DeepSkyBlue = 0xFF00BFFF,
DimGray = 0xFF696969,
DodgerBlue = 0xFF1E90FF,
Firebrick = 0xFFB22222,
FloralWhite = 0xFFFFFAF0,
ForestGreen = 0xFF228B22,
Fuchsia = 0xFFFF00FF,
Gainsboro = 0xFFDCDCDC,
GhostWhite = 0xFFF8F8FF,
Gold = 0xFFFFD700,
Goldenrod = 0xFFDAA520,
GreenYellow = 0xFFADFF2F,
Honeydew = 0xFFF0FFF0,
HotPink = 0xFFFF69B4,
IndianRed = 0xFFCD5C5C,
Indigo = 0xFF4B0082,
Ivory = 0xFFFFFFF0,
Khaki = 0xFFF0E68C,
Lavender = 0xFFE6E6FA,
LavenderBlush = 0xFFFFF0F5,
LawnGreen = 0xFF7CFC00,
LemonChiffon = 0xFFFFFACD,
LightBlue = 0xFFADD8E6,
LightCoral = 0xFFF08080,
LightCyan = 0xFFE0FFFF,
LightGoldenrodYellow = 0xFFFAFAD2,
LightGray = 0xFFD3D3D3,
LightGreen = 0xFF90EE90,
LightPink = 0xFFFFB6C1,
LightSalmon = 0xFFFFA07A,
LightSeaGreen = 0xFF20B2AA,
LightSkyBlue = 0xFF87CEFA,
LightSlateGray = 0xFF778899,
LightSteelBlue = 0xFFB0C4DE,
LightYellow = 0xFFFFFFE0,
Lime = 0xFF00FF00,
LimeGreen = 0xFF32CD32,
Linen = 0xFFFAF0E6,
Magenta = 0xFFFF00FF,
Maroon = 0xFF800000,
MediumAquamarine = 0xFF66CDAA,
MediumBlue = 0xFF0000CD,
MediumOrchid = 0xFFBA55D3,
MediumPurple = 0xFF9370DB,
MediumSeaGreen = 0xFF3CB371,
MediumSlateBlue = 0xFF7B68EE,
MediumSpringGreen = 0xFF00FA9A,
MediumTurquoise = 0xFF48D1CC,
MediumVioletRed = 0xFFC71585,
MidnightBlue = 0xFF191970,
MintCream = 0xFFF5FFFA,
MistyRose = 0xFFFFE4E1,
Moccasin = 0xFFFFE4B5,
NavajoWhite = 0xFFFFDEAD,
Navy = 0xFF000080,
OldLace = 0xFFFDF5E6,
Olive = 0xFF808000,
OliveDrab = 0xFF6B8E23,
Orange = 0xFFFFA500,
OrangeRed = 0xFFFF4500,
Orchid = 0xFFDA70D6,
PaleGoldenrod = 0xFFEEE8AA,
PaleGreen = 0xFF98FB98,
PaleTurquoise = 0xFFAFEEEE,
PaleVioletRed = 0xFFDB7093,
PapayaWhip = 0xFFFFEFD5,
PeachPuff = 0xFFFFDAB9,
Peru = 0xFFCD853F,
Pink = 0xFFFFC0CB,
Plum = 0xFFDDA0DD,
PowderBlue = 0xFFB0E0E6,
RosyBrown = 0xFFBC8F8F,
RoyalBlue = 0xFF4169E1,
SaddleBrown = 0xFF8B4513,
Salmon = 0xFFFA8072,
SandyBrown = 0xFFF4A460,
SeaGreen = 0xFF2E8B57,
SeaShell = 0xFFFFF5EE,
Sienna = 0xFFA0522D,
Silver = 0xFFC0C0C0,
SkyBlue = 0xFF87CEEB,
SlateBlue = 0xFF6A5ACD,
SlateGray = 0xFF708090,
Snow = 0xFFFFFAFA,
SpringGreen = 0xFF00FF7F,
SteelBlue = 0xFF4682B4,
Tan = 0xFFD2B48C,
Teal = 0xFF008080,
Thistle = 0xFFD8BFD8,
Tomato = 0xFFFF6347,
Transparent = 0x00FFFFFF,
Turquoise = 0xFF40E0D0,
Violet = 0xFFEE82EE,
Wheat = 0xFFF5DEB3,
WhiteSmoke = 0xFFF5F5F5,
YellowGreen = 0xFF9ACD32
};
в сRender.h дописываем:

Код:
#include <d3d9.h>
#include <d3dx9.h>
#include <stdio.h>
#include <stdlib.h>
#include "Colors.h"
Теперь непосредственно о самом тексте:
Внутри класса добавляем указатель на интерфейс
Код:
ID3DXFont* pFont;
и прототип нашей будущей функции отрисовки текста:

Код:
void  Draw_Text(int x,int y,DWORD color,LPSTR text,DWORD ST);
x,y - положение текста
color - цвет
text - непосредственно сам текст
ST - стиль и выравнивание.

Выше класса укажим константы для переменной ST:

Код:
#define C_Text (DT_CENTER|DT_NOCLIP)
#define L_Text (DT_LEFT|DT_NOCLIP)
#define R_Text (DT_RIGHT|DT_NOCLIP)
C_Text - выравнивание текста по центру
L_Text - выравнивание текста по левому краю
R_Text- выравнивание текста по правому краю


работаем с cRender.cpp и описываем функцию Draw_Tex:

Код:
void  cRender::Draw_Text(int x,int y,DWORD color,LPSTR text,DWORD ST)
{
RECT rect, rect2;
SetRect( &rect, x, y, x, y );
SetRect( &rect2, x - 0.1, y + 0.2, x - 0.1, y + 0.1 );
pFont->DrawTextA(NULL,text,-1,&rect2, ST, 0xff000000 );
pFont->DrawTextA(NULL,text,-1,&rect,  ST, color );
}
Теперь нужно иницализировать все написаное выше. Для этого в классе cRender заводим булевую переменную
Код:
bool Init;
И переходим к Base.cpp к методу myEndScene и пишем :

Код:
if( !Render.Init )
{
D3DXCreateFont(pDevice, 15, 0, FW_BLACK,0, FALSE, DEFAULT_CHARSET, OUT_TT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &Render.pFont);
Render.Init = true;
}
теперь отрисуем текст(все в том же блоке myEndScene)

Код:
if( !Render.pFont)
  Render.pFont->OnLostDevice();
else
{
 
  Render.Draw_Text(40,40, GREEN, "Hello World. (Les#4)",L_Text);

  Render.pFont->OnLostDevice();
  Render.pFont->OnResetDevice();
}
При потере контекста устройства будет произведена сброс и перегрузка шрифта, что в свою очередь позволит избежать черных экранов и потери текста при сворачивании\разворачивании проложения.

[Ссылки могут видеть только зарегистрированные пользователи. ]

[Ссылки могут видеть только зарегистрированные пользователи. ]

Добавлено через 2 часа 54 минуты
Les #5 - Box & Border

Работаем с cRender.h.

добавляем прототипы для двух функций:
Код:
void Draw_Box( int x, int y, int w, int h, D3DCOLOR Color, LPDIRECT3DDEVICE9 m_pD3Ddev);
void Draw_Border(int x, int y, int w, int h,int s, D3DCOLOR Color, LPDIRECT3DDEVICE9 m_pD3Ddev);
x,y - положение в пространстве
w,h - ширина и высота соответственно
s - ширина линии обводки
Color - цвет
m_pD3Ddev - указатель на устройство

переходим к сRender.cpp

Код:
void cRender::Draw_Box(int x, int y, int w, int h, D3DCOLOR Color,IDirect3DDevice9* mDevice)
{
D3DRECT rec;
rec.x1 = x;
rec.x2 = x + w;
rec.y1 = y;
rec.y2 = y + h;
mDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
mDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
mDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, D3DPT_TRIANGLESTRIP);
mDevice->Clear( 1, &rec, D3DCLEAR_TARGET, Color, 1, 1 );
}
Это самый простой вариант(прозрачность не поддерживается). Более сложный, с поддержкой прозрачности - по запросу пользователей.

Отрисуем:

Код:
if( !Render.pFont)
Render.pFont->OnLostDevice();
else
{
Render.Draw_Box(10,10,180,250,GREY,pDevice);
Render.Draw_Text(40,40, GREEN, "Hello World. (Les#4)",L_Text);

Render.pFont->OnLostDevice();
Render.pFont->onresetDevice();
}
[Ссылки могут видеть только зарегистрированные пользователи. ]


Теперь опишем функцию Draw_Border(обводка)

Код:
void cRender::Draw_Border(int x, int y, int w, int h,int s, D3DCOLOR Color,IDirect3DDevice9* mDevice)
{
Draw_Box(x, y, s, h,Color,mDevice);
Draw_Box(x,y+h, w, s,Color,mDevice);
Draw_Box(x, y, w, s,Color,mDevice);
Draw_Box(x+w,y, s,h+s,Color,mDevice);
}
Отрисуем:


Код:
if( !Render.pFont)
Render.pFont->OnLostDevice();
else
{
Render.Draw_Box(10,10,180,250,GREY,pDevice);
Render.Draw_Border(10,10,180,250,2,RED,pDevice);
Render.Draw_Text(40,40, GREEN, "Hello World. (Les#4)",L_Text);

Render.pFont->OnLostDevice();
Render.pFont->onresetDevice();
}
[Ссылки могут видеть только зарегистрированные пользователи. ]

[Ссылки могут видеть только зарегистрированные пользователи. ]




Les #6 - Мышка и Кнопки

Для "обнаружения" курсора в нужной нам позиции опишем функцию:

Код:
BOOL  cRender::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);
}
в класс cRender пишем прототип:

Код:
BOOL  IsInBox(int x,int y,int w,int h);

Для работы с кнопками можно использовать метод GetAsyncKeyState(Байт_код), но с ней иногда бывают проблеммы(залипание, фантомное срабатывание иногда просто не действует), поэтому опишем свою функцию.
Прототип:

Код:
BOOL  State_Key(int Key,DWORD dwTimeOut);
Key - байт код клавиши
dwTimeOut - время до возможности повторного действия в Мсек(не совсем точное определение)

Вне класса cRender определим структуру:

Код:
static struct _Keys
{
bool        bPressed;
DWORD       dwStartTime;
}kPressingKeys[256];
Сама функция выглядит так:

Код:
BOOL  cRender::State_Key(int Key,DWORD dwTimeOut)
{
if(HIWORD(GetKeyState(Key)))
{
  if(!kPressingKeys[Key].bPressed || (kPressingKeys[Key].dwStartTime && (kPressingKeys[Key].dwStartTime + dwTimeOut) <= GetTickCount()))
  {
   kPressingKeys[Key].bPressed = TRUE;
   if( dwTimeOut > NULL )
    kPressingKeys[Key].dwStartTime = GetTickCount();
   return TRUE;
  }
}
else
  kPressingKeys[Key].bPressed = FALSE;
return FALSE;
}

[Ссылки могут видеть только зарегистрированные пользователи. ]



Les #7 - Блок меню + решение избавления от координат
Конфигурирование меню предлагаю вынести в отдельный зоголовочный фаил. Так будет проще ориентироваться в будущем.

Создаем заголовочный фаил Menu.h. К нему подключаем cRender

Код:
#include "cRender.h"
В фаиле Base.cpp уазываем созданный нами фаил
Код:
#include "Menu.h"
в класс cRender добавляем прототип:
Код:
void  SHOW_MENU(LPDIRECT3DDEVICE9  pDevice);
В фаиле Menu.h описываем функцию:

Код:
void  cRender::SHOW_MENU(LPDIRECT3DDEVICE9  pDevice)
{
}
Именно в этом блоке мы и будем рисовать внешний вид.

Строить меню можно различными способами. Например самый распространенный - указывать вручную координаты для каждого элемента, но это в каком-то смысле очень трудно и накладно(хотя если развито пространственное мышление и дальномер то.....)В любом случаи я покажу как можно избавится от необходимости координировать каждый из элементов. Для этого будем использовать struct.

В класс cRender добавляем структуру с двумя переменными типи int и пишим для нее указатель.

Код:
struct stMenu
{
  int x,
       y;
};
stMenu pos_Menu;
pos_Menu - указатель на нашу структуру.

Теперь зделаем "иницализацию" координатного положения и возможность открывать\скрывать меню по нажатию указанной клавиши:
В cRender добавляем прототип для будущей функции:

Код:
void  Init_PosMenu(int x,int y,DWORD KEY,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev);
x,y - начальное положение меню
KEY - клавиша открыть\закрыть меню
pos_Menu - указатель на нашу структуру
m_pD3Ddev - указатель на наше устройство

Так же добавим еще одну булевую переменную:
Код:
bool Show;

Теперь в cRender.cpp описываем функцию:

Код:
void  cRender::Init_PosMenu(int x,int y,DWORD KEY,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev)
{
}
Что бы не засорять блок myEndScene вырезаем из нее

Код:
if( !Render.pFont)
  Render.pFont->OnLostDevice();
else
{
  Render.Draw_Box(10,10,180,250,GREY,pDevice);
Render.Draw_Border(10,10,180,250,2,RED,pDevice);
Render.Draw_Text(40,40, GREEN, "Hello World. (Les#4)",L_Text);
  Render.pFont->OnLostDevice();
  Render.pFont->onresetDevice();
}
и вставляем в
Код:
void  cRender::Init_PosMenu(int x,int y,DWORD KEY,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev)
в таком виде:

Код:
if( !pFont)
  pFont->OnLostDevice();
else
{
  pFont->OnLostDevice();
  pFont->onresetDevice();
}
Допишем возможность указания клавиши и условие появления\скрытия меню:

Код:
if(State_Key(KEY,3000))Show=!Show;
  if(Show)SHOW_MENU(m_pD3Ddev);
3000 - раз в три секунды возможно срабатывание условия Show=!Show

Так же тут укажем инициализацию нашей структуры:
Код:
(*pos_Menu).x = x;
(*pos_Menu).y = y;
После всего у нас Init_PosMenu(....) имеет следущий вид:

Код:
void  cRender::Init_PosMenu(int x,int y,DWORD KEY,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev)
{
(*pos_Menu).x = x;
(*pos_Menu).y = y;
if( !pFont)
  pFont->OnLostDevice();
else
{
  if(State_Key(KEY,3000))Show=!Show;
  if(Show)SHOW_MENU(m_pD3Ddev);
  pFont->OnLostDevice();
  pFont->onresetDevice();
}
}
Теперь в myEndScene пропишем:

Код:
Render.Init_PosMenu(20,20,VK_END,&Render.pos_Menu,pDevice);
20,20 - начальное положение
VK_END - клавиша открытия\скрытия меню(в данном случаи это клавиши END)
&Render.pos_Menu - указатель на структуру
pDevice - устройство


По дефолту у нас меню в скрытом положении. Исправить это можно иницализировав переменную Show , например в конструкторе класса:

Код:
cRender::cRender(void)
{
Show = true;
}
"Show = true;" - меню открыто сразу
"Show = false;" - меню закрыто

[Ссылки могут видеть только зарегистрированные пользователи. ]

Добавлено через 3 часа 17 минут
Les #8 - Рисуем кнопку для основного меню

Основное меню: Что это должно из себя представлять? Кнопки, строки или любые выдуманные элементы, при активации которых на экран выводилось бы соответствующее субменю. При этом, при нажатии на одну из кнопок, предедушее открытое субменю скрывалось.
Вариантов решения несколько: для каждого субменю завести переменную и при клике на кнопку сначало все переменные обнулять, а затем активировать переменную соответствующую нажатой кнопке. Второй вариант - использовать для этой цели массивы.
Именно массивы я буду использовать в туториале.


Рисовать я решил кнопку примерно следущего вида:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Основная идея следующая: Рисуем прямоугольник с обводкой и текстом. При наведении на кнопку корсором цвет текста и обводки меняется, а при активации меняется цвет текста.



прототип кнопки:
Код:
void  Draw_Menu_But(stMenu *pos_Menu,char* text,IDirect3DDevice9* pDevice);
то есть имеем указатель на структуру, указатель на текст и указатель на устройство.

Для задумки нам потребуется в фаиле cRender.cpp завести массив и две переменных типа int. Указывать их нужно в корне cRender.cpp.

Код:
int Button_Mass[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    Button_Number = 0,
    Button_Max = 0;
Так как эти переменные находятся в фаиле типа .cpp , то с помощью дерективы "extern" мы их укажим в фаиле Menu.h:
Код:
extern int Button_Mass[20],
           Button_Number;
Так же в этом фаиле, в блоке "SHOW_MENU(.....){}" мы будем обнулять переменную "Button_Number":
Код:
void  cRender::SHOW_MENU(LPDIRECT3DDEVICE9  pDevice)
{



    Button_Number=0;
}

Вернемся к cRender.cpp и заполним функцию Draw_Menu_But:
Код:
void  cRender::Draw_Menu_But(stMenu *pos_Menu,char* text,IDirect3DDevice9* pDevice)
{
    if(IsInBox(x,y,w,h))
    {    
    //если наведен курсор
        if (State_Key(VK_LBUTTON,30) )
            if (Button_Mass[Button_Number]!= 1)
                Button_Mass[Button_Number]= 1;
    }

    if (Button_Mass[Button_Number])
    {        
        //Если активна
        for ( int i = 0; i < 20; i++ )
            if ( i != Button_Number )
                Button_Mass[i] = 0;
    }
    

    Button_Number = Button_Number + 1;

    if (Button_Max < Button_Number )
        Button_Max = Button_Number;

}
Так выглядит основная рабочая часть кода.
Теперь займемся рисованием:Нам нужно завести две переменных типа D3DCOLOR для смены цвета при взаимодействии. Так же нарисовать прямоугольник, обводку и текст.

Код:
void  cRender::Draw_Menu_But(stMenu *pos_Menu,char* text,IDirect3DDevice9* pDevice)
{
    D3DCOLOR Bord_text = line_Color;
    D3DCOLOR text_Activ = line_Color;


    if(IsInBox(x,y,w,h))
    {    
                     //если наведен курсор
        Bord_text = text_Activ =Lime;
        if (State_Key(VK_LBUTTON,30) )
            if (Button_Mass[Button_Number]!= 1)
                Button_Mass[Button_Number]= 1;
    }

    Draw_GradientBox(x, y, w, h, DarkRed, BLACK,vertical , pDevice );
    Draw_Border(x, y, w, h,1,Bord_text,pDevice);
    if (Button_Mass[Button_Number])
    {        
                       //Если активна
        text_Activ = YellowGreen;
        for ( int i = 0; i < 20; i++ )
            if ( i != Button_Number )
                Button_Mass[i] = 0;
    }
    Draw_Text(x+(w/2),y+3,text_Activ, text,C_Text);

    Button_Number = Button_Number + 1;

    if (Button_Max < Button_Number )
        Button_Max = Button_Number;

}

Теперь разберемся с положением в пространстве и размерами:
заводим четыре переменных типа int:
Код:
int x  ,
       y ,
       h,
       w ;
И задаем им значения:
Код:
int x = (*pos_Menu).x,
        y = (*pos_Menu).y,
        h = 22,
        w = 101;
x = текущее положение\значение "х"(структура)
y = текущее положение\значение "y"(структура)
w = длинна кнопки
h = ширина кнопки

Указываем это в самом начале тела функции:
Код:
void  cRender::Draw_Menu_But(stMenu *pos_Menu,char* text,IDirect3DDevice9* pDevice)
{
    int x = (*pos_Menu).x,
        y = (*pos_Menu).y,
        h = 22,
        w = 101;
......
......
......
......
}
При таком раскладе мы уже сможем нарисовать одну кнопку, но последующие будут накладываться друг на друга, так как у нас еще не задано "смещение". Для этого в конце теля функции добавим:
Код:
(*pos_Menu).y = y+24;
Итог:
Код:
void  cRender::Draw_Menu_But(stMenu *pos_Menu,char* text,IDirect3DDevice9* pDevice)
{
    int x = (*pos_Menu).x,
        y = (*pos_Menu).y,
        h = 22,
        w = 101;
    D3DCOLOR Bord_text = line_Color;
    D3DCOLOR text_Activ = line_Color;


    if(IsInBox(x,y,w,h))
    {    
        Bord_text = text_Activ =Lime;
        if (State_Key(VK_LBUTTON,30) )
            if (Button_Mass[Button_Number]!= 1)
                Button_Mass[Button_Number]= 1;
    }

    Draw_GradientBox(x, y, w, h, DarkRed, BLACK,vertical , pDevice );
    Draw_Border(x, y, w, h,1,Bord_text,pDevice);
    if (Button_Mass[Button_Number])
    {        
        text_Activ = YellowGreen;
        for ( int i = 0; i < 20; i++ )
            if ( i != Button_Number )
                Button_Mass[i] = 0;
    }
    Draw_Text(x+(w/2),y+3,text_Activ, text,C_Text);

    Button_Number = Button_Number + 1;

    if (Button_Max < Button_Number )
        Button_Max = Button_Number;

    (*pos_Menu).y = y+24;
}
Смысл: При вызове считываем координаты со структуры -> рисуем задуманое -> записываем в структуру новые координаты.

Используем это в меню так:
Код:
void  cRender::SHOW_MENU(LPDIRECT3DDEVICE9  pDevice)
{

    Draw_Menu_But(&pos_Menu,"New Button 1", pDevice);
    if(Button_Mass[0])
    {
    }

    Draw_Menu_But(&pos_Menu,"New Button 2", pDevice);
    if(Button_Mass[1])
    {
    }

    Draw_Menu_But(&pos_Menu,"New Button 3", pDevice);
    if(Button_Mass[2])
    {
    }

    Draw_Menu_But(&pos_Menu,"New Button 4", pDevice);
    if(Button_Mass[3])
    {
    }




    Button_Number=0;
}
В результате мы получаем:
[Ссылки могут видеть только зарегистрированные пользователи. ]




[Ссылки могут видеть только зарегистрированные пользователи. ]







Les #9 - Рисуем checkBox

Цель: Нарисовать элемент который имел бы два положения - вкл\выкл.

Этот и последующие элементы будут всегда пренадлежать суб-меню. Поэтому что бы не замарачиваться с начальной координатой положения - допишем еще одну переменную в структуру stMenu:
Код:
struct stMenu
    {
        int x,
            y, _y;
    };
так же "иницализируем ее в Init_PosMenu():
Код:
void  cRender::Init_PosMenu(int x,int y,DWORD KEY,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev)
{
    (*pos_Menu).x = x;
    (*pos_Menu).y = y;
    (*pos_Menu)._y = y;

    if( !pFont)
        pFont->OnLostDevice();
    else
    {

        if(State_Key(KEY,3000))Show=!Show;
        if(Show)SHOW_MENU(m_pD3Ddev);

        pFont->OnLostDevice();
        pFont->onresetDevice();
    }
}

перейдем непосредственно к рисованию контрола.
Внешний вид его будет такой:
[Ссылки могут видеть только зарегистрированные пользователи. ]


Определяем прототип в классе cRender:
Код:
void  Draw_CheckBox(stMenu *pos_Menu,bool &Var,char *Text,IDirect3DDevice9 *pDevice);
И описываем функцию:
Код:
void cRender::Draw_CheckBox(stMenu *pos_Menu,bool &Var,char *Text,IDirect3DDevice9 *pDevice)
{
    int x = (*pos_Menu).x+115,
        y = (*pos_Menu)._y,
        w = 16,
        h = 16;


    Draw_Box( x,  y, w, h, 0xff305C5F,pDevice);
    Draw_Border( x,  y, w, h,1, line_Color,pDevice);


    if(IsInBox(x,y ,w,h))
    { 
        if (State_Key(VK_LBUTTON,300) ) 
                       Var=!Var;
    }
    if(Var)
        Draw_GradientBox(x+3, y+3, 11, 11, DarkRed, BLACK,vertical , pDevice );
    

    Draw_Text(x+24,y+2,line_Color, Text,L_Text);

    (*pos_Menu)._y = y+20;
}
Система думаю будет ясна из предыдущего тутора.
Единственное о чем можно сказать, так это о "x = (*pos_Menu).x+115".
(*pos_Menu).x - это начальное положение меню
+115 - это цифра определяет смещение от начала.Складывается она из длинны Draw_Menu_But() + небольшое дополнение, что бы был зазор между основным меню и суб-меню.


Запись у меня в меню получилась следущая:
Код:
Draw_Menu_But(&pos_Menu,"New Button 1", pDevice);
    if(Button_Mass[0])
    {

        Draw_CheckBox(&pos_Menu,b_Fun_1,"New CheckBox 1",pDevice);
        Draw_CheckBox(&pos_Menu,b_Fun_2,"New CheckBox 2",pDevice);
        Draw_CheckBox(&pos_Menu,b_Fun_3,"New CheckBox 3",pDevice);
        Draw_CheckBox(&pos_Menu,b_Fun_4,"New CheckBox 4",pDevice);

    }
[Ссылки могут видеть только зарегистрированные пользователи. ]


[Ссылки могут видеть только зарегистрированные пользователи. ]






Les #10 - Рисуем ColorBox

Цель: Нарисовать контрол который бы наглядно переключал цвета(цвет меню, самс, ESP и тд и тп).

Рисовать будем такой вот контрол:
[Ссылки могут видеть только зарегистрированные пользователи. ]


Приступим:

Определяем прототип:
Код:
void  Draw_ColorBox(stMenu *pos_Menu, char *Text, int &Var,DWORD *Sel_color,int SizeArr, IDirect3DDevice9 * pDevice);
"DWORD *Sel_color" - указатель на массив где будут хранится цвета
"int SizeArr" - количество элементов в массиве
Цитата:
Тут следует учесть, что исчисление массива начинается с 0, поэтому в этот аргумент следует передавать число на один меньше чем элементов в массиве

Остальные аргументы думаю не стоит представлять.


Описываем функцию:
Код:
void  cRender::Draw_ColorBox(stMenu *pos_Menu, char *Text, int &Var,DWORD *Sel_color,int SizeArr, IDirect3DDevice9 * pDevice)
{
    int x = (*pos_Menu).x+110,
        y = (*pos_Menu)._y,
        w = 25,
        h = 16;

    if(IsInBox(x,y ,w,h))
    { 
        if (State_Key(VK_LBUTTON,300) ) 
            if(Var>=0 && Var<SizeArr)
                       Var++;


        if (State_Key(VK_RBUTTON,300) )
            if(Var!=0)
                       Var--;
    }

    Draw_Box( x,  y, w, h, Sel_color[Var],pDevice);
    Draw_Border( x,  y, w, h,1,line_Color ,pDevice);
           Draw_Text(x+34,y+2,line_Color, Text,L_Text);

    (*pos_Menu)._y = y+20;
}
При нажатии ЛКМ по прямоугольнику цвет будет переключаться на одну позицию вперед, при ПКМ - на одну назад.

Использование(на примере бокса):
Заводим массив типа DWORD и переменную типа int в области видимости:
Код:
int i_Fun__1;
DWORD test_Color_1[] = {0xff305C5F,RED,BLUE,BLACK,WHITE,GREEN,Violet,ORANGE,YELLOW,line_Color,DarkGoldenrod };
В меню:
Код:
Draw_ColorBox(&pos_Menu, "Draw_ColorBox 1", i_Fun__1,test_Color_1,10,  pDevice);
Теперь на примере бокса показываем работу:
Код:
Draw_Box(320,18,50,20,test_Color_1[i_Fun__1],pDevice);
Результат:
[Ссылки могут видеть только зарегистрированные пользователи. ]


[Ссылки могут видеть только зарегистрированные пользователи. ]

Добавлено через 5 часов 17 минут
Les #11 - Рисуем ScrolBox

Цель: Нарисовать контрол который бы накручивал бы переменную до заданного предела.

Рисовать будем такой вот контрол:
[Ссылки могут видеть только зарегистрированные пользователи. ]


Прототип:
Код:
void  Draw_ScrolBox(stMenu *pos_Menu, char *Text, int &Var,int Maximal,IDirect3DDevice9 *pDevice);
Функция:

Код:
void  cRender::Draw_ScrolBox(stMenu *pos_Menu, char *Text, int &Var,int Maximal,IDirect3DDevice9 *pDevice)
{
int x = (*pos_Menu).x+110,
  y = (*pos_Menu)._y,
  w = 16,
  h = 16;

D3DCOLOR inActiv = line_Color;
char c_Value[MAX_PATH];
if(IsInBox(x+7,  y+2, 20, 16))
{
  inActiv = GREEN;
  if(State_Key(VK_LBUTTON,100))
   if(Var>=0 && Var<Maximal)Var++;
  if(State_Key(VK_RBUTTON,100))
   if(Var!=0)Var--;
}

sprintf(c_Value, "[ %d ]", Var);
int lenText = GetTextLen(c_Value);
Draw_Text(x+7,y+3,inActiv,c_Value,L_Text);
Draw_Text(x+lenText+10 ,y+3,line_Color,Text,L_Text);
(*pos_Menu)._y = y+20;
}
Можно заметить новую функцию GetTextLen:
Код:
int   cRender::GetTextLen(LPCTSTR szString)
{
RECT rect = {0,0,0,0};
pFont->DrawText(NULL, szString, -1, &rect, DT_CALCRECT, 0);
return rect.right;
}
Эта функция возвращает длинну указанного текста.


[Ссылки могут видеть только зарегистрированные пользователи. ]



[Ссылки могут видеть только зарегистрированные пользователи. ]
________________

-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!

Последний раз редактировалось крайслер; 07.12.2013 в 13:18. Причина: Добавлено сообщение
  Ответить с цитированием
10 пользователя(ей) сказали cпасибо:
Dimedrol1536 (07.12.2013), JKHKJgj (20.04.2015), KiRo_Lajt (18.02.2014), Nik-sin (07.12.2013), NoName%(2) (26.10.2014), VeTaL_UA (09.12.2013), warl0ck (09.12.2013), Yukikaze (09.12.2013), †RuBiLNiK† (02.01.2014), Я-artemfcsh (14.12.2013)
Старый 08.12.2013, 08:37   #2
 Старший сержант
Аватар для крайслер
 
крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(
Регистрация: 04.02.2011
Сообщений: 198
Популярность: 12244
Сказал(а) спасибо: 453
Поблагодарили 435 раз(а) в 242 сообщениях
Отправить сообщение для крайслер с помощью Skype™
 
По умолчанию Re: D3D9_Menu от А до Я (DirectX, C++,Dll)

Les #12 - Структурное хранение переменных


Так или иначе нам придется использовать переменные различного типа. Удобнее всего будет завести структуру и обращатся к переменным с помощью указателя на структуру.

Для этого создадим заголовочный фаил "Structure.h" с таким содержинием:
Код:
#pragma once


struct cFun
{


};
extern cFun Fun;
Цитата:
#pragma once — нестандартная, но широко распространенная препроцессорная директива, разработанная для контроля за тем, чтобы конкретный исходный файл при компиляции подключался строго один раз


В фаиле cRender.h подключим его
Код:
#include "Structure.h"
так же поступим и в фаиле Base.cpp и опишем указатель на структуру:
Код:
#include "Structure.h"
cFun Fun;
теперь указав внутри структуры необходимую нам переменную:
Код:
struct cFun
{
    bool _Peremennay;
};
мы можем получить доступ к ней практически из любого места проекта используя указатель "Fun":
Код:
Fun._Peremennay
Добавлено через 20 минут
Завершение.

В конечном проекте я завел две переменных в классе cRender:
Код:
w_menu   //ширина основного меню
	w_sub_menu
w_menu - ширина основного меню
w_sub_menu - ширина суб-меню
Так же эти переменные влияют на: размеры кнопок, ширину фона, растояние между текстом и контролом.

Добавил задний фон и заголовок. Заголовок вынес в Init_PosMenu():
Код:
Init_PosMenu(int x,int y,DWORD KEY,char* Titl,stMenu* pos_Menu,IDirect3DDevice9* m_pD3Ddev)
Код:
Render.Init_PosMenu(20,20,VK_END,"D3D9 Menu от А до Я",&Render.pos_Menu,pDevice);
Немного поправил элементы управления, добавив выравнивание по краям:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Так же в структуре stMenu завел две переменных:
Код:
 int height_fon,
			height_sub_fon;
Эти переменные отвечают за ширину фона меню. То есть, при дабавлении луюого из элементов управления задний фон будет подгонятся под размеры.


Так же все цвета вынес в константы, что бы можно было легко изменить цвет лубого из элементов меню.



Сконфигурировал меню по такому виду:
[Ссылки могут видеть только зарегистрированные пользователи. ]
В итоге получил:
[Ссылки могут видеть только зарегистрированные пользователи. ]

[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
________________

-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!

Последний раз редактировалось крайслер; 08.12.2013 в 09:01. Причина: Добавлено сообщение
  Ответить с цитированием
14 пользователя(ей) сказали cпасибо:
avi2011class (31.12.2013), danil7496 (24.12.2013), Dimedrol1536 (09.12.2013), igoor996 (03.04.2014), igor_bastov (13.01.2014), JKHKJgj (20.04.2015), KiRo_Lajt (18.02.2014), NoName%(2) (26.10.2014), Sinyss (09.12.2013), VeTaL_UA (09.12.2013), warl0ck (09.12.2013), Yukikaze (09.12.2013), †RuBiLNiK† (02.01.2014), Я-artemfcsh (14.12.2013)
Старый 09.12.2013, 00:48   #3
Бандеровец
 Лейтенант-командор
Аватар для VeTaL_UA
 
VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(
Регистрация: 12.08.2010
Сообщений: 727
Популярность: 30569
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
Отправить сообщение для VeTaL_UA с помощью ICQ Отправить сообщение для VeTaL_UA с помощью Skype™
 
По умолчанию Re: D3D9_Menu от А до Я (DirectX, C++,Dll)

Вот побольше бы таких статей. Одна из очень немногих статей за последнее время, которая действительно что-то стоит. Продолжайте в том же духе!
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.

Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.


  Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
крайслер (09.12.2013), †RuBiLNiK† (05.01.2014), Я-artemfcsh (14.12.2013)
Старый 09.12.2013, 02:44   #4
 Разведчик
Аватар для NerdyCodingKid
 
NerdyCodingKid на правильном путиNerdyCodingKid на правильном пути
Регистрация: 18.11.2013
Сообщений: 3
Популярность: 197
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 9 сообщениях
 
По умолчанию Re: D3D9_Menu от А до Я (DirectX, C++,Dll)

Согласен с господином, что отписался выше, выглядит как недурной step-by-step для голого dx.
P.s. Где чёртова кнопка "спасибо"? Я не могу её найти.
  Ответить с цитированием
Старый 04.11.2014, 20:56   #5
 Разведчик
Аватар для Dvast3264
 
Dvast3264 на правильном путиDvast3264 на правильном пути
Регистрация: 27.05.2012
Сообщений: 8
Популярность: 143
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
Отправить сообщение для Dvast3264 с помощью ICQ Отправить сообщение для Dvast3264 с помощью Skype™
 
По умолчанию Re: D3D9_Menu от А до Я (DirectX, C++,Dll)

У меня D3D9 Test зависает когда я инжекчу эту dll, что делать?



Добавлено через 2 минуты
У меня D3D9 Test зависает когда я инжекчу эту dll, что делать?


Последний раз редактировалось Dvast3264; 04.11.2014 в 20:58. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 05.11.2014, 13:42   #6
 Фельдмаршал
Аватар для Dimedrol1536
 
Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(Dimedrol1536 сломал счётчик популярности :(
Регистрация: 22.02.2011
Сообщений: 949
Популярность: 34698
Сказал(а) спасибо: 939
Поблагодарили 2,534 раз(а) в 911 сообщениях
Отправить сообщение для Dimedrol1536 с помощью ICQ Отправить сообщение для Dimedrol1536 с помощью Skype™
 
По умолчанию Re: D3D9_Menu от А до Я (DirectX, C++,Dll)

Если у тебя Win 8, то работать не будет, надо хук директа другой.
ЕСли у тебя не Win 8, то работать должна.
  Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Обсуждение] D3D9_Menu Devil™ Общение разработчиков 13 03.06.2013 11:10
DirectX d1max Общение и обсуждение, архив Point Blank 9 03.01.2012 23:16
DirectX 10 GREH45 Скрипты и прочий софт для Point Blank 17 18.07.2011 20:16

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 12:30.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net