Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 518
от 30.05.2004, 18:00

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 1660
Отправлено ответов: 3312
Активность: 199.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

bocha
Статус: Доверительный
Общий рейтинг: 153.06
[Подробней >>]
CrackLab
Статус: Доверительный
Общий рейтинг: 139.2
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 109.29
[Подробней >>]
 
Gibbel
Статус: Профессиональный
Общий рейтинг: 105.39
URL: Savage Metal Club - жизнь в стиле рок-н-ролл
Телефон: +7 901 710 3146
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 1642. Уважаемые эксперты, подскажите, какие есть средства в C++, чтобы вывести файл с расширением txt на п... (ответов: 1)
Вопрос № 1643. Здраствуйте, уважаемые!! Как узнать адрес ф-кций? Пишу: void f1(){} void f2(){} void f3(){} int main... (ответов: 2)
Вопрос № 1644. Здравствуйте эксперты. У меня такой вопрос: При создании приложения на основе Document-View я создаю... (ответов: 2)
Вопрос № 1645. Здравствуйте эксперты. Я хочу создать на WinApi немодальное диалоговое окно, которое будет единствен... (ответов: 2)
Вопрос № 1646. Здравствуйте. Насчет вопроса №1645. Я внес небольшие изменения в код и программа стала корректно зав... (ответов: 1)
Вопрос № 1648. Здравствуйте эксперты. Я уже задавал вам вопрос по поводу Doc-View, спасибо отвтившим экспертам - bo... (ответов: 1)

Вопросов: 6, ответов: 9


 Вопрос № 1642

Уважаемые эксперты, подскажите, какие есть средства в C++, чтобы вывести файл с расширением txt на печать.



Вопрос отправлен: 26.05.2004, 22:01
Отправитель: Fedor

[Следующий вопрос >>] [Список вопросов]

Отвечает bocha

Доброе время суток, Fedor!
Средства для вывода на печать предоставляет ОС, уcтановленная на компьютере к которому подключен принтер. Расширение файла и его содержимое несколько разные вещи, для примитивной маскировки я могу текстовый файл записать с расширением .com, но он по прежнему останется текстовам, хотя если его запустить, система попытается его выполнить. Вывод текста на принтер в Windows:

#include
int main()
{
HANDLE hLPT = CreateFile("LPT1",GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE){
char buf[] = "Hello LPT1";
DWORD dw;
OVERLAPPED ov;
WriteFile( hLPT, buf, sizeof(buf), &dw, &ov);
CloseHandle( hLPT);
}else{
cout << "Error Open LPT" << endl;
return 1;
}
return 0;
}
Да, чуть не забыл, вконце в буфер еще нужно записать esc-последовательность <конец страницы>, чтобы печать началась немедленно, ее посмотри в документации к принтеру.

Ответ отправлен: 28.05.2004, 15:21
Отправитель: bocha


 Вопрос № 1643

Здраствуйте, уважаемые!!
Как узнать адрес ф-кций?
Пишу:
void f1(){}
void f2(){}
void f3(){}
int main(){
cout << "f1 = " << &f1 << " f2 = " << &f2 << " f3="<< &f3;
return 0;}
f1,f2,f3 - возвращают одно и тоже(004010000).



Вопрос отправлен: 26.05.2004, 22:35
Отправитель: qh

[Следующий вопрос >>] [Список вопросов]

Отвечает CrackLab

Приветствую Вас, qh!
У меня Turbo C++ не позволяет писать так как ты пишешь.
Вообще я в BCB написал так...
void *ptr1 = (void *)&f1;
void *ptr2 = (void *)&f2;
void *ptr3 = (void *)&f3;
int i1 = (int)ptr1;
int i2 = (int)ptr2;
int i3 = (int)ptr3;
Ну и все, в i1 - i3 адреса функций (разные)

Ответ отправлен: 28.05.2004, 19:23
Отправитель: CrackLab


Отвечает vitya

Здравствуйте, qh!
предлагаю вам написать содержание функций. Скорее всего компилятор генерит одинаковые заглушки для пустых функций.
Крме того f == &f для функций, то есть она и есть свой адрес.

Ответ отправлен: 27.05.2004, 08:55
Отправитель: vitya


 Вопрос № 1644

Здравствуйте эксперты.
У меня такой вопрос:
При создании приложения на основе Document-View я создаю в классе MainFrame сплиттер,
и уже в сплиттере я создаю представления(т.е. View-производные), но это, как я считаю,
искусственный метод, т.к. теряется связь с CDocument. Как создавать предствления
обычным методом, т.е. как стандортное CMyView, которое генерит App-Wizard, т.е. чтобы
каждое View(представление) имело возможность получить указатель на документ(::GetDocument())?
И еще может кто подскажет линки по этой теме, буду благодарен.
Заранее спасибо
Иван Абрамовский.



Вопрос отправлен: 26.05.2004, 23:52
Отправитель: Иван Абрамовский (abhome@atnet.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, Иван Абрамовский!
Все view, если созданы с помощью метода CreateView из сплиттера будут иметь доступ к документы. А проблема в том, что это не ::GetDocument(), а просто GetDocument() /this->GetDocument();

Ответ отправлен: 27.05.2004, 08:52
Отправитель: vitya


Отвечает bocha

Добрый день, Иван Абрамовский!
Ничего искусственного в этом нет. Документ один, а представлений -много. Если у каждого представления будет свой указатель на документ, то в один прекрасный момент, одно представление изменит местоположение документа, а второе ссылась на недействительную область памяти вызовет какую-нибуть его функцию.
Для того, чтобы получить указатель на документ, добавьте в новый вид функцию, точно такую же как и впервом виде, который создается по умолчанию.

CMyDoc* CMyView2::GetDocument(){
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
Включите заголовочный файл документа везде, где объявляете вид, до включения заголовочного файла вида.В функции OnDraw нового вида измените CDocument*pDoc=GetDocument(); на CMyDoc*pDoc=GetDocumen();
В MainFrame::OnCreateClient() в создайте эти виды:

#include
#include
#include
CMainFrame::OnCreateClient() {
m_wndSplitter.CreateStatic(this, 2, 1);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView1), CSize(100,100), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyView2), CSize(100,100), pContext);
return TRUE;
}

И никакой потери связи с документом.


Ответ отправлен: 27.05.2004, 06:37
Отправитель: bocha


 Вопрос № 1645

Здравствуйте эксперты.
Я хочу создать на WinApi немодальное диалоговое окно, которое будет единственным отображаемым окном на экране. Проблема заключается в том, что я не могу закрыть приложение через немодальное окно с помощью вызова функции SendMessage:
//...
if(LOWORD(wParam) == IDOK) {
hwndParent = GetParent(hwndDlg);
SendMessage(hwndParent, WM_DESTROY, 0, 0);
return TRUE;
}
//...
Буду очень благодарен, если вы поможете преодолеть эту проблему!
В приложении указан код.


Приложение:


Вопрос отправлен: 27.05.2004, 08:39
Отправитель: Alexandr

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Приветствую Вас, Alexandr!
1. грубый вариант - ExitProcess()/exit()
2. попробуйте посылать WM_QUIT, а не WM_DESTROY.

Ответ отправлен: 27.05.2004, 08:48
Отправитель: vitya


Отвечает Gibbel

Здравствуйте, Alexandr!
А почему бы вам не вызывать PostQuitMessage из диалогового окна???

Ответ отправлен: 27.05.2004, 12:25
Отправитель: Gibbel


 Вопрос № 1646

Здравствуйте.
Насчет вопроса №1645. Я внес небольшие изменения в код и программа стала корректно завершатся, т.е. немодальное диалоговое окно посылает сообщение WM_DESTROY оконной процедуре, что приводит к завершению работы приложения. В программе я сделал такие изменения: сделал переменную hWnd глобальной, функция SendMessage теперь выглядит так:
if(LOWORD(wParam) == IDOK) {
hwndParent = GetParent(hwndDlg);
SendMessage(hWnd, WM_DESTROY, wParam, lParam);
return TRUE;
}
Почему не работает функция GetParent и стало быть возвращает непонятно какой описатель! Оставлять код с глобальной hWnd мне совесть не позволяет:), потому по прежнему рассчитываю на вашу помошь!!


Приложение:


Вопрос отправлен: 27.05.2004, 12:54
Отправитель: Alexandr

[Следующий вопрос >>] [Список вопросов]

Отвечает bocha

Доброе время суток, Alexandr!
Непонятно как она может корректно завершаться, если Вы не показываете ни одного окна (шоу где?), в т.ч. и диалога. Кстати, насколько я помню дочерние окна скрытого окна т.ж. являются скрытыми, т.о. показываться диалог будет только в том случае, если не будет являтся дочерним по отношению к основному.

Ответ отправлен: 28.05.2004, 12:09
Отправитель: bocha


 Вопрос № 1648

Здравствуйте эксперты.
Я уже задавал вам вопрос по поводу Doc-View, спасибо отвтившим экспертам - bocha и vitya. Но остался еще один не выясненный момент: как получать указатль на виды (CMyView1, CMyView2 ...) из CMyDocument? Неужели через CMainFrame, т.е. следующим образом :
BOOL CMyDoc::OnNewDocument()
{
CMainFrame* pFrm = (CMainFrame*)(AfxGetApp()->GetMainWnd());
CMyView1 * pView1 = (CMyView1*) pFrm->m_wndSplitter.GetPane(0,0);
CMyView2 * pView2 = (CMyView2*) pFrm->m_wndSplitter.GetPane(0,1);
}
Заранее спасибо,
Абрамовский Иван.




Вопрос отправлен: 27.05.2004, 17:34
Отправитель: Иван Абрамовский (abhome@atnet.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает bocha

Доброе время суток, Иван Абрамовский!
А вот из документа в виды загдядывать не стоит. При создании нового документа, приложение вызывает ф-ю OnInitialUpdate вида. Если в каком-то из представлений изменили документ, то из него нужно вызывать GetDocument()->UpdateAllViews(this); При вызове этой функции вызываются функции всех видов OnUpdate(), кроме указанного в параметре (он сам должен знать, что обновляется),этот параметр можно установить равным NULL, обновятся все виды. У функции есть еще два параметра, в них можно указать, например какую часть документа обновили. Архитектура документ-вид для того и создана, чтобы отделить данные от их представления и несанкционированого изменения. Документ должен предоставлять функции передачи данных, а изменять их должен сам. Вид же должен позабоотится о получении данных, их отображении, и вслучае изменения - полать сообщение документу.
Так что перепишите свою функцию на что-нибуть вроде:

BOOL CMyDoc::OnNewDocument(){
MyData.Clear();//эта ф-я целиком и полностью ваша
//или так
delete[] pMyData;
pMyData = new CMyData;
UpdateAllViews(NULL);
}
При правильной организации взаимодействия документ-вид, указатели на виды в документе не нужны.


Ответ отправлен: 27.05.2004, 21:20
Отправитель: bocha



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (21)
C / C++ (15)
Perl (1)
Builder / Delphi (17)
Pascal (20)
Basic / VBA (2)
Java / JavaScript (4)
PHP (12)
Криптография (6)
WinAPI (8)
Радиоэлектроника (10)
Пользователю
Windows 95/98/Me (35)
Windows NT/2000/XP (49)
"Железо" (30)
Поиск информации (16)
Администратору
Windows NT/2000/XP (20)
Linux / Unix (7)
Юристу
Гражданское право (11)
Семейное право (9)
Трудовое право (10)
КоАП (7)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное