Taurus727
|
|
« : 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
|
|
« Ответ #1 : 18-05-2007 22:33 » |
|
попробую Create(NULL,(LPCSTR)"Step1",WS_OVERLAPPEDWINDOW,rectDefault, NULL,NULL);
И посмотри в настройках проекта еще, поди юникод стоит по умолчанию. Смотреть надо в свойствах проекта. Не найдешь елси, то скажу где искать конкретнее.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Taurus727
|
|
« Ответ #2 : 18-05-2007 22:50 » |
|
Шаги: сделал Create(NULL,(LPCSTR)"Step1",WS_OVERLAPPEDWINDOW,rectDefault, NULL,NULL); сразу откомпилилось без ошибок, но заголовок нечитаем. В настройках проекта действительно стоял Unicode, поставил Multi-Byte И все стало на свои места вот спасибо Вопрос такой - (LPCSTR)"Step1" это необходимое изменение формы записи (то есть пример старый и несовместим с VS2005) или необязательное уточнение?
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #3 : 18-05-2007 22:53 » |
|
Ха! оказывается дело в кодировке и все. убрал выражение в скобках - все равно работает. вопрос пропал сам собой
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #4 : 18-05-2007 22:59 » |
|
Если не юникод, то используй char смело. А вот, если юникод, то char уже естественно не подходит, потому как маловат. В char помещается 1 байт, а юникоду, если не ошибаюсь надо 2 байта на символ.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Taurus727
|
|
« Ответ #5 : 18-05-2007 23:12 » |
|
На всякий случай. Вот тут этот источник по MFC и другим весчам, если кому понадобится www.firststeps.ru/
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #6 : 18-05-2007 23:14 » |
|
Очень известный ресурс. Думаю почти все его знают
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #8 : 19-05-2007 08:06 » |
|
Ну все может и знают, конечно, а я сам ползал искал. Может и [:]|||[:] зато самодельный! Вот...
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #9 : 19-05-2007 09:06 » |
|
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Taurus727
|
|
« Ответ #10 : 27-05-2007 14:05 » |
|
Чтоб не плодить темы задам вопрос тут. Делаю я классы от FrameWnd, WinApp, CDialog, CButton. Диалог мне возвращает по кнопке ОК 3 переменные. 2 чекбокса и одну строку CString. Ну с помощью DDX. Потом управление возвращается к процедуре обработки нажатия кнопки "диалог". Там я получаю эти переменные уже в классе эээ CMyButton... (edit=dlg.edit_field) и потом управление возвращается видимо в CMyWindow (тот который от CFrameWnd). Вопрос как мне тупо напечатать значения переменных в белом поле окна. черт надоело через отладчик смотреть как переменные меняются. Хочется визуальных результатов.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #11 : 27-05-2007 18:17 » |
|
TextOut тебе поможет. Инструкцию для MFC смотри > тут<
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Taurus727
|
|
« Ответ #12 : 27-05-2007 19:20 » |
|
Ух ты какая там беда... Хм. Надо как я понимаю эээ... Создать объект класса CDC, потом установить контекст вывода в нужное окно? Или нет? Блин где волшебные printf() и scanf().
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 27-05-2007 19:31 » |
|
Да нужно создать контекст ввода (DC) и уже затем в него отрисовывать. В свое время я делал на Дельфи чуть проше. Кидал на форму Memo и в нее уже добавлял нужные мне строки.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Taurus727
|
|
« Ответ #14 : 27-05-2007 19:43 » |
|
Блин не могу понять как это сделать что за геморрой. Учишь язык. Хочешь на одном сосредоточиться, изучить, а надо знать все сразу и одновременно. Тупо вывести текст в экран геморрой мать его винда... Возвращаться нафиг в консольное программирование что ли
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 27-05-2007 20:17 » |
|
Taurus727, это нормально. В большинстве случаев один вопрос затрагивает другие. Конечно, соглашусь, что в винде не все гладко, но тут ведь как: или изучай, или не изучай.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Taurus727
|
|
« Ответ #16 : 27-05-2007 20:23 » |
|
Как создать контекст? Чтобы вывод был в данное окно? Ну вот делаем допустим объект CDC view; view.TextOut(.....) не дает результата. Вывода никуда не происходит.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 27-05-2007 20:32 » |
|
CreateDC, CreateCompatibleDC или PaintBegin. Найди эти ф-ии в MSDN - там рядом найдешь и другие родственные им.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Taurus727
|
|
« Ответ #18 : 27-05-2007 20:35 » |
|
Вот в том дело что я их нашел. Уже полчаса как. Только видно ручки кривоваты...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #19 : 28-05-2007 05:22 » |
|
Что не понятно? Там разве нет примеров?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 28-05-2007 06:07 » |
|
Taurus727, CDC (вернее CPaintDC) создаётся в OnPaint окна , там и рисуй
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #21 : 28-05-2007 07:34 » |
|
Временно решил вопрос для себя через AfxMessageBox(....)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 28-05-2007 09:03 » |
|
Taurus727, тогда уж (если окно есть, конечн) - int CWnd::MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #23 : 28-05-2007 21:14 » |
|
Спасибо, ребята за подсказки С подачи Алекса1153 все заработало CMyWindow::OnPaint() { CPaintDC dc(this); CString well="Hello!"; dc.TextOutA(0,0,well);} вот и все стопор снят депрессуха на эту тему пропала продолжаю ковырять дальше
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #25 : 29-05-2007 09:19 » |
|
Ого. Попробую понять...
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #27 : 29-05-2007 10:07 » |
|
Хорошо. Только щас к несчастью пора двигать на работу, блин. Вечерком займусь.
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #28 : 04-06-2007 14:58 » |
|
Вопрос опять возник к вам, гуру в общем я пытаюсь передать из вызывающего класса окна CMainWnd: public CFrameWnd) в диалоговую панель (CDlg1: public CDialog) указатель на структуру данных (набор неких опций, которые этот диалог может изменять) и никак не выходит. Через карту сообщений (ON_COMMAND (VIEWDIALOG,DialogOptions тут параметры не принимает), а диалог создается через dlg.DoModal() ее переопределить тоже что-то не выходит чтоб она параметры принимала. Как быть? Или я все усложнил?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
|