во всех тех примераз должна была быть строка DrawText/TextOut. вот туда свою строку и суй...
» Visual C++
строки не видел этой там, но уже сам догнал что куда,
спасибо за совет!
спасибо за совет!
скажите, пожалуйста, как при выводе на принтер (в данном случае виртуальный Adobe - вывод происходит в файл pdf) сделать перевод строки
у меня вместо символов перевода отображаются квадратики
подскажите начинающему какие варианты перевода на новую строку существуют в природе
у меня вместо символов перевода отображаются квадратики
подскажите начинающему какие варианты перевода на новую строку существуют в природе
cmncorp
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню
в юниксе $0A
OdesitVadim
Цитата:
так сделать не получилось
пробовал сделать так:
1) \r\n
2) \x0D\x0A
3) \0
в первых двух случаях (что одно и то же по сути) выводятся квадратики вместо перехода на новую строку
в 3 случае квадратики не выводятся, но и перехода не происходит
Цитата:
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню
так сделать не получилось
пробовал сделать так:
1) \r\n
2) \x0D\x0A
3) \0
в первых двух случаях (что одно и то же по сути) выводятся квадратики вместо перехода на новую строку
в 3 случае квадратики не выводятся, но и перехода не происходит
cmncorp
Вывод на принтер на WinAPI не совсем тривиален. "Переводить" строки приходится самому. Я в свое время делал примерно так:
Код: HDC pdc;
HFONT font;
TEXTMETRICW tm;
...
pdc = GetPrinterDC();
font = SetupFont(pdc);
SelectObject(pdc, font);
GetTextMetrics(pdc, &tm);
SetupPage(pdc, &tm);
...
Y = 0;
TextOut(pdc, x_offset, Y, struni, cnt);
Y += char_height;
Вывод на принтер на WinAPI не совсем тривиален. "Переводить" строки приходится самому. Я в свое время делал примерно так:
Код: HDC pdc;
HFONT font;
TEXTMETRICW tm;
...
pdc = GetPrinterDC();
font = SetupFont(pdc);
SelectObject(pdc, font);
GetTextMetrics(pdc, &tm);
SetupPage(pdc, &tm);
...
Y = 0;
TextOut(pdc, x_offset, Y, struni, cnt);
Y += char_height;
Спасибо огромное за информацию f_serg!
А я ведь и сначала при использовании принтера не обратил внимание на поле в методе TextOut, где происходит ввод координат курсора
На основе Вашего и своего кода получилось следующее (пока без учёта большого кол-ва страниц):
void CResultDlg::OnPrinter()
{
CPrintDialog cp(FALSE); // выбираем принтер
cp.GetDefaults(); // используем принтер по умолчанию
CDC PrintDC; // контекст принтера
PrintDC.Attach(cp.GetPrinterDC()); // получаем контекст принтера
DOCINFO infStru; // структура с информацией
::ZeroMemory (&infStru, sizeof (DOCINFO)); // обнулить
CString title=array[1];
infStru.cbSize = sizeof (DOCINFO); // заполняем структуру
infStru.lpszDocName=title;
infStru.lpszOutput=NULL;
if (PrintDC.StartDoc(&infStru )==-1)AfxMessageBox("Error StartDoc") ;
// Начало документа
PrintDC.StartPage(); // начало страницы
char temp[200]; // буфер
int y=500; // начальное смещение от края листа
for(int i=1;i<(number);i++)
{
strcpy(temp,""); // очистка переменных
m_ResultField="";
char k[4];
itoa(i,k,10);
strcat(temp,k);
strcat(temp," ");
strcat(temp,array[i]);
m_ResultField.Format("%s", temp); // формирование строки
int Lenght = m_ResultField.GetLength(); // определение её длины
PrintDC.TextOut(500, y, m_ResultField, Lenght); // вывод строки на принтер
y=y+200; // смещение (видимо в пикселях)))
}
if (PrintDC.EndPage()<0) AfxMessageBox("Error EndPage"); // конец страницы
if (PrintDC.EndDoc()==0) AfxMessageBox("Error EndDoc"); // конец документа
PrintDC.Detach(); // отсоединить контекст
}
А я ведь и сначала при использовании принтера не обратил внимание на поле в методе TextOut, где происходит ввод координат курсора
На основе Вашего и своего кода получилось следующее (пока без учёта большого кол-ва страниц):
void CResultDlg::OnPrinter()
{
CPrintDialog cp(FALSE); // выбираем принтер
cp.GetDefaults(); // используем принтер по умолчанию
CDC PrintDC; // контекст принтера
PrintDC.Attach(cp.GetPrinterDC()); // получаем контекст принтера
DOCINFO infStru; // структура с информацией
::ZeroMemory (&infStru, sizeof (DOCINFO)); // обнулить
CString title=array[1];
infStru.cbSize = sizeof (DOCINFO); // заполняем структуру
infStru.lpszDocName=title;
infStru.lpszOutput=NULL;
if (PrintDC.StartDoc(&infStru )==-1)AfxMessageBox("Error StartDoc") ;
// Начало документа
PrintDC.StartPage(); // начало страницы
char temp[200]; // буфер
int y=500; // начальное смещение от края листа
for(int i=1;i<(number);i++)
{
strcpy(temp,""); // очистка переменных
m_ResultField="";
char k[4];
itoa(i,k,10);
strcat(temp,k);
strcat(temp," ");
strcat(temp,array[i]);
m_ResultField.Format("%s", temp); // формирование строки
int Lenght = m_ResultField.GetLength(); // определение её длины
PrintDC.TextOut(500, y, m_ResultField, Lenght); // вывод строки на принтер
y=y+200; // смещение (видимо в пикселях)))
}
if (PrintDC.EndPage()<0) AfxMessageBox("Error EndPage"); // конец страницы
if (PrintDC.EndDoc()==0) AfxMessageBox("Error EndDoc"); // конец документа
PrintDC.Detach(); // отсоединить контекст
}
cmncorp
Да не за что. Только я бы все-таки использовал GetDeviceCaps(). Универсальнее код получится. Потому что, если при выборе принтера, пользователь сменит в его свойствах, например, стандартные 600 dpi на 300 dpi, то
Цитата:
Да не за что. Только я бы все-таки использовал GetDeviceCaps(). Универсальнее код получится. Потому что, если при выборе принтера, пользователь сменит в его свойствах, например, стандартные 600 dpi на 300 dpi, то
Цитата:
y=y+200;даст в два раза большее расстояние между строками, что не есть хорошо.
Вопросик по среде студии 2005.
После установки, при первом запуске, прога спросила, какой язык будет использоваться по-умолчанию и теперь, при создании нового проекта - по умолчанию предлагает с++ - и настройка среды специфична для с++. Можно ли как-то поменять эти настройки не переустанавливая всю студию?
После установки, при первом запуске, прога спросила, какой язык будет использоваться по-умолчанию и теперь, при создании нового проекта - по умолчанию предлагает с++ - и настройка среды специфична для с++. Можно ли как-то поменять эти настройки не переустанавливая всю студию?
По-моему всё-таки при создании нового проекта предлагается тот тип, который использовался последним.
А раскладки клавиатуры можно поменять в Tools->Options->Keyboard
А раскладки клавиатуры можно поменять в Tools->Options->Keyboard
За раскладки спасибо
А насчет остального - ситуация не меняется. Какой проект не создаешь - все время предлагаетмя с++, а прочие языки в разделе Others languages... Плюс еще ко всему внешний вид студии похож на 6-ю (хотя не это главное)
В общем, если кто знает как менять эти дефолты, не переустанавливая студию, буду благодарен за информацию
А насчет остального - ситуация не меняется. Какой проект не создаешь - все время предлагаетмя с++, а прочие языки в разделе Others languages... Плюс еще ко всему внешний вид студии похож на 6-ю (хотя не это главное)
В общем, если кто знает как менять эти дефолты, не переустанавливая студию, буду благодарен за информацию
Господа, помогите решить такую проблему :
Необходимо найти и вывести на экран максимальный размер pagefile.sys (файла подкачки), это значение хранится в реестре...Какая функция в MFC позволяет извлечь значение из реестра, если таковая есть? Если нет - то какая в WinApi?
Значение размера pagefile.sys лежит в :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management и состоит из пути к файлу и непосредственно размера
Необходимо найти и вывести на экран максимальный размер pagefile.sys (файла подкачки), это значение хранится в реестре...Какая функция в MFC позволяет извлечь значение из реестра, если таковая есть? Если нет - то какая в WinApi?
Значение размера pagefile.sys лежит в :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management и состоит из пути к файлу и непосредственно размера
RegCreateKey/RegQueryValueEx...
За реестр спасибо, тепер новый вопрос :
Хочу написать оптимизатор оперативной памяти, а для этого нужно знать - что можно безболезненно удалять из ОП и какими функциями это делать?
Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..
Хочу написать оптимизатор оперативной памяти, а для этого нужно знать - что можно безболезненно удалять из ОП и какими функциями это делать?
Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..
Цитата:
Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..
Гыгы. Отгребаешь своей прогой всю память - винда все остальное свопит на винт. Заканчиваешь работу, и она после этого потихоньку выгребает то, что надо из свопа.
А если серьезно - в реестре ставится отметка про выгрузку неиспользуемых библиотек. все остальная оптимизация памяти - очковтирательство.
Здравствуйте. Такая проблема: нужно прочитать большой XML файл (8 МБ). Использую MSXML DOM (знаю, что надо было SAX, но уже поздно). Выполняется ну ОООЧЕНЬ медленно (>20 мин). Причём сам обход дерева довольно быстро, тормозит обращение к членам IXMLDOMNodePtr и их использование. Подскажите, пожалуйста, где баг, если он есть.
gorthaur
Я работал с 20-мб файлом на машине с 1ГБ оперативки, Pentium D - структура докумета достаточно сложная - загрузка в DOM-документ происходила за 1-2 минуты, обход дерева - достаточно быстро (секунды)...
Если загрузка не беспокоит, думаю следует обратить внимание на сопутствующие действия (т.е. как обрабатываются ветки)...
А еще лучше привести кусок упрощенного кода и приблизительную структуру XML с указанием где именно тормозит
Скорее всего, пока подготовишь такую информацию - сам разберешься в чем проблема
Я работал с 20-мб файлом на машине с 1ГБ оперативки, Pentium D - структура докумета достаточно сложная - загрузка в DOM-документ происходила за 1-2 минуты, обход дерева - достаточно быстро (секунды)...
Если загрузка не беспокоит, думаю следует обратить внимание на сопутствующие действия (т.е. как обрабатываются ветки)...
А еще лучше привести кусок упрощенного кода и приблизительную структуру XML с указанием где именно тормозит
Скорее всего, пока подготовишь такую информацию - сам разберешься в чем проблема
Код: void ParseElem(MSXML2::IXMLDOMNodePtr nptr,string &str) {
if (nptr) {
if (nptr->nodeType == 1) {
string name((char*)(nptr->nodeName));
string text((char*)(nptr->text));
if (name == "HW") {
//Что-то делаем с текстом
}
else if (name == "EB"){
//таких else if ещё штук 10, все простые
else {
cout << "Unknown tag: <" << name << ">! Would you like to continue? [y/n] ";
char ch;
cin >> ch;
if ((ch == 'y') || (ch == 'Y'))
cout << "OK" << endl;
else
throw(0);
}
}
ParseElem(nptr->firstChild,str);
ParseElem(nptr->nextSibling,str);
}
}
void ParseFile(MSXML2::IXMLDOMNodePtr dct) {
string str;
MSXML2::IXMLDOMNodePtr nptr;
MSXML2::IXMLDOMNodeListPtr nlistptr = dct->childNodes;
nlistptr->reset();
long l = nlistptr->length;
for (int i = 0; i < l; i++) {
nptr = nlistptr->nextNode();
ParseElem(nptr->firstChild,str);
if (!(i%100)) {
cout << i << " elems" << endl;
}
}
}
Ну а если оставить "ИФЫ" но закомментировать все что внутри них, т.е. закомментировать это:
Код: //Что-то делаем с текстом
Код: //Что-то делаем с текстом
Да
А релиз тормозит также, как дебуг? А о знаем мы, как выглядит STL без оптимизации... Кто такой этот string? И кстати, что там делает throw(0)??
Релиз так же. string - STL'евски стринг. Пробовал без него, та же фигня. throw(0) там находится;) Можно убрать
Добавлено:
Как я понимаю, тормоза идут в момент обращения к членам IXMLDOMNodePtr. Или во время преобразования _bstr_t -> char*. Но вот как с этим всем удовольствием бороться...
Некоторое время назад прога вообще начала вылетать с Microsoft C++ exception: _com_error at memory location 0x0440f978.. где-то на 3000 записей Я вообще фигею. Или я идиот, или одно из двух
Добавлено:
Как я понимаю, тормоза идут в момент обращения к членам IXMLDOMNodePtr. Или во время преобразования _bstr_t -> char*. Но вот как с этим всем удовольствием бороться...
Некоторое время назад прога вообще начала вылетать с Microsoft C++ exception: _com_error at memory location 0x0440f978.. где-то на 3000 записей Я вообще фигею. Или я идиот, или одно из двух
Вот поэтому я и предпочитаю (и всем советую) никогда не использовать using namespace std, а явно писать std:: везде, где это надо. Сразу видно - где стандартное, а где нет.
Тогда рабочая гипотеза: если закоментарить ифы, то функция становится маленькой и простой, поэтому компилятор её инлайнит. Следовательно отсутствуют вызовы ParseElem() и, как следствие, передача параметров по значению - кто такой MSXML2::IXMLDOMNodePtr не знаю, возможно что и класс конструктором копии - а также разворачивается цикл. А маленькой она становится потому, что иначе она большая - ведь в каждом ифе string сравнивается с char*, длину которого ещё надо подсчитать. Замени их на static const string-и. Да и не факт, что ты извлекаешь все преимущества работы со string-ом в плане эффективного использования его потенциала производительности - не видно, что там за русскими комментами скрывается.
Тогда рабочая гипотеза: если закоментарить ифы, то функция становится маленькой и простой, поэтому компилятор её инлайнит. Следовательно отсутствуют вызовы ParseElem() и, как следствие, передача параметров по значению - кто такой MSXML2::IXMLDOMNodePtr не знаю, возможно что и класс конструктором копии - а также разворачивается цикл. А маленькой она становится потому, что иначе она большая - ведь в каждом ифе string сравнивается с char*, длину которого ещё надо подсчитать. Замени их на static const string-и. Да и не факт, что ты извлекаешь все преимущества работы со string-ом в плане эффективного использования его потенциала производительности - не видно, что там за русскими комментами скрывается.
gorthaur
Попробуй наоборот: преобразовывать char* в _bstr_t.
Без учета того, что происходит в ИФАХ - получается намного быстрее
Код:
..
if (_bstr_t("tag1") == _bstr_t(nptr->nodeName, false)){
//обрабатываем tag1
};
...
Попробуй наоборот: преобразовывать char* в _bstr_t.
Без учета того, что происходит в ИФАХ - получается намного быстрее
Код:
..
if (_bstr_t("tag1") == _bstr_t(nptr->nodeName, false)){
//обрабатываем tag1
};
...
Цитата:
Попробуй наоборот: преобразовывать char* в _bstr_t.
Без учета того, что происходит в ИФАХ - получается намного быстрее
Пробовал.
Чего я уже только не пробовал Мистика, блин
Добавлено:
В ИФАХ не происходит ничего особенного. Данные nptr->text пишутся в строку str в определённом формате.
gorthaur
Может тогда стоит попробовать выбирать данные при помощи XPath?
Может тогда стоит попробовать выбирать данные при помощи XPath?
Жалко всё переделывать. Прога работает, работает правильно. На небольших файлах. Да и просто уже спортивный интерес, где этот долбаный косяк
Я провел некоторые эксперименты - и они показали, что с ростом размера исходного файла XML время обработки (в частности конвертации _bstr_t в std::string) растет нелинейно. Т.е. при простом цикле вида
Код: [no]
0 //using XPath
1 MSXML2::IXMLDOMNodeListPtr nlistptr = Document->selectNodes(_bstr_t(L"/root/element/*"));
2 long l = (nlistptr->length > 2000 ? 2000 : nlistptr->length);
3 for (int i = 0; i < nlistptr->length; i++) {
4 node = nlistptr->item;
5
6 string name((char*)node->nodeName);
7 string value((char*)node->text);
8 //...
10 }
[/no]
Код: [no]
0 //using XPath
1 MSXML2::IXMLDOMNodeListPtr nlistptr = Document->selectNodes(_bstr_t(L"/root/element/*"));
2 long l = (nlistptr->length > 2000 ? 2000 : nlistptr->length);
3 for (int i = 0; i < nlistptr->length; i++) {
4 node = nlistptr->item;
5
6 string name((char*)node->nodeName);
7 string value((char*)node->text);
8 //...
10 }
[/no]
Жаль. Но всё равно спасибо за помощь. А нет мыслей, как это можно исправить с минимальными потерями (т.е. не переделывать всё заново через SAX или ещё как-нибудь)?
Добавлено:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName. Преобразование _bstr_t -> char*, по идее, от размера файла зависеть не должно. Но тогда совсем грустно, т.к. исправить, скорее всего, нереально. За то время, что я потратил на поиск и попытки исправления этой утечки, можно было написать собственный простенький парсер и не таскать msxml
Добавлено:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName. Преобразование _bstr_t -> char*, по идее, от размера файла зависеть не должно. Но тогда совсем грустно, т.к. исправить, скорее всего, нереально. За то время, что я потратил на поиск и попытки исправления этой утечки, можно было написать собственный простенький парсер и не таскать msxml
Предыдущая тема: MSAgent - как получить указатель на MS Balloon?
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.