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

» Visual C++

Автор: dyr farot
Дата сообщения: 29.03.2007 18:47
во всех тех примераз должна была быть строка DrawText/TextOut. вот туда свою строку и суй...
Автор: cmncorp
Дата сообщения: 29.03.2007 20:09
строки не видел этой там, но уже сам догнал что куда,
спасибо за совет!
Автор: cmncorp
Дата сообщения: 30.03.2007 17:15
скажите, пожалуйста, как при выводе на принтер (в данном случае виртуальный Adobe - вывод происходит в файл pdf) сделать перевод строки
у меня вместо символов перевода отображаются квадратики

подскажите начинающему какие варианты перевода на новую строку существуют в природе
Автор: OdesitVadim
Дата сообщения: 30.03.2007 17:31
cmncorp
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню
Автор: rain87
Дата сообщения: 30.03.2007 19:04
в юниксе $0A
Автор: cmncorp
Дата сообщения: 30.03.2007 19:13
OdesitVadim

Цитата:
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню


так сделать не получилось

пробовал сделать так:
1) \r\n
2) \x0D\x0A
3) \0

в первых двух случаях (что одно и то же по сути) выводятся квадратики вместо перехода на новую строку
в 3 случае квадратики не выводятся, но и перехода не происходит
Автор: f_serg
Дата сообщения: 02.04.2007 07:50
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;
Автор: cmncorp
Дата сообщения: 05.04.2007 20:31
Спасибо огромное за информацию 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();                                                         // отсоединить контекст
}
Автор: f_serg
Дата сообщения: 06.04.2007 07:57
cmncorp
Да не за что. Только я бы все-таки использовал GetDeviceCaps(). Универсальнее код получится. Потому что, если при выборе принтера, пользователь сменит в его свойствах, например, стандартные 600 dpi на 300 dpi, то
Цитата:
y=y+200;
даст в два раза большее расстояние между строками, что не есть хорошо.
Автор: vsDev
Дата сообщения: 22.04.2007 23:50
Вопросик по среде студии 2005.
После установки, при первом запуске, прога спросила, какой язык будет использоваться по-умолчанию и теперь, при создании нового проекта - по умолчанию предлагает с++ - и настройка среды специфична для с++. Можно ли как-то поменять эти настройки не переустанавливая всю студию?
Автор: WreckInT3
Дата сообщения: 23.04.2007 23:13
По-моему всё-таки при создании нового проекта предлагается тот тип, который использовался последним.
А раскладки клавиатуры можно поменять в Tools->Options->Keyboard
Автор: vsDev
Дата сообщения: 25.04.2007 21:57
За раскладки спасибо
А насчет остального - ситуация не меняется. Какой проект не создаешь - все время предлагаетмя с++, а прочие языки в разделе Others languages... Плюс еще ко всему внешний вид студии похож на 6-ю (хотя не это главное)
В общем, если кто знает как менять эти дефолты, не переустанавливая студию, буду благодарен за информацию
Автор: Ariets
Дата сообщения: 26.04.2007 11:52
Господа, помогите решить такую проблему :
Необходимо найти и вывести на экран максимальный размер pagefile.sys (файла подкачки), это значение хранится в реестре...Какая функция в MFC позволяет извлечь значение из реестра, если таковая есть? Если нет - то какая в WinApi?

Значение размера pagefile.sys лежит в :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management и состоит из пути к файлу и непосредственно размера
Автор: dyr farot
Дата сообщения: 26.04.2007 17:43
RegCreateKey/RegQueryValueEx...
Автор: Ariets
Дата сообщения: 27.04.2007 11:43
За реестр спасибо, тепер новый вопрос :
Хочу написать оптимизатор оперативной памяти, а для этого нужно знать - что можно безболезненно удалять из ОП и какими функциями это делать?

Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..
Автор: lexusatrb
Дата сообщения: 07.05.2007 17:03

Цитата:
Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..


Гыгы. Отгребаешь своей прогой всю память - винда все остальное свопит на винт. Заканчиваешь работу, и она после этого потихоньку выгребает то, что надо из свопа.

А если серьезно - в реестре ставится отметка про выгрузку неиспользуемых библиотек. все остальная оптимизация памяти - очковтирательство.
Автор: gorthaur
Дата сообщения: 08.05.2007 17:24
Здравствуйте. Такая проблема: нужно прочитать большой XML файл (8 МБ). Использую MSXML DOM (знаю, что надо было SAX, но уже поздно). Выполняется ну ОООЧЕНЬ медленно (>20 мин). Причём сам обход дерева довольно быстро, тормозит обращение к членам IXMLDOMNodePtr и их использование. Подскажите, пожалуйста, где баг, если он есть.
Автор: vshersh
Дата сообщения: 08.05.2007 17:35
gorthaur
Я работал с 20-мб файлом на машине с 1ГБ оперативки, Pentium D - структура докумета достаточно сложная - загрузка в DOM-документ происходила за 1-2 минуты, обход дерева - достаточно быстро (секунды)...
Если загрузка не беспокоит, думаю следует обратить внимание на сопутствующие действия (т.е. как обрабатываются ветки)...
А еще лучше привести кусок упрощенного кода и приблизительную структуру XML с указанием где именно тормозит
Скорее всего, пока подготовишь такую информацию - сам разберешься в чем проблема
Автор: gorthaur
Дата сообщения: 08.05.2007 17:55

Код: 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;
        }
    }
}
Автор: vshersh
Дата сообщения: 08.05.2007 18:17
Ну а если оставить "ИФЫ" но закомментировать все что внутри них, т.е. закомментировать это:

Код: //Что-то делаем с текстом
Автор: gorthaur
Дата сообщения: 08.05.2007 18:26
Да
Автор: Qraizer
Дата сообщения: 08.05.2007 19:56
А релиз тормозит также, как дебуг? А о знаем мы, как выглядит STL без оптимизации... Кто такой этот string? И кстати, что там делает throw(0)??
Автор: gorthaur
Дата сообщения: 08.05.2007 20:01
Релиз так же. string - STL'евски стринг. Пробовал без него, та же фигня. throw(0) там находится;) Можно убрать

Добавлено:
Как я понимаю, тормоза идут в момент обращения к членам IXMLDOMNodePtr. Или во время преобразования _bstr_t -> char*. Но вот как с этим всем удовольствием бороться...
Некоторое время назад прога вообще начала вылетать с Microsoft C++ exception: _com_error at memory location 0x0440f978.. где-то на 3000 записей Я вообще фигею. Или я идиот, или одно из двух
Автор: Qraizer
Дата сообщения: 08.05.2007 20:17
Вот поэтому я и предпочитаю (и всем советую) никогда не использовать using namespace std, а явно писать std:: везде, где это надо. Сразу видно - где стандартное, а где нет.
Тогда рабочая гипотеза: если закоментарить ифы, то функция становится маленькой и простой, поэтому компилятор её инлайнит. Следовательно отсутствуют вызовы ParseElem() и, как следствие, передача параметров по значению - кто такой MSXML2::IXMLDOMNodePtr не знаю, возможно что и класс конструктором копии - а также разворачивается цикл. А маленькой она становится потому, что иначе она большая - ведь в каждом ифе string сравнивается с char*, длину которого ещё надо подсчитать. Замени их на static const string-и. Да и не факт, что ты извлекаешь все преимущества работы со string-ом в плане эффективного использования его потенциала производительности - не видно, что там за русскими комментами скрывается.
Автор: vshersh
Дата сообщения: 08.05.2007 22:46
gorthaur
Попробуй наоборот: преобразовывать char* в _bstr_t.
Без учета того, что происходит в ИФАХ - получается намного быстрее

Код:
..
if (_bstr_t("tag1") == _bstr_t(nptr->nodeName, false)){
//обрабатываем tag1
};
...
Автор: gorthaur
Дата сообщения: 08.05.2007 23:02

Цитата:
Попробуй наоборот: преобразовывать char* в _bstr_t.
Без учета того, что происходит в ИФАХ - получается намного быстрее

Пробовал.
Чего я уже только не пробовал Мистика, блин

Добавлено:
В ИФАХ не происходит ничего особенного. Данные nptr->text пишутся в строку str в определённом формате.
Автор: vshersh
Дата сообщения: 08.05.2007 23:34
gorthaur
Может тогда стоит попробовать выбирать данные при помощи XPath?
Автор: gorthaur
Дата сообщения: 09.05.2007 21:58
Жалко всё переделывать. Прога работает, работает правильно. На небольших файлах. Да и просто уже спортивный интерес, где этот долбаный косяк
Автор: vshersh
Дата сообщения: 09.05.2007 22:26
Я провел некоторые эксперименты - и они показали, что с ростом размера исходного файла 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]
Автор: gorthaur
Дата сообщения: 10.05.2007 00:20
Жаль. Но всё равно спасибо за помощь. А нет мыслей, как это можно исправить с минимальными потерями (т.е. не переделывать всё заново через SAX или ещё как-нибудь)?

Добавлено:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName. Преобразование _bstr_t -> char*, по идее, от размера файла зависеть не должно. Но тогда совсем грустно, т.к. исправить, скорее всего, нереально. За то время, что я потратил на поиск и попытки исправления этой утечки, можно было написать собственный простенький парсер и не таскать msxml

Страницы: 123456789

Предыдущая тема: MSAgent - как получить указатель на MS Balloon?


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