четверг, 31 января 2008 г.

Теперь на visual C++ 2005

Создаём новый проект, выбераем smart device\ Win32 smart device project
В Name пишем имя проекта, OK


Нажимаем Next

Еще раз

ставим галочку empty project и финиш


Вот что получилось, теперь нажмем провой кнопкой на левую панель
выберем add\new item...


выберем C++ File (.cpp)


введем имя и нажмем add
введем текст который идет ниже он полность повторяет паскалевский только чуть изменен




#include -=windows.h=-
#include -=commctrl.h=-
#include "resource.h"

HWND hWinMain;
HINSTANCE hInst;
HANDLE Thread1;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
DWORD WINAPI WaveOut(LPVOID pParm);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine,int nCmdShow)
{
MSG msg;

hInst = GetModuleHandle(0);
hWinMain = FindWindow(NULL,(LPCWSTR)"Proj3");
if (hWinMain)
{
ShowWindow(hWinMain, SW_SHOW);
SetForegroundWindow(hWinMain);
ExitProcess(0);
}
hWinMain = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,(DLGPROC)MainWndProc);
if (!hWinMain) ExitProcess(0);
ShowWindow(hWinMain,SW_SHOW);
UpdateWindow(hWinMain);
Thread1 = CreateThread(NULL,NULL,WaveOut,NULL,CREATE_SUSPENDED,NULL);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg,
WPARAM wParam, LPARAM lParam)
{
switch (wMsg) {
case WM_DESTROY:
EndDialog(hWnd, LOWORD(wParam));
break;
case WM_COMMAND:
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDC_BUTTON1:
PostQuitMessage(0);
break;
case IDC_BUTTON2:
ResumeThread(Thread1);
break;
case IDC_BUTTON3:
SuspendThread(Thread1);
break;
}
break;

}
return DefWindowProc(hWnd, wMsg, wParam, lParam);
}

DWORD WINAPI WaveOut(LPVOID pParm)
{
wchar_t* s = new wchar_t[255];
while (true)
{
_ltow((long)GetTickCount(),s,10);
SendDlgItemMessageW(hWinMain,IDC_STATIC1,WM_SETTEXT,0,(LPARAM)s);
}
delete s;
return 0;
}


Тут все должно быть ясно, так как все взято с прошлого примера
Теперь нам надо добавить форму с кнопками статический текст

Снова нажимаем правой кнопкой мыши на левую панель и добавляем resource file(.rc) во вкладке resource, и в нем уже добавляем диалог.



перед нами форма с двумя кнопками, давайте их удалим, выделяем и нажимаем делет
в пустую форму заносим две кнопки и static text.


Далее жмем на форму и изменяем размер и настройки
Title menu стави false
Control = true
В настройках static изменяем ID
на IDC_STATIC1 и вытягиваем на всю ширину формы.

Забыл... добавим еще одну кнопку.
Ну вроде все пробуем, F5. 

вторник, 29 января 2008 г.

Добавление потока

Добавим кнопку на форму Stop Thread с Control_ID = 5

Для добавления потока нужно чуть изменить код.
Сразу после Program project1
добавляем строку {$mode DELPHI} эта строка нужна для того чтобы компилятор был совместим с делфи.

Uses имеет такой вид
uses
windows, sysutils, messages, Classes;

sysutils содержит дополнительные функции
Classes содержит классы

В Var добавляем Thread1: TThreadID;

После него пишем процедуру

procedure Start;
var
s: WideString;
begin
while true do //Бесконечный цикл
begin
s:=IntToStr(GetTickCount); //в строку заносим время работы виндовса
SendDlgItemMessage(handle,4,WM_SETTEXT,0,longint(PWideChar(s))); //посылаем строку label`у
end;
end;


В procedure2 пишем

if Thread1=0 then
Thread1:=BeginThread(@Start)
else
ResumeThread(Thread1);


Создадим еще одну процедуру, угадайте как её назовем :)

procedure procedure3;
begin
suspendthread(Thread1);
end;


а обработку кнопки сделайте сами.

Всю программу можно скачать отсюда.



http://dump.ru/files/o/o031322806/
MD5 хеш файла: cbdcac516e8ed101e27a4f6bfff939e6

понедельник, 28 января 2008 г.

Первая программа

Все настройки произведены, теперь напишем простенькую программку с нескольками кнопками и Label`ами на API.

Все проекты рекомендую держать в одной папке например
мои докУменты\Lazarus Projects\

В ручную форму создавать я не буду, и создам её с помощью редактора ресурсов, для этого я использовал Resource Builder 2.6.4.1

Вот что у меня получилось:



В свойствах формы
Styles выставленно - DS_CONTROL
Windows Style выставленно - WS_POPUP WS_SYSMENU WS_CAPTION
в True остальное в False

Размер формы 168 на 223

На форме помещены три кнопки и два лэйбла(не знаю как пишется по руский)
Теперь выставляем Control_ID для всех элементов так
Кнопка с Caption=Label выставляем 0
Кнопка с Caption=Exit выставляем 1
Кнопка с Caption=Thread выставляем 3
Label0 выставляем 2
Label1 выставляем 4
Это нужно для того чтобы следующий код работал как надо.

Сохраняем под именем Form.res (не rc)
Вроде с формой все.
Теперь приступим к лазарю.
Нажимаем создать... и выбераем Program

Перед нами чистый проект.
Можно весь текст удалить и вставить вот это:

program project1;
{$R Form.res}  // Добавление ресурсов где находится форма

uses
windows, messages; // Без них никак, библеотеки

var
handle: Hwnd; //Handle окна
Msg: TMsg;  // для получения системных сообщений
inst: THandle; 

procedure procedure1; // Процедура нажатия кнопки Label
begin
SendDlgItemMessage(handle,
2,WM_SETTEXT,0,longint(PWideChar('Privet')));
// SendDlgItemMessage посылает сообщение Label0 об установки текста
// При создании формы мы указывали Control_ID у Label0 он равен 2
// WM_SETTEXT указывает что нужно установить текст
// longint(PWideChar('Privet')) это указатель на строку, так как мы используем константу то приходиться делать вот так.
end;

procedure procedure2; 
// Процедура нажатия кнопки Thread
begin
//Можете поэксперементировать здесь
end;

function WindowProc(Wnd:hwnd; uMsg:uint; wP:Wparam;lP:Lparam):Lresult; Stdcall;
// функция обработки сообщений главного окна
var nCode, ctrlID : word;
begin
if Umsg=wm_initdialog then
begin
result:=cardinal(true); // что делать при инициализации
end;
if Umsg=wm_command then
begin  // вот здесь обрабатываются наши кнопочки
nCode:=hiWord(wP);
ctrlID:=loWord(wP);
if ctrlid=1 then // Exit Button
begin
postquitmessage(0);
Result:=cardinal(true);
end;
if ctrlid=0 then procedure1; // Label Button
if ctrlid=3 then procedure2; // Thread Button
result:=cardinal(true);
end;
if umsg = wm_destroy then // уничтожение окна
begin
postquitmessage(0);
enddialog(wnd,0);
Result:=cardinal(true);
end;
if umsg = wm_close then // закрытие окна
begin
postquitmessage(0);
enddialog(wnd,0);
Result:=cardinal(true);
end;
result:=cardinal(false);
end;

var
h: HWND; //нужен для нахождения окна

begin
//szWindowClass , szTitle
h := FindWindow(nil,'Proj3'); // находим окно с заголовком Proj3
if (h<>0)then // Если нашли то покажем его и завершим эту программу
begin // подумайте для чего это нужно
ShowWindow (h, SW_SHOW);
SetForegroundWindow(h);
ExitProcess(0);
end;
inst:=GetModuleHandle(nil);
handle:=CreateDialog(inst,'DIALOG_0',0,@WindowProc); // Создание окна
if ((handle=INVALID_HANDLE_VALUE)or(handle=0)) then
begin
MessageBox(0,'Cant`t create dialog','Error ',0);
ExitProcess(0);
end;

showwindow(handle,SW_SHOW);
UpdateWindow(handle);

while GetMessage(@Msg, 0, 0, 0) do
begin
TranslateMessage(@msg);
DispatchMessage(@msg);
end;

end.


Попробуйте скомпилировать
и посмотреть что получится.

Настройка компилятора.
Проект\Параметры компилятора...

Закладки:

Пути\Другие модули
Пишем "$(LazarusDir)\lcl\interfaces\wince\" конечно без ковычег



Обработка



Код



Связывание



Все теперь можно пробывать.
Проще всего запускать программу на эмуляторе, а можно и на КПК.
Я пользуюсь первым.

Настройка эмулятора.

Скачиваем эмулятор и image файл к нему, у меня все установилось с Visual Studio 2005 правда там только Win CE 2003.
Все ссылки на эмуляторы и актив синк есть на этом сайте http://www.ladoshki.com/161_articles_Эмуляторы_Windows_Mobile_на_домашнем_компьютере.htm

Запускаем эмулятор в меню File\Configure...
прописать путь к вашим проектам.


Подчеркнуто синим.
Теперь будет проще, нажимаем в Лазаре Ctrl + F9 ждем строки
Проект успешно собран и переходи в эмуль, там тыкаем на приложение и все, смотрим своё творчество.

пятница, 25 января 2008 г.

Настройка и установка Lazarus

Установка Lazarus

скачиваем два файла с http://sourceforge.net/project/showfiles.php?group_id=89339

Lazarus-0.9.24-fpc-2.2.0-20071114-win32.exe
Lazarus-0.9.24-fpc-2.2.0-20071105-cross-arm-wince-win32.exe

Сначало устанавливаем первый
потом второй в тужу папку


Установка KOL и MCK

1. Скачиваем KOL и MCK для Lazarus с http://www.kolnmck.ru/files1.shtml или самая свежая версия svn http://sourceforge.net/projects/kol-ce/. Выкладываем скачанные файлы, например, в папку "...\Lazarus\KOL". Чтобы в дальнейшем не пришлось исправлять пути в пакете MCK, желательно сохранить структуру каталогов:
"...\Lazarus\KOL\kol" и "...\Lazarus\KOL\mck".
2. Устанавливаем МСК. Для этого:

* Открываем пакет MirrorKOLPackage.lpk (меню "Компоненты"->"Открыть файл пакета").



В результате открывается окно "Пакет MirrorKOLPackage".



* Компилируем [1] пакет, если все успешно, то получаем сообщение: "Compiling package MirrorKOLPackage 2.72" completed".



* Проверим "Настройки"[2] пакета. Вкладка "Встраивание в IDE": "Tип пaкeтa" должен быть "Toлькo для paзpaбoтки", а "Oбнoвить/пepeбpaть" - "Pучнaя кoмпиляция (нe aвтoмaтичecки)".



* Нажимаем кнопку "Установить" [3], на вопрос "Bы xoтитe пepeбpaть Lazarus ceйчac?" отвечаем "Да".



В результате Lazarus будет пересобран, в палитру компонентов будет добавлена вкладка "KOL" c зеркалами KOL-компонентов.
В случае успешной операции, Lazarus, после сборки, должен запуститься сам. Если этого не произошло (бывает иногда), значит что-то пошло не так, и обычно нужно повторить установку еще раз.


Установка KOL-компонентов сторонних разработчиков

1. Дополнительные компоненты KOL можно скачать отсюда: http://www.kolnmck.ru/files2.shtml. Те компоненты, которые поддерживают Lazarus и WinCE отмечены в соответствующей колонке.
2. Установка аналогична установке MСK.

Внимание!!! При использовании нескольких пакетов KOL-компонентов (например MirrorKOLPackage, KOLUpDown, DirTreeView, GRush Controls и т.д.), Lazarus, при установке\переустановке какого либо пакета, может иногда выдавать ошибку что не найден(ы) ранее установленый(е) пакет(ы). В этом случае обычно помогает открытие и перекомпиляция этого ранее установленого пакета.


Создание KOL- проекта

1. Создаем новый проект (меню "Пpoeкт"->"Создать проект").
2. Сохраняем его (меню "Файл"->"Сохранить все"). Например, "C:\Test\project1.lpi" .
3. Кладем на форму компонент TKOLProject, устанавливаем его свойство "projectDest", например, KOLProject.



4. Кладем на форму компонент KOLForm.
5. Сохраняем проект (меню "Файл"->"Сохранить все").
6. Открываем наш созданный KOL-проект. (меню "Пpoeкт"->"Открыть проект"). Он называется "KOLProject.lpi"
7. Сразу после открытия Lazarus ругается. Что то типа "Unit1.pas(15,4) Fatal: Can't open include file "MCKfakeClasses.inc".
Выполняем следующие действия:
- Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"). Прописываем пути к KOL



- Открываем pas-файл формы (Unit1.pas), ищем в нем строку "{$I Unit1.lrs}" и если находим, то удаляем ее нахрен.
- Подвигать форму :)).
8. Компилируем проект (меню "Запуск"->"Сборка") . Теперь должно получиться. Если все хорошо, то видим сообщение "Проект "KOLProject" успешно собран. :) ".



9. Exe-файл появился на диске "C:\Test\KOLProject.exe" и даже запускается! Вот только размер удручает: 1 011 718 байт.....
10. Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"), вкладка "Связывание". Убираем галку у "Bыдaть нoмepa cтpoк в oшибкax вpeмeни иcпoлнeния (-gl)" и ставим на "Bыpeзaть cимвoлы из бинapникa (-Xs)".



11. Компилируем проект. И... пришло счастье - размер 42 528 байт!
12. Теперь можно положить несколько кнопок, и еще каких нибудь компонентов.:))
13. При использовании компонентов из дополнительных пакетов (например KOLUpDown, DirTreeView, GRush Controls и т.д.) необходимо перед компиляцией проекта (после добавления компонента на форму) удалить эти пакеты из секции "Tpeбyeмыe пaкeты" проекта. Иначе Lazarus будет пытаться компилировать их. Впрочем, MirrorKOLPackage тоже иногда пытается компилить, поэтому тоже лучше удалять.



Также необходимо указать пути к этим компонентам (см. п. 7).

14. Опции компилятора, которые необходимо задать для проекта указаваются с ключом "-d" в "Параметрах компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"), вкладка "Другое", "Параметры пользователя".




Компиляция под WinCE

Продолжаем мучить наш многострадальный проект ""KOLProject.lpi". Откомпилируем его под WinCE.

1. Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора").
- Вкладка "Пути": устанавливаем "Tип элeмeнтa yпpaвлeния LCL (дpyгoe)" равным "wince".



- Вкладка "Код", "Цeлeвaя Плaтфopмa" : устанавливаем "Для кaкoй OC (-T)" равным "WinCE", "Для ЦП: (-P)" равным "arm"



- Нажимаем "Ok" :)).
2. Для KOLForm назначаем свойства defaultSize = True и defaultPosition = True
3. Компилируем, получаем программу для WinCE.



Возможные проблеммы

1. Под WinCE возникает ошибка при компиляции файла ресурсов "KOL-CE.rc".
Возможные решения:
В случае, если не используется меню, можно просто закоментировать в файле "Kol.pas" строку {$R KOL-CE.rc}.
Также можно откомпилировать "KOL-CE.rc" самому командной строкой "arm-wince-windres KOL-CE.rc KOL-CE.res", а в файле "Kol.pas" строку {$R KOL-CE.rc}. заменить на {$R KOL-CE.res}.
2. При использовании директивы UNICODE_CTRLS, а в WinCE она используется автоматически всегда, в Lazarus имеется проблема с использованием русского языка. Причина проблемы в том, что FPC 2.1.5 (и ранние версии) не понимает кодировку 1251 при переводе из ANSI в WIDE. Со временем обещают исправить. Сейчас можно использовать resourcestring или такую конструкцию:
function Ansi2Wide(S: AnsiString): WideString; begin Result:= S; end;
Тогда присвоение типа: Button1.Caption:= Ansi2Wide('йй'); работает правильно.

Автор: Дмитрий Матвеев
Из материалов: http://www.kolnmck.ru/lessons/lazarus_use.shtml