Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: react
Дата сообщения: 14.05.2004 00:27
ShIvADeSt

Цитата:
Как понять,окно в котором находится мыша, если окно под мышью, то тебе надо WindowFromPoint(TPoint), иначе используй GetForeGroundWindow так как она вернет верхнее активное окно котору и будет принадлежать мышь.


буду пробовать... Спасибо за совет !!!
Автор: STEEL
Дата сообщения: 22.05.2004 21:42
Посоветуйте пожалуйста, с чего начать изучать winapi, какие электронные книги почитать? чем отличается winapi от mfs?
Автор: mihas83
Дата сообщения: 23.05.2004 06:52
STEEL
Hачать изучать winapi с Рихтера - здесь есть ссылки на его книгу.
Ты имел в виду MFC - это классы, надстроенные над winapi.
Автор: STEEL
Дата сообщения: 23.05.2004 17:52
mihas83
Ясно. А нет ли чего-нибудь попроще Рихтера...
Автор: ShIvADeSt
Дата сообщения: 24.05.2004 00:27
STEEL
Вначале поставь себе цель, что именно, ты хочешь изучать в АПИ, там ведь много возможностей. Начать советую с создния окон на АПИ. Для этого ищешь либо здесь либо в инете пример создания окон разбираешься спрашиваешь, потом думаешь что ты хочешь делать дальше, опять спрашиваешь как это можно или ищешь сам. В итоге сможешь более или менее разбираться в принципах программирования на АПИ и сможешь уже без особого труда писать свои приложения. Насчет книг, я их честно мало прочел точнее одну, учил АПИ исключительно по хэлпу и прмерам, часами разбираясь в коде, зато потом более понятно, так как когда я начинал этих книг либо не было а потом они стоили очень дорого Хотя азы можно и нужно! изучать по книгам.
Автор: BugFixer
Дата сообщения: 24.05.2004 03:24
STEEL

Цитата:
А нет ли чего-нибудь попроще Рихтера...

А чем тебя Рихтер не устраивает?
Автор: vito333
Дата сообщения: 24.05.2004 04:58
STEEL
есть и попроще - Petzold

хотя вообще писать на винапи достаточно долго и трудно, если только действительно требуется минимум размера и максимум скорости, да легкость по сист. требованиям.
Лучше все таки врапперы использовать.
в общем у всех способов свои недостатки:
winapi - очень сложно и долго, но результат минимален и легок (помимо знания С++ надо еще и в винде хорошо врубаться, поэтому Рихтер и Петзольд необходимы),
mfc - быстро и красиво, как в дельфях, но громоздко и тяжелее по требованиям, плюс зависимость от доп. библиотек,
wtl - gui-врапперы над winapi, но недостаточно компактные (на мой взгляд), хотя по сравнению с mfc - cool.
Автор: mihas83
Дата сообщения: 24.05.2004 06:03
STEEL

Цитата:
А нет ли чего-нибудь попроще Рихтера

Куда уж попроще ?
Как раз, ИМХО, Рихтер - одна из лучших и классических книг...
С толковым изложениием основ основ в разных плоскостях.
Автор: STEEL
Дата сообщения: 24.05.2004 10:35
Как в BC++ 6 работать с WINAPI, то есть, как в VC++ создаётся приложение типа WIN32, в BC я что-то не нашёл.
Автор: mihas83
Дата сообщения: 24.05.2004 16:28
STEEL

Цитата:
Как в BC++ 6 работать с WINAPI, то есть, как в VC++ создаётся приложение типа WIN32, в BC я что-то не нашёл.

Грубо говоря, это ты получаешь бесплатно визардом за 3 секунды, выбрав один из последних четырех типов проектов...
Но, ИМХО, тебе надо открыть отд. тему...
Автор: react
Дата сообщения: 26.05.2004 00:12
STEEL

Цитата:
Как в BC++ 6 работать с WINAPI

А откуда скачать не подскажешь ???
Автор: STEEL
Дата сообщения: 26.05.2004 09:26
react
BC++ ? ТЕбе в варезник.
Автор: react
Дата сообщения: 29.07.2004 10:19
Народ, кто-то писал проги с использованием com-порта ??? Если да, киньте плиз примерчик в ПМ, в часности
нужно чтоб он умел хотя-бы читать битовый поток данных и формировать из них байты...

Заранее огромное спасибо !!!
Автор: ShIvADeSt
Дата сообщения: 30.07.2004 00:50
react
пробуй это


Цитата:

-------------
...write/read a string to/from the serial port ?
-------------
Category: System



function OpenCOMPort: Boolean;
var
DeviceName: Array[0..80] of Char;
begin
{ First step is to open the communications device for read/write.
This is achieved using the Win32 'CreateFile' function.
If it fails, the function returns false.

Wir versuchen, COM1 zu Жffnen.
Sollte dies fehlschlagen, gibt die Funktion false zurЭck.
}
StrPCopy(DeviceName, 'COM1:');

ComFile := CreateFile(DeviceName,
GENERIC_READ or GENERIC_WRITE,
0,
Nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);

if ComFile = INVALID_HANDLE_VALUE then
Result := False
else
Result := True;
end;


function SetupCOMPort: Boolean;
const
RxBufferSize = 256;
TxBufferSize = 256;
var
DCB: TDCB;
Config : String;
CommTimeouts : TCommTimeouts;
begin
{ We assume that the setup to configure the setup works fine.
Otherwise the function returns false.

wir gehen davon aus das das Einstellen des COM Ports funktioniert.
sollte dies fehlschlagen wird der RЭckgabewert auf "FALSE" gesetzt.
}

Result := True;

if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
Result := False;

if not GetCommState(ComFile, DCB) then
Result := False;

// define the baudrate, parity,...
// hier die Baudrate, ParitДt usw. konfigurieren

Config := 'baud=9600 parity=n data=8 stop=1';

if not BuildCommDCB(@Config[1], DCB) then
Result := False;

if not SetCommState(ComFile, DCB) then
Result := False;

with CommTimeouts do
begin
ReadIntervalTimeout := 0;
ReadTotalTimeoutMultiplier := 0;
ReadTotalTimeoutConstant := 1000;
WriteTotalTimeoutMultiplier := 0;
WriteTotalTimeoutConstant := 1000;
end;

if not SetCommTimeouts(ComFile, CommTimeouts) then
Result := False;
end;


{
The following is an example of using the 'WriteFile' function
to write data to the serial port.

Folgendes Beispiel verwendet die 'WriteFile' Funktion, um Daten
vom seriellen Port zu lesen.
}


procedure SendText(s: String);
var
BytesWritten: DWORD;
begin
{
Add a word-wrap (#13 + #10) to the string

An den Эbergebenen String einen Zeilenumbruch (#13 + #10) hДngen
}
s := s + #13 + #10;
WriteFile (ComFile, s[1], Length(s), BytesWritten, Nil);
end;


{
The following is an example of using the 'ReadFile' function to read
data from the serial port.

Folgendes Beispiel verwendet die 'ReadFile' Funktion, um Daten
vom seriellen Port zu lesen.
}


procedure ReadText : string;
Var
d: array[1..80] of Char;
s: String;
BytesRead, i: Integer;
begin
result := '';
if not ReadFile (ComFile, d, sizeof(d), BytesRead, Nil) then
begin
{ Raise an exception }
end;
s := '';
for i := 1 to BytesRead do s := s + d[I];
result := s;
end;


procedure CloseCOMPort;
begin
// finally close the COM Port!
// nicht vergessen den COM Port wieder zu schliessen!
CloseHandle(ComFile);
end;


Автор: react
Дата сообщения: 20.10.2004 16:10
ShIvADeSt
А есть примеры на С++ ??? может есть какая-то тестовая программка ???
Автор: vito333
Дата сообщения: 20.10.2004 17:40
нет ли у кого примерчика реализации самодельного контрола типа EDIT или RICHEDIT?

============

ShIvADeSt
такой вопрос, как к спецу по дельфи - посмотри исходник Bred2 - интересует процедура Open, а именно, почему он феноменально быстро открывает/отображает файлы - может какой момент увидишь - я смотрел, вроде все как обычно, но файл 26 мег я в ричедите (ver.3) отобразить быстрее 5 сек. никак не могу (С++ и winAPI), а бред - 1-2 сек., почти независимо от размера файла. Может это особенность реализации winAPI в дельфи?
Я уже и SETTEXT-ом пробовал, и EVENTMASK обрубил - бред отображает любой файл со скоростью функции ReadFile - она читает быстро, но вот STREAMIN в ричедит - основной у меня тормоз - по идее у бреда должно быть то же самое, ан нет.
Я уж молчу про Бред3 - там похоже вообще свой контрол используется вместо обычного для таких редакторов ричедита и грузится тоже все моментально.
Причем бред2 похоже отображает начало файла и продолжает загрузку, но при этом можно уже чего-то делать с текстом, у меня же пока весь не загрузится - не кажет.

В общем, хотелось бы услышать соображения на этот счет.
Автор: WiseAlex
Дата сообщения: 20.10.2004 18:52
react

Цитата:
А есть примеры на С++ ??? может есть какая-то тестовая программка ???

http://www.sources.ru/cpp/cpp_system.shtml#7
Автор: ShIvADeSt
Дата сообщения: 21.10.2004 03:12
vito333
Посмотрю завтра, сегодня выходной. Кстати у тебя есть сорцы бреда? Если нет, то могу дать
Автор: TeXpert
Дата сообщения: 21.10.2004 04:03
vito333

Цитата:
...а бред - 1-2 сек., почти независимо от размера файла. Может это особенность реализации winAPI в дельфи?
Я уже и SETTEXT-ом пробовал, и EVENTMASK обрубил - бред отображает любой файл со скоростью функции ReadFile - она читает быстро, но вот STREAMIN в ричедит - основной у меня тормоз - по идее у бреда должно быть то же самое, ан нет.

А попробуй отладчиком посмотреть, что вызывается.
Автор: vito333
Дата сообщения: 21.10.2004 09:59
ShIvADeSt
исходник у меня есть - тот что везде в нете - на 2.1.4 по моему, хотя при этом ЕХЕ 2.1.8.
Смотрю в него, а в результате - фига.

TeXpert


Цитата:
А попробуй отладчиком посмотреть, что вызывается.


я владею только BoundsChecker-ом в виж.студио (((.

------------------------------
я причем смотрел скорость загрузки кучи редакторов - очень мало какие грузят быстро (относительно), большинство вообще дохнут даже на средних файлах (5-6 мег) - но БРЕДЫ 2 и 3 - вне конкуренции.
Хочу понять.
Автор: react
Дата сообщения: 21.10.2004 13:57
WiseAlex

Цитата:
http://www.sources.ru/cpp/cpp_system.shtml#7

Сенькс за ссылку !!!
Автор: vito333
Дата сообщения: 21.10.2004 14:20
может есть разница в скорости загрузки в окно ричедита в SDI-приложении и MDI-проге?
у меня MDI. Сомневаюсь, что это так, но вдруг все обстоит таким образом?
Автор: segeich
Дата сообщения: 21.10.2004 14:53
vito333
Дык ты небось сначала файл грузишь, а потом его в richedit копируешь?

Набросал простой тест через STREAMIN, подсунул ему файл на 100 мегов - 12 секунд.
Открыл файл 2-м бредом - те же 12 секунд.

На 23-х меговом файле - 2-3 сек у обоих.


Код:
DWORD LoadCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
FILE* file = (FILE*)dwCookie;
*pcb = fread(pbBuff, 1, cb, file);
return 0;
}

void CTestDlg::OnLoad()
{
FILE* file = fopen("c:\\big.txt", "rb");

EDITSTREAM stream;
stream.dwCookie = (DWORD_PTR)file;
stream.pfnCallback = LoadCallback;

m_richedit.StreamIn(SF_TEXT, stream);

fclose(file);
}
Автор: ShIvADeSt
Дата сообщения: 22.10.2004 01:23
vito333
Я согласен с segeich, так как большой разницы между его кодом и тем, что в бреде не заметил, та же самая работа с потоком. Разницы между загрузкой в МДИ и СДИ быть не должно. Дай свой кусок, как ты открываешь файл. Мож там трабла.
Автор: vito333
Дата сообщения: 26.10.2004 16:51
ShIvADeSt
да в том то и дело, я для проверки спрашивал, сам я вижу, что одно и то же и в бреде и у меня. Существенный момент есть такой - бред большой файл начинает отображать еще и не загрузив полностью, у меня же только после полной практически загрузки - отсюда визуальная разница.
http://vito.rbcmail.ru/Mark2.exe
попробуй драг"н"дропом кинуть в эту прогу файл габаритный - в статбаре будут сообщения: "file was read" - файл считан в ReadFile-ом в буфер в памяти, "converted" - весь буфер конвертирован в юникод, "ready" - файл полностью загружен из буфера в ричедит. Так вот скорость загрузки в рич даже из памяти очень невысока. Правда ричедит юникодовый, но я сравнивал с обычным - разницы нет. Я проверил - загрузка в ричедит идет кусками по 4096 байт, итого на файле 26 мб - несколько десятков тыс. операций по 4096 б. Не могу понять, из памяти он медленнее грузится, что ли, чем с диска. Я перешел на юникодовый контрол, а посему мне напрямую загрузка не подходит - юникод так не реализуешь, все равно конвертить надо, а значит - буфер нужен.

Попробую сейчас напрямую с диска в рич грузить, сравню, хотя я по-моему уже пробовал.

Добавлено
BOOL File_Load(LPCTSTR fullfilename)
{
EDITSTREAM es = {0};
HANDLE hfile;
HWND hRTF,hwnd;
DWORD bufSize, bytesReaded;
PCHAR pBuf;
LPDOC_INFO pDI;
TCHAR fn[MAX_PATH]={0};

lstrcpy(fn,fullfilename);
hfile = CreateFile(fullfilename,GENERIC_READ,0,0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
if (hfile == INVALID_HANDLE_VALUE) return FALSE;
// готовим структуру
ZeroMemory(&BufInfo,sizeof(BufInfo));
// получаем размер файла
BufInfo.BufSize = bufSize = GetFileSize(hfile,0);

// проверяем, годится ли текущее окно для загрузки документа?
if (hwnd = hActiveMdiWnd())
{
// получаем адрес структуры данных окна
pDI = ptrWNDSTRUCT(hwnd);
// есть активное мди-окно - проверяем его РТФ
GETTEXTLENGTHEX tl;
hRTF = hActiveRTF(hwnd);
tl.flags = GTL_NUMCHARS;
tl.codepage = CP_ACP;
// если длина текста в РТФ != 0, то создаем новое окно
if (SNDMSG(hRTF, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0))
{
// создаем новое окно для открываемого файла
hwnd = Child_Window_New((LPCTSTR)fn);
}else{
// поправляем заголовок окна
SetWindowText(hwnd,fn);
// set new tab title
Tab_ChangeTitle( mainTabBar.hTabBar,1111,fn);
}
}
else // нет активного мди-окна
{
// создаем новое окно для открываемого файла
hwnd = Child_Window_New((LPCTSTR)fn);
// получаем адрес структуры данных окна
pDI = ptrWNDSTRUCT(hwnd);
}

// вычисляем хэндл ричедита
hRTF = hActiveRTF(hwnd);// di->hwnd_RTF;

// готовим структуру для EM_STREAMIN
es.dwCookie = (DWORD_PTR)hfile;
es.pfnCallback = &LoadFileCallBack2;

// загружаем файл
long rtfmask = SendMessage (hRTF,EM_SETEVENTMASK,0,0);
SNDMSG(hRTF, EM_STREAMIN,(WPARAM)(UINT)SetStreaminFlags(fn),(LPARAM)(EDITSTREAM FAR *) &es);
SendMessage (hRTF,EM_SETEVENTMASK,0,rtfmask);

// закрываем хэндл считанного файла
CloseHandle(hfile);

// ставим флаг, что файл не изменялся
SNDMSG(hRTF, EM_SETMODIFY,(WPARAM)FALSE,(LPARAM)0);

ToolBar_Buttons_SetState(hRTF);
// сохраняем в список MRD
MRD_save((LPTSTR)fn);

return TRUE;
}

static DWORD CALLBACK
LoadFileCallBack2(DWORD dwCookie, // application-defined value
LPBYTE lpBuffer, // pointer to a buffer
LONG lSize, // number of bytes to read or write
LONG *plRead) // pointer to number of bytes transferred
{
if(!lSize) return 1;
if(!ReadFile((HANDLE) dwCookie,lpBuffer, lSize, (LPDWORD) plRead, NULL))
return -1;
return 0;
}
вот собсно загрузка в обычный ричедит контрол.
на 26 мб файл тхт ~5-6 сек.
Автор: vito333
Дата сообщения: 29.10.2004 09:55
а бред2 у меня файл 26 мб начинает отображать через 1 сек.
Автор: ShIvADeSt
Дата сообщения: 01.11.2004 01:09
vito333
только что проверил у себя твою прогу и бред3 скорость один в один ну может на секунду разница. Правда у меня Атлон 2500+ и памяти 512 ДДР 400 мгц. А так даже в принципе не заметно различия. Бред2 проверить не смог, он виснет при открытии файла на котором я тестил
Автор: vito333
Дата сообщения: 01.11.2004 14:48
ShIvADeSt
я пробую на своем пень3-500 и 512 рамы.
бред3 заметно быстрее, думаю за счет того, что у него свой контрол, а не ричедит.
в общем, вопрос снимается - никаким способом, видимо, загрузку в ричедит не ускоришь.
спасибо за помощь.
Автор: vito333
Дата сообщения: 15.11.2004 05:38
ShIvADeSt
я тут, объясняй, лучше попроще и попонятней по шагам, а то я пока к вопросу не подступался. То есть я создаю не полный шаблон открытия файла, а только кусок с нужными контролами? Флагами в системном вызове функции указываю использовать шаблон. Как он позиционируется в системном?
Автор: ShIvADeSt
Дата сообщения: 15.11.2004 08:17

Цитата:
То есть я создаю не полный шаблон открытия файла, а только кусок с нужными контролами?

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

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.