3PPC.net
Старый 08.05.2008, 11:10 #1
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
Миф о сложности WinAPI или как написать программу своими руками

По устоявшейся традиции все считают что С++ язык сложный и запутанный.В принципе это так,но никто никогда не говорил что не обязательно знать весь С++ для написания программ.В принципе достаточно и С но С++ даёт нам несколько упрощающих методов,да и с точки зрения скорости работы он обгоняет потомка.
Здесь я постараюсь рассказать как же на самом деле просто написать программу на С++ для КПК.

Что нам надо:
Microsoft Visual Studio 2008 , желательно ещё и WM5 SDK и WM6 SDK,всё это можно скачать с оффсайта мелкомягкого,а с триалом студии разобраться можно порыскав в соседней теме
Качаем и ставим,в принципе 2005я студия тоже подойдёт,но 2008я лучьше.

И так,по шагам для тех кто не знаком с студией вообще.
1е-Создадим новый проект
выбираем File->New->Project
вводим имя проекта и выбираем папку где он будет лежать (там будет созданна подпапка с именем рабочей области(Solution) а в ней подпапка с именем проекта)
Нажмите на изображение для увеличения
Название: learn_1.PNG
Просмотров: 451
Размер:	25.2 Кб
ID:	13499
проект-как на рисунке-Win32 Smart Device Project
жмём ОК , затем Next
Нажмите на изображение для увеличения
Название: learn_2.PNG
Просмотров: 311
Размер:	23.8 Кб
ID:	13500
в этом окне предлагают выбрать платформы,у меня WM5 SDK не стоит,поэтому я перемещаю в левое окошко 2003 и WM6
под Smartphone они имеют ввиду устройства не имеющие тач экрана,типа MPX200 ,ну их в пень
жмём Next
выбираем оконное приложение и ПУСТОЙ проект
Нажмите на изображение для увеличения
Название: learn_3.PNG
Просмотров: 238
Размер:	23.8 Кб
ID:	13501
жмём Finish
ждём создания всех файлов и папко и имеем наш проект
в Solution Explorer жмём правой кнопкой по Learn - нашему проекту и выбираем Add->New Item
создаём новый файл с кодом С++ назовём его main
Нажмите на изображение для увеличения
Название: learn_4.PNG
Просмотров: 203
Размер:	24.5 Кб
ID:	13507
готово,файл добавлен,можно писать программу
Нажмите на изображение для увеличения
Название: learn_5.PNG
Просмотров: 245
Размер:	44.7 Кб
ID:	13508
для тех кто пропустил или у кого не выходит,прикладываю папку с всем проектом,пока ещё пустым
Learn_1.zip
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 08.05.2008, 11:58 #2
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
2е-Напишем простенький каркас
Но сначала маленькое ведение:
Каждая программа при запуске получает ряд параметров необходимых для её работы:
параметры командной строки
желательный режим отображения
и главное-дескриптор процесса

все эти параметры приходят в процедуру
Код:
int APIENTRY WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPWSTR cmdline,int cmdshow);
Вы конечно можете сказать-позвольте,а почему не объяснено что такое за параметр HINSTANCE hprevinst ,объясняю,этот параметр введён для поддержки совместимости с программами для ББ и смысла не имеет/
объявления очень большого количества функций WinAPI находятся в файле <windows.h>,который необходимо подключить.
но запуск программы не подразумевает под собой создание окна,окно надо делать вручную
для этого есть функция
Код:
HWND CreateWindow(LPCTSTR ClassName, LPCTSTR WindowName,DWORD Style,int x,int y,int Width,int Height,HWND hWndParent,HMENU Menu,HINSTANCE hInstance,LPVOID lpParam
);
ClassName - имя класса окна
WindowName - имя окна
Style - стиль
x,y,w,h - соответсвенно координаты и размеры
hWndParent - окно родитель
Menu - меню окна (всегда надо передавать NULL т.к. меню в КПК создаётся по другому)
hInstance - дескриптор приложения
lpParam - доп параметр,будет передан окну при создании

класс нашего окна не определён,поэтому надо определить новый класс функцией RegisterClass

для уменьшения количества букв я больше не буду приводить описания процедур т.к. это всё есть на MSDN или же мжожно нагуглить русские переводы MSDNа (оригинальный перевод не полон и слишком убог,не рекомендую)
более того,сужествует куча книг где будет написанно что каждый из параметров даёт,но не будет написанно зачем

ещё важное замечание для тех кто уже писал программы на ББ,КПК работает в Unicode,а это значит что все функции работают с wchar_t и строка занимает по 2 байта
для того чтобы записать строку юникод в коде можно воспользоваться 2мя методами:
L"строка"
или же
TEXT("строка") причём TEXT - макрос объявленный в windows.h и преобразующий строку к интересующему нас виду (wchar_t при сборке юникод и char при сборке анси,что может добавить переносимости программе,поэтому я использую его)

итак,наша первая программа
Код:
#include <windows.h>										//подключаем файл для получения функций WinAPI

const TCHAR	WINDOWNAME[]	= TEXT("Learn Applcation");		//объявляем константой имя окна,в принципе можно было бы обойтись и #define но обычно удобнее делать так
const TCHAR	WINDOWCLASS[]	= TEXT("Learn App Class");		//обявляем так же имя класса

HINSTANCE	hin		= 0;									//здесь будем хранить дескриптор приложения
HWND		hwnd	= 0;									//а здесь-дескриптор окна

LRESULT APIENTRY WndProc(HWND,UINT,WPARAM,LPARAM);			//заранее объявим оконную функцию

ATOM RegClass()												//регистрируем класс
{
	WNDCLASS wc;											//многие функции принимают вместо кучи параметров структуру с этими параметрами,например RegisterClass,в этой структуре содержатся все её параметры
	wc.style=0;												//дополнительные стили окна,у нас их нет
	wc.cbClsExtra=0;										//дополнительная память для класса не требуется
	wc.cbWndExtra=0;										//дополнительная память для окна не требуется
	wc.hInstance=hin;										//указываем что класс нужен неашему приложению
	wc.hIcon=0;												//в КПК иконки у окна нет,добавленно для совместимости с старыми версиями WinAPI реакции на значение у системы не будет
	wc.hCursor=0;											//курсора тоже нет,см выше
	wc.hbrBackground=HBRUSH(COLOR_WINDOW);					//фон окна,пусть будет стандартный заданный раскраской системы
	wc.lpszMenuName=0;										//меню нет,хотя в КПК есть меню,через этот параметр их лучьше не делать
	wc.lpfnWndProc=WndProc;									//окнная процедура-она обрабатывает все сообщения приходящие окну и по сути ответственна за обработку всех действий пользователя
	wc.lpszClassName=WINDOWCLASS;							//задаём имя класса
	return RegisterClass(&wc);								//собственно регистрация класса
}

void msgLoop()												//цикл обработки сообщений
{
	MSG msg;												//здесь будет храниться очередное сообщение
	while(GetMessage(&msg,NULL,0,0))						//получаем сообщение
	{
		TranslateMessage(&msg);								//посылаем его окну
		DispatchMessage(&msg);								//и удаляем
	}
}

int APIENTRY WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPWSTR cmdline,int cmdshow)	//точка входа в програму
{
	hin=hinst;												//запоминаем десприптор приложения
	if(!RegClass())											//регистрируем класс окна
	{
		MessageBox(0,TEXT("Error registering window class for process"),TEXT("Error"),MB_OK);	//если не вышло-выписываем сообщение об ошибке
		return 1;											//и выходим с ошибкой
	}
	hwnd=CreateWindow (WINDOWCLASS,WINDOWNAME, WS_VISIBLE,	//создаём окно
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,	//координаты по умолчанию-от панели пуск до низа экрана ширина равна ширине экрана
		(HWND)NULL, NULL, hin, NULL);						//наше окно не принадлежит другим,у него нет меню,оно привязанно к нашему дескриптору приложения и параметров мы не передаём
	if(hwnd==NULL)											//если окно не создалось
	{
		MessageBox(0,TEXT("Error creating window for process"),TEXT("Error"),MB_OK);	//пишем ошибку
		return 1;											//и выходим с ошибкой
	}
	ShowWindow(hwnd,SW_SHOW);								//показываем окно
	UpdateWindow(hwnd);										//обновляем его
	msgLoop();												//запускаем цикл сообщений
	return 0;												//выходим из программы
}

LRESULT APIENTRY WndProc(HWND hwin,UINT msg,WPARAM wparam,LPARAM lparam)	//оконная процедура
{
	switch(msg)												//выбираем интересующие нас сообщения
	{
	case WM_DESTROY:										//сообщение уничтожения окна
		PostQuitMessage(0);									//посылаем системе уведомление что программа завершает работу
		break;
	default:
		return DefWindowProc(hwin,msg,wparam,lparam);		//если сообщение не обработанно его должен обработать стандартный обработчик системы
	}
	return 0;
}
в итоге вышло следующее:
Learn_2.zip
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 08.05.2008, 13:25 #3
SupaSta
Гость
 
Сообщений: n/a
SupaSta
Гость
 
Сообщений: n/a
Устройство: нет кпк
воо! мужчина!
  Ответить с цитированием Цитировать выделенное
Старый 10.05.2008, 19:43 #4
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
Теория о WinAPI:
Несмотря на сложившееся заблуждение что в винде есть:
окошки
кнопки
менюшки
фигнюшки
это не так
WinAPI оперирует окнами в самом широком их смысле-как поверхностью вопринимающей события и способной на себе рисовать
по этому разница между той же кнопкой и рабочим столом только одна-они по разному реагируют на приходящие сообщения
но всё таки в майкрософте люди понимали что такая фривольная концепция не очень удобна в плане построения программ и сделали стандартные компоненты на манер некоторого шаблона
за правило было принято что каждый элемент управления откликается на посыку ему определённых сообщений
сообщения ЛЮБЫМ окнам можно послать функцией SendMessage,при этом окно принявшее сообщение может вернуть некоторое количество информации как результат,а так же может модифицировать структуру на которую был передан указатель
выходит сложно,но на пальцах работает это очень просто:
(это общий случай охватывающий все возможные ситуации,на практике всё ещё легче)
-создаём структуру,записываем в неё какие-то значения
-вызываем SendMessage передавая указатель на структуру через lparam или wparam
-запоминаем результат SendMessage ,вкупе с нашей структурой это и будет ответ

на практике всё ещё проще
специально для таких лентяев как мы майкрософт написала кучу макросов управления стандартными элементами,такими как:
кнопка
выпадающее меню
редактируемое поле
бегунок
список
MDI клиент
текстовый редактор RichEdit (поддерживает форматирование текста)
статичный текст
все эти макросы сваленны в аккуратные кучки в файле <windowsx.h>
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 10.05.2008, 23:58 #5
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
специально для демонстрации этих компонентов я написал маленький кодик,изменяющий оконную процедуру,вот он:
Код:
static HWND button=0;
	static HWND combobox=0;
	static HWND edit=0;
	static HWND listbox=0;
	static HWND text=0;
	static HWND scrollbar=0;
	static HWND vscrollbar=0;
	switch(msg)												//выбираем интересующие нас сообщения
	{
	case WM_CREATE:
		button		= CreateWindow(TEXT("BUTTON"),TEXT("кнопка"), WS_VISIBLE|WS_CHILD,						20,0,180,40,hwin,NULL,hin,NULL);
		combobox	= CreateWindow(TEXT("COMBOBOX"),TEXT("выпадающее меню"),WS_VISIBLE|WS_CHILD,			20,40,180,200,hwin,NULL,hin,NULL);
		edit		= CreateWindow(TEXT("EDIT"),TEXT(""), ES_MULTILINE|WS_VISIBLE|WS_CHILD|WS_BORDER,		20,80,180,40,hwin,NULL,hin,NULL);
		listbox		= CreateWindow(TEXT("LISTBOX"),TEXT(""),LBS_STANDARD|WS_VISIBLE|WS_CHILD|WS_BORDER|
																					LBS_DISABLENOSCROLL,	20,120,180,80,hwin,NULL,hin,NULL);
		text		= CreateWindow(TEXT("STATIC"),TEXT("текст"), WS_BORDER|WS_VISIBLE|WS_CHILD,				20,200,180,40,hwin,NULL,hin,NULL);
		scrollbar	= CreateWindow(TEXT("SCROLLBAR"),TEXT(""), SBS_HORZ|WS_VISIBLE|WS_CHILD,				20,240,180,20,hwin,NULL,hin,NULL);
		vscrollbar	= CreateWindow(TEXT("SCROLLBAR"),TEXT(""), SBS_VERT|WS_VISIBLE|WS_CHILD,				201,0,20,260,hwin,NULL,hin,NULL);
		//элементы созданны,теперь добавим немного смысла
		ComboBox_AddString(combobox,TEXT("Первый"));
		ComboBox_AddString(combobox,TEXT("Второй"));
		ComboBox_AddString(combobox,TEXT("Третий"));
		ComboBox_SetCurSel(combobox,0);
		Edit_SetText(edit,TEXT("Это пример текста для компонента EDIT"));
		ListBox_AddString(listbox,TEXT("Первый"));
		ListBox_AddString(listbox,TEXT("Второй"));
		ListBox_AddString(listbox,TEXT("Третий"));
		ListBox_SetCurSel(listbox,0);
		ScrollBar_SetRange(scrollbar,0,100,true);
		ScrollBar_SetRange(vscrollbar,0,100,true);
		break;
	case WM_ACTIVATE:
		if(LOWORD(wparam)==WA_INACTIVE)
			SendMessage(hwin,WM_DESTROY,0,0);
		break;
необходимые комментарии будут приведены завтра
Learn_3.zip
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 11.05.2008, 17:13 #6
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
и так,обещанные комментарии:
ну,во первых,координатная сетка
в принципе тут всё естественно,отсчитывается она от верхнего левого угла и нарастаев вправо вниз
необычно только то что combobox имеет высоту 200 хотя это не так
поясняю-типичный косяк в программе будет если поставить высоту 26
дело в том что этот параметр комбобокс воспринимает как максимальную высоту которую он занимает в развёрнутом виде,а в свёрнутом он имеет одну и ту же высоту
когда вы скомпилируете программу вы увидите нечто странное-полосы прокрутки таскаются,но как только отпускаешь её она возвращается в изначальное положение
дело в том что сам бегунок не меняет своей позиции,когда его тащат,он смещается визуально и посылает сообщение в программу что мол сместился в положение такое то,мы же должны отреагировать на сий прискорбный факт и сместить его
смотрим код для этого
Код:
	case WM_VSCROLL:		//сообщение о скролле окна
		{
			SCROLLINFO si;
			si.cbSize=sizeof(si);
			si.fMask=SIF_ALL;
			GetScrollInfo(vscrollbar,SB_CTL,&si);	//снимаем ТЕКУЩИЕ показания скролла
			int old_pos=si.nPos;					
			switch(LOWORD(wparam))
			{
			case SB_THUMBTRACK:						//был перетащен вручную
				si.nPos=HIWORD(wparam);
				break;
			case SB_PAGEDOWN:						//было ткнуто под скролом
				if (si.nPos+si.nPage < si.nMax)
					si.nPos+=si.nPage;
				else
					si.nPos=si.nMax;
				break;
			case SB_PAGEUP:							//было ткнуто над скролом
				if (si.nPos-si.nPage > si.nMin)
					si.nPos-=si.nPage;
				else
					si.nPos=si.nMin;
				break;
			case SB_LINEDOWN:						//была ткнута стрелка вниз
				if (si.nPos < si.nMax)
					si.nPos+=1;
				else
					si.nPos=si.nMax;
				break;
			case SB_LINEUP:							//соответственно вверх
				if (si.nPos > si.nMin)
					si.nPos-=1;
				else
					si.nPos=si.nMin;
				break;
			}
			if(si.nPos!=old_pos)
			{
				si.fMask=SIF_POS;
				SetScrollInfo(vscrollbar,SB_CTL,&si,TRUE);	//выставляем новую позицию
			}
		}
		break;
	case WM_HSCROLL:		//сообщение о скролле окна
		{
			SCROLLINFO si;
			si.cbSize=sizeof(si);
			si.fMask=SIF_ALL;
			GetScrollInfo(scrollbar,SB_CTL,&si);	//снимаем ТЕКУЩИЕ показания скролла
			int old_pos=si.nPos;					
			switch(LOWORD(wparam))
			{
			case SB_THUMBTRACK:						//был перетащен вручную
				si.nPos=HIWORD(wparam);
				break;
			case SB_PAGEDOWN:						//было ткнуто под скролом
				if (si.nPos+si.nPage < si.nMax)
					si.nPos+=si.nPage;
				else
					si.nPos=si.nMax;
				break;
			case SB_PAGEUP:							//было ткнуто над скролом
				if (si.nPos-si.nPage > si.nMin)
					si.nPos-=si.nPage;
				else
					si.nPos=si.nMin;
				break;
			case SB_LINEDOWN:						//была ткнута стрелка вниз
				if (si.nPos < si.nMax)
					si.nPos+=1;
				else
					si.nPos=si.nMax;
				break;
			case SB_LINEUP:							//соответственно вверх
				if (si.nPos > si.nMin)
					si.nPos-=1;
				else
					si.nPos=si.nMin;
				break;
			}
			if(si.nPos!=old_pos)
			{
				si.fMask=SIF_POS;
				SetScrollInfo(scrollbar,SB_CTL,&si,TRUE);	//выставляем новую позицию
			}
		}
		break;
так же было бы не плохо обрабатывать нажатие кнопки
Код:
case WM_COMMAND:
		if((HWND)lparam==button)
		{
			MessageBox(hwin,TEXT("Нажата кнопка"),TEXT("Уведомление"),MB_OK);
			break;
		}
		break;
но тут встаёт проблемма
раньше для определения что программа должна быть закрыта по крестику использовалось сообщение о деактивации окна
Код:
case WM_ACTIVATE:
		if(LOWORD(wparam)==WA_INACTIVE)
			SendMessage(hwin,WM_DESTROY,0,0);
		break;
теперь это сообщение возникает при мессейдж боксе и закрывает окно
пока что мы уберём кусок этого текста и рассмотрим этот момент позднее.
Вложение 13825
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 02.07.2008, 13:34 #7
rezak rezak вне форума
Новичок
 
Регистрация: 01.07.2008
Сообщений: 1
Репутация: 0
rezak rezak вне форума
Новичок
 
Регистрация: 01.07.2008
Сообщений: 1
Репутация: 0
Устройство: HTC Touch P3450
спасибо!!!
rezak вне форума   Ответить с цитированием Цитировать выделенное
Старый 01.02.2009, 20:16 #8
miilchenko miilchenko вне форума
Новичок
 
Регистрация: 01.02.2009
Сообщений: 1
Репутация: 0
miilchenko miilchenko вне форума
Новичок
 
Регистрация: 01.02.2009
Сообщений: 1
Репутация: 0
Устройство: MiTAC Mio A701
программы

А вариант самому написать прогу для прослушки и чтения смс на другом кпк(например жены)?
miilchenko вне форума   Ответить с цитированием Цитировать выделенное
Старый 01.02.2009, 20:32 #9
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
tz-lom tz-lom вне форума
Former Staff
 
Регистрация: 19.06.2007
Адрес: в сети
Сообщений: 680
Репутация: 134
Устройство: HP iPAQ H1930
miilchenko,
хм,бери winAPI и пиши,хотя вроде уже есть
tz-lom вне форума   Ответить с цитированием Цитировать выделенное
Старый 31.03.2009, 09:45 #10
Аватар для virtuoz
virtuoz virtuoz вне форума
Местный
 
Регистрация: 22.07.2008
Сообщений: 81
Репутация: 8
virtuoz virtuoz вне форума
Местный
Аватар для virtuoz
 
Регистрация: 22.07.2008
Сообщений: 81
Репутация: 8
Устройство: HTC Incredible S (Vivo, S710e)
а есть альтернатива редактора в unix?
virtuoz вне форума   Ответить с цитированием Цитировать выделенное
Старый 29.10.2010, 11:39 #11
Billy boy Billy boy вне форума
Новичок
 
Регистрация: 22.10.2010
Сообщений: 1
Репутация: 0
Billy boy Billy boy вне форума
Новичок
 
Регистрация: 22.10.2010
Сообщений: 1
Репутация: 0
Устройство: Нет
Здравствуйте. Есть две кнопки. При нажатии на одну из них возникает рамка выделения активной кнопки (фокус). Как убрать фокус, чтобы визуально эффекта не наблюдалось?
Billy boy вне форума   Ответить с цитированием Цитировать выделенное
Старый 29.10.2010, 18:48 #12
Аватар для Dynamite
Dynamite Dynamite вне форума
вездессущий засранец
 
Регистрация: 07.01.2008
Сообщений: 1,150
Репутация: 633
Dynamite Dynamite вне форума
вездессущий засранец
Аватар для Dynamite
 
Регистрация: 07.01.2008
Сообщений: 1,150
Репутация: 633
Устройство: Blackview BV6000
Цитата:
Сообщение от Billy boy Посмотреть сообщение
Здравствуйте. Есть две кнопки. При нажатии на одну из них возникает рамка выделения активной кнопки (фокус). Как убрать фокус, чтобы визуально эффекта не наблюдалось?
Неуверен, поможет или нет, попробуй по нажатию кнопки отправлять сообщение WM_KILLFOCUS
, описание:
Скрытый текст (вы должны зарегистрироваться или войти под своим логином):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
Dynamite вне форума   Ответить с цитированием Цитировать выделенное
Старый 12.04.2011, 20:09 #13
Аватар для vlad072
vlad072 vlad072 вне форума
Новичок
 
Регистрация: 18.01.2010
Адрес: 127.0.0.1
Сообщений: 9
Репутация: 3
vlad072 vlad072 вне форума
Новичок
Аватар для vlad072
 
Регистрация: 18.01.2010
Адрес: 127.0.0.1
Сообщений: 9
Репутация: 3
Устройство: LG P500 (Optimus One)
Чёт темка загнулась а жалко...
vlad072 вне форума   Ответить с цитированием Цитировать выделенное
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование скинов Навитела своими руками avdalev NAVITEL 33 04.09.2017 23:04
Нужно написать для КПК прогу или подскажите существующую xop Помощь и решение проблем 0 08.09.2012 16:00
Прошивка своими руками. psix1488 База знаний, или шаманство для посвященных 29 19.02.2010 11:06
Нужно написать программу gorodok123 Программирование под Windows Mobile 2 25.08.2009 06:02
Сложности, которые возникли при самостоятельной разлочке зверька kochrob Перепрошивка, джейлбрейк, разлочка 2 20.03.2008 00:28

 


Текущее время: 02:47. Часовой пояс GMT +3.


Powered by vBulletin®
Copyright ©2000 - 2017, vBulletin Solutions, Inc.