Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Закладки » Visual C++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

Открыть новую тему     Написать ответ в эту тему

dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
во всех тех примераз должна была быть строка DrawText/TextOut. вот туда свою строку и суй...

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 19:47 29-03-2007
cmncorp



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
строки не видел этой там, но уже сам догнал что куда,
спасибо за совет!

Всего записей: 14 | Зарегистр. 20-04-2006 | Отправлено: 21:09 29-03-2007
cmncorp



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
скажите, пожалуйста, как при выводе на принтер (в данном случае виртуальный Adobe - вывод происходит в файл pdf) сделать перевод строки
у меня вместо символов перевода отображаются квадратики
 
подскажите начинающему какие варианты перевода на новую строку существуют в природе

Всего записей: 14 | Зарегистр. 20-04-2006 | Отправлено: 18:15 30-03-2007
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
cmncorp
$0D$0A - в виндовс
$0D- применяются в досе, юниксе, маках. Какие где, не помню
$0A-применяются в досе, юниксе, маках. Какие где, не помню

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 18:31 30-03-2007
rain87



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
в юниксе $0A

Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено: 20:04 30-03-2007
cmncorp



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim

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

 
так сделать не получилось
 
пробовал сделать так:
1)  \r\n
2) \x0D\x0A
3) \0
 
в первых двух случаях (что одно и то же по сути) выводятся квадратики вместо перехода на новую строку
в 3 случае квадратики не выводятся, но и перехода не происходит

Всего записей: 14 | Зарегистр. 20-04-2006 | Отправлено: 20:13 30-03-2007
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;

 
Функции SetupFont/SetupPage:

Код:
HFONT SetupFont(HDC hdc)
{
 HFONT font;
 SetMapMode(hdc, MM_TEXT);
 if ((font = CreateFont(-MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72),
             0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
             OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
             DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
             "Courier New")) == NULL)
    err("CreateFont() failed\n");
 
 return font;
}
 
void SetupPage(HDC hdc, TEXTMETRIC *tm)
{
 WORD h_res, chars_per_line;
 
 char_height = tm->tmHeight + tm->tmExternalLeading;
 char_width = tm->tmAveCharWidth;
 lines_per_page = GetDeviceCaps(hdc, VERTRES) / char_height - 1;
 
 h_res = GetDeviceCaps(hdc, HORZRES);
 chars_per_line = h_res / char_width - 1;
 x_offset = (h_res - chars_per_line * char_width) >> 1;
}

 
Попробуй на основе этого.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:50 02-04-2007
cmncorp



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо огромное за информацию 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();                                                                // отсоединить контекст
}

Всего записей: 14 | Зарегистр. 20-04-2006 | Отправлено: 21:31 05-04-2007
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cmncorp
Да не за что. Только я бы все-таки использовал GetDeviceCaps(). Универсальнее код получится. Потому что, если при выборе принтера, пользователь сменит в его свойствах, например, стандартные 600 dpi на 300 dpi, то
Цитата:
y=y+200;
даст в два раза большее расстояние между строками, что не есть хорошо.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:57 06-04-2007 | Исправлено: f_serg, 08:59 06-04-2007
vsDev



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопросик по среде студии 2005.  
После установки, при первом запуске, прога спросила, какой язык будет использоваться по-умолчанию и теперь, при создании нового проекта - по умолчанию предлагает с++ - и настройка среды специфична для с++. Можно ли как-то поменять эти настройки не переустанавливая всю студию?

Всего записей: 11 | Зарегистр. 24-03-2007 | Отправлено: 00:50 23-04-2007
WreckInT3



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По-моему всё-таки при создании нового проекта предлагается тот тип, который использовался последним.
А раскладки клавиатуры можно поменять в Tools->Options->Keyboard

Всего записей: 355 | Зарегистр. 19-05-2006 | Отправлено: 00:13 24-04-2007
vsDev



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
За раскладки спасибо
А насчет остального - ситуация не меняется. Какой проект не создаешь - все время предлагаетмя с++, а прочие языки в разделе Others languages... Плюс еще ко всему внешний вид студии похож на 6-ю (хотя не это главное)
В общем, если кто знает как менять эти дефолты, не переустанавливая студию, буду благодарен за информацию

Всего записей: 11 | Зарегистр. 24-03-2007 | Отправлено: 22:57 25-04-2007
Ariets

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, помогите решить такую проблему :  
Необходимо найти и вывести на экран максимальный размер pagefile.sys (файла подкачки), это значение хранится в реестре...Какая функция в MFC позволяет извлечь значение из реестра, если таковая есть? Если нет - то какая в WinApi?
 
Значение размера pagefile.sys лежит в :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management и состоит из пути к файлу и непосредственно размера

Всего записей: 3 | Зарегистр. 25-04-2007 | Отправлено: 12:52 26-04-2007
dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RegCreateKey/RegQueryValueEx...

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 18:43 26-04-2007
Ariets

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
За реестр спасибо, тепер новый вопрос :
Хочу написать оптимизатор оперативной памяти, а для этого нужно знать - что можно безболезненно удалять из ОП и какими функциями это делать?
 
Вообще, если кто-то знает какие алгоритмы используются в уже существующих оптимизаторах - подскажите..

Всего записей: 3 | Зарегистр. 25-04-2007 | Отправлено: 12:43 27-04-2007
lexusatrb



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

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

Всего записей: 1 | Зарегистр. 07-05-2007 | Отправлено: 18:03 07-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Такая проблема: нужно прочитать большой XML файл (8 МБ). Использую MSXML DOM (знаю, что надо было SAX, но уже поздно). Выполняется ну ОООЧЕНЬ медленно (>20 мин). Причём сам обход дерева довольно быстро, тормозит обращение к членам IXMLDOMNodePtr и их использование. Подскажите, пожалуйста, где баг, если он есть.

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 18:24 08-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gorthaur
Я работал с 20-мб файлом на машине с 1ГБ оперативки, Pentium D - структура докумета достаточно сложная  - загрузка в DOM-документ происходила за 1-2 минуты, обход дерева - достаточно быстро (секунды)...
Если загрузка не беспокоит, думаю следует обратить внимание на сопутствующие действия (т.е. как обрабатываются ветки)...
А еще лучше привести кусок упрощенного кода и приблизительную структуру XML с указанием где именно тормозит
Скорее всего, пока подготовишь такую информацию - сам разберешься в чем проблема

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 18:35 08-05-2007 | Исправлено: vshersh, 18:42 08-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
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;
        }
    }
}

 
Структура файла довольно проста: несколько десятков тысяч статей, вложенность тегов неглубокая. Типа
<root>
<element> <tag1> text1 </tag1>.Порядка 10.<tagN> textN </tagN></element>
....Порядка 50000
<element> <tag1> text1 </tag1>...<tagN> textN </tagN></element>
</root>
 
Добавлено:
Тормоза в блоке if-ов, если их закомментить, то всё летает

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 18:55 08-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну а если оставить "ИФЫ" но закомментировать все что внутри них, т.е. закомментировать это:

Код:
//Что-то делаем с текстом

тоже тормозит?

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 19:17 08-05-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Закладки » Visual C++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru