Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Первый шажок... что ли  (Прочитано 54225 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« : 18-05-2007 21:56 » 

В общем порыскал в недрах рульных поисковиков и откопал еще сокровище. в стиле MFC первые шаги. Примеры как-то не пому чем компилили... Все они подписаны 2001 годом. а вопрос такой. вот, так сказать "Hello world" из этой книжки. (слава Богу первая книга с однофайловым нормальным примером, где все не выглядит таким уж страшным)
Код:
//Step1.cpp
#include "afxwin.h"
class CMainWnd : public CFrameWnd
{
public:
CMainWnd(); // Конструктор по умолчанию
};

CMainWnd::CMainWnd()
{
Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,NULL); // Создать окно программы
}

class CMyApp : public CWinApp
{
public:
CMyApp(); //конструктор по умолчанию
virtual BOOL InitInstance();//стандартная инициализация
};

CMyApp::CMyApp() // конструктор главного класса приложения
{}

BOOL CMyApp::InitInstance() // стандартная инициализация
{
m_pMainWnd=new CMainWnd(); // создать класс окна
ASSERT(m_pMainWnd); // проверить его правильность
m_pMainWnd->ShowWindow(SW_SHOW);// Показать окно
m_pMainWnd->UpdateWindow(); // Обновить окно
return TRUE; // Вернуть что все нормально
};

CMyApp theApp;


так вот не компилиццо.Встает на вот этой строке
Код:
	Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,NULL);

с сообщением компилятора "Error   1   error C2664: 'CFrameWnd::Create' : cannot convert parameter 2 from 'const char [6]' to 'LPCTSTR' "
что я лично понимаю как "невозможно конвертировать параметр номер 2 ("Step1") в "LPCTSTR" (что мне на данный момент известно как  "32-битный указатель на константную строку символов, которая переносима в Unicode и DBCS")
Как я понимаю в аргументах функции должен быть указатель, а не константа... Хм. Тупо заменяю "Step1" на 0 - работает, ну естественно без заголовка. вопрос такой какие конкретно тут нужны изменения  чтобы заголовок все же был? как правильно Обратиться к ф-ции Create(), чтоб ее поняла VisualStudio2005?
Аналогии с данным вами раньше примером рисовалки Pouring не смог... В общем если вопрос тупой - чикайте тему Улыбаюсь я пойму Улыбаюсь
« Последнее редактирование: 18-05-2007 22:00 от Taurus727 » Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-05-2007 22:33 » 

попробую Create(NULL,(LPCSTR)"Step1",WS_OVERLAPPEDWINDOW,rectDefault,
      NULL,NULL);

И посмотри в настройках проекта еще, поди юникод стоит по умолчанию. Смотреть надо в свойствах проекта. Не найдешь елси, то скажу где искать конкретнее.
Записан

ещё один вопрос ...
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 18-05-2007 22:50 » 

Шаги: сделал Create(NULL,(LPCSTR)"Step1",WS_OVERLAPPEDWINDOW,rectDefault,
      NULL,NULL); сразу откомпилилось без ошибок, но заголовок нечитаем. В настройках проекта действительно стоял Unicode, поставил Multi-Byte И все стало на свои места Улыбаюсь вот спасибо Улыбаюсь
Вопрос такой - (LPCSTR)"Step1" это необходимое изменение формы записи (то есть пример старый и несовместим с VS2005) или необязательное уточнение?
Записан
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-05-2007 22:53 » 

Ха! оказывается дело в кодировке и все. убрал выражение в скобках - все равно работает. вопрос пропал сам собой Улыбаюсь
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-05-2007 22:59 » 

Если  не юникод, то используй char смело. А вот, если юникод, то char уже естественно не подходит, потому как маловат. В char помещается 1 байт, а юникоду, если не ошибаюсь надо 2 байта на символ.
Записан

ещё один вопрос ...
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-05-2007 23:12 » new

На всякий случай. Вот тут этот источник по MFC и другим весчам, если кому понадобится www.firststeps.ru/
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-05-2007 23:14 » 

Очень известный ресурс. Думаю почти все его знают Улыбаюсь
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 19-05-2007 01:04 » 

Taurus727, для того чтобы не париться с подобными вещами существует макрос. Используй его всегда и будет счастье при любых компиляциях:

_T("Step1")

Очень известный ресурс. Думаю почти все его знают Улыбаюсь

Эт точно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 19-05-2007 08:06 » 

Ну все может и знают, конечно, а я сам ползал искал. Может и [:]|||[:] зато самодельный! Вот...
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 19-05-2007 09:06 » 

Улыбаюсь
Записан

ещё один вопрос ...
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 27-05-2007 14:05 » 

Чтоб не плодить темы задам вопрос тут. Делаю я классы от FrameWnd, WinApp, CDialog, CButton. Диалог мне возвращает по кнопке ОК 3 переменные. 2 чекбокса и одну строку CString. Ну с помощью DDX. Потом управление возвращается к процедуре обработки нажатия кнопки "диалог". Там я получаю эти переменные уже в классе эээ CMyButton... (edit=dlg.edit_field) и потом управление возвращается видимо в CMyWindow (тот который от CFrameWnd). Вопрос Улыбаюсь как мне тупо напечатать значения переменных в белом поле окна. Улыбаюсь черт надоело через отладчик смотреть как переменные меняются. Хочется визуальных результатов.
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #11 : 27-05-2007 18:17 » 

TextOut тебе поможет. Инструкцию для MFC смотри >тут<
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 27-05-2007 19:20 » 

Ух ты какая там беда... Хм. Надо как я понимаю эээ... Создать объект класса CDC, потом установить контекст вывода в нужное окно? Или нет? Блин где волшебные printf() и scanf().
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #13 : 27-05-2007 19:31 » 

Да нужно создать контекст ввода (DC) и уже затем в него отрисовывать. В свое время я делал на Дельфи чуть проше. Кидал на форму Memo и в нее уже добавлял нужные мне строки.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 27-05-2007 19:43 » 

Блин Жаль не могу понять как это сделать Жаль что за геморрой. Учишь язык. Хочешь на одном сосредоточиться, изучить, а надо знать все сразу и одновременно. Тупо вывести текст в экран геморрой Жаль мать его винда... Возвращаться нафиг в консольное программирование что ли Жаль
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 27-05-2007 20:17 » 

Taurus727, это нормально. В большинстве случаев один вопрос затрагивает другие. Конечно, соглашусь, что в винде не все гладко, но тут ведь как: или изучай, или не изучай.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 27-05-2007 20:23 » 

Как создать контекст? Чтобы вывод был в данное окно?
Ну вот делаем допустим объект CDC view; view.TextOut(.....) не дает результата. Вывода никуда не происходит.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 27-05-2007 20:32 » 

CreateDC, CreateCompatibleDC или PaintBegin. Найди эти ф-ии в MSDN - там рядом найдешь и другие родственные им.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 27-05-2007 20:35 » 

Вот в том дело что я их нашел. Уже полчаса как. Только видно ручки кривоваты...
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 28-05-2007 05:22 » 

Что не понятно? Там разве нет примеров?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 28-05-2007 06:07 » 

Taurus727, CDC (вернее CPaintDC) создаётся в OnPaint окна , там и рисуй
Записан

Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 28-05-2007 07:34 » 

Временно решил вопрос для себя через AfxMessageBox(....)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 28-05-2007 09:03 » 

Taurus727, тогда уж  (если окно есть, конечн) -
Код:
int CWnd::MessageBox(
   LPCTSTR lpszText,
   LPCTSTR lpszCaption = NULL,
   UINT nType = MB_OK
);
Записан

Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 28-05-2007 21:14 » 

Спасибо, ребята за подсказки Улыбаюсь  С подачи Алекса1153 все заработало Улыбаюсь

CMyWindow::OnPaint()
 {
   CPaintDC dc(this);
CString well="Hello!";
dc.TextOutA(0,0,well);}
вот и все Улыбаюсь стопор снят Улыбаюсь депрессуха на эту тему пропала Улыбаюсь продолжаю ковырять дальше Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #24 : 29-05-2007 08:51 » 

Самый простой способ сделать такую штуку в MFC проекте с Doc/View архитектурой след. Я взял для примера SDI.

В App классе в ф-ции InitInstance()

например

BOOL CMyEditApp::InitInstance()

находим нечто похожее

   CSingleDocTemplate* pDocTemplate;
   pDocTemplate = new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CMyEditDoc),
      RUNTIME_CLASS(CMainFrame),
      RUNTIME_CLASS(CMyEditView));
   AddDocTemplate(pDocTemplate);

заменяем основной View класс в темплейте на  CEditView

   CSingleDocTemplate* pDocTemplate;
   pDocTemplate = new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CMyEditDoc),
      RUNTIME_CLASS(CMainFrame),
      RUNTIME_CLASS(CEditView));
   AddDocTemplate(pDocTemplate);

Теперь в любом месте программы любым доступным способом отображение необходимого текста производится ф-ей SwtWindowText.

Например из CMainFrame можно сделать так

GetActiveView()->SetWindowText(_T("asdfjklghüpoajf"));

Преимущества:

 - этот текст можно копировать и редактировать (в отличии от OnPaint-ного варианта);

 - основной View класс остаётся без изменений;

 - появляется возможность легко программно выполнять стандарнтые операции с текстом: вставка, удаление, копирование в буфер обмена, использование отката - короче всё, что можно делать со стандартным элементом редакторным элементом.

 В этому случае получить доступ к контроллу можно так

((CEditView*)GetActiveView())->GetEditCtrl()

Если не поленться, то можно сделать небольшую ф-ю в App классе, с параметрами например очистки экрана, или вставки текста к уже существующему в начало или в конец. Ну и практически всё, на сколько фантазии хватит. Чтобы каждый раз не комментировать вызов ф-ции в режиме отладки лучше всего определить ключ

#define MYTRACEWND_IS_ON

...

   CSingleDocTemplate* pDocTemplate;
   pDocTemplate = new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CMyEditDoc),
      RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
#ifdef MYTRACEWND_IS_ON
      RUNTIME_CLASS(CEditView));
#else
      RUNTIME_CLASS(CMyEditView));
#endif
   AddDocTemplate(pDocTemplate);

...

#ifdef MYTRACEWND_IS_ON
      GetActiveView()->SetWindowText(_T("asdfjklghüpoajf"));
#endif

и тд думаю идея ясна
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 29-05-2007 09:19 » 

Ого. Попробую понять...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #26 : 29-05-2007 09:28 » 

Taurus727, начни с первой части - поменять вьюху. Ф-ю если попозжа времечко будет сделаем. Или начинай, а я подмогну если что. Это будет дёшево и сердито. Можно будет в след. проектах всегда использовать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 29-05-2007 10:07 » 

Хорошо. Только щас к несчастью пора двигать на работу, блин. Вечерком займусь.
Записан
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 04-06-2007 14:58 » 

Вопрос опять возник к вам, гуру Улыбаюсь в общем я пытаюсь передать из вызывающего класса окна CMainWnd: public CFrameWnd) в диалоговую панель (CDlg1: public CDialog) указатель на структуру данных (набор неких опций, которые этот диалог может изменять) и никак не выходит. Через карту сообщений (ON_COMMAND (VIEWDIALOG,DialogOptions тут параметры не принимает), а диалог создается через dlg.DoModal() ее переопределить тоже что-то не выходит чтоб она параметры принимала. Как быть? Или я все усложнил?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 04-06-2007 16:07 » 

Если ты в модальном диалоге, то как ты можешь что-то передавать из CMainWnd? Или ты из диалога пытаешься забрать? Или у тебя мультитредное приложение? Давай разьясняй. Покажи куски кода.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines