Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как лучше перекомпилить код из console v MFC


Автор: XSonicX 22.12.2008, 14:45
Всем добрый вечер.
До настоящего момента писал console приложения для Виндовса, теперь перешел на MFC.
Столкнулся с морем проблем, на одну из которых я не нашёл ответа.
1)Имеется код для консоли:(выводит значение дискриминанта, попутно выводя на экран промежуточные значения)
Код

ac4 < 0 ? cout << "D = " << (b*b) << "+" << - (4*a*c) << " = " << (b*b)-(4*a*c) << " (" << sqrt(d) << ") \n" : cout << "D = " << (b*b) << "-" <<  (4*a*c) << " = " << (b*b)-(4*a*c) << " (" << sqrt(d) << ") \n";

Мои познания в MFC пока довольно малы, и пока что, для единственного способа, которым можно сделать тоже самое, но в MFC понадобится целая куча разных переменных и боксов типа Static Text 
для каждого значения, чередуя их тип от CString до double...

2) вот у мну есть три Text edit после ввода в последнюю и нажатия энтер на настоящий момент моя прога закрывается, я хотел спросить как сделать так, что бы при нажатии на энтер прога как бы нажимала на опред. кнопку и выполняла ее действие?

3) у меня есть много статик текста,  я хочу что бы при нажатии на одну копку все эти окна скрывались, а при нажатии на другую появлялись, как мне это притворить в жизнь?


Я уверен, что есть более целесообразный способ, как решить эту проблемму и надеюсь на вашу помощь, спасибо)

Автор: dizzy1984 22.12.2008, 16:28
1. Ну смотря что ты хочешь сделать, для вывода как в консоли можно, например, использовать Edit Control  с флагом Multiline. Для каждого неизвестного, конечно, нужно отдельное поле для ввода.
2. Я использовал решение из http://www.codeproject.com/KB/dialog/DisableReturnEsc.aspx и у меня работало.
3. Ты можешь записать идентификаторы статиков в массив и ходить по нему в обеих функциях.

Автор: XSonicX 23.12.2008, 00:43
1 вобщем нет никакого универсального типа переменной, что бы можно было выводить текст и переменные в одной строке? ну типа "a=" a "b=" b ; ?

2 объясните пожалста поподробнее) я могу сделать например что бы при потере фокуса с третьего эдит бокса запускалась кнопка, но нужно тоже самое, тока по нажатию на энтер в томже боксе

3 есть у мну большой кусок статик текста, который закрывает то, что я пока не хочу показывать, у него тип CString control (может быть надо другой) название переменной ekran , сейчас она видима, т.е все что я хочу скрыть скрывается, но если я хочу допустим при нажатии на кнопку скрыть этот элемент и показать необходимый текст мод ним, как мне добраться до свойства behavior, visible этого элемента и изменить true na false ?

спасибо зарание) сейчасс уточнил вопрос,вроде бы очень легко,  но одному не разгрести (

Автор: voov 23.12.2008, 12:02
1. Есть класс CString, а у него есть метод Format. + есть мсдн

2. Не совсем понятно, что должно получиться и зачем такое нужно. Потому неясно, что лучше посоветовать. Если это поможет, то у кнопки есть свойство DefaultButton. На диалоге может быть только одна кнопка с установленым свойством DefaultButton. При нажатии Enter на диалоге срабатывает эта кнопка.

3. Любой контол является в первую очередь окном (CWnd), а у окна есть метод ShowWindow(int nCmdShow). + мсдн

Автор: XSonicX 24.12.2008, 14:38
voov, спасибо большое, 2 и 3 получилось smile) сейчас мучаюсь с 1, надеюсь добью его поскорее)

Автор: dizzy1984 24.12.2008, 15:27
Как на счет
Код

#include <sstream> 

//...
std::stringstream ss; 
double b=1,a=2,c=3,d=4; 
ss << "D = " << (b*b) << "+" << - (4*a*c) << " = " << (b*b)-(4*a*c) << " 
(" << ") \n"; 
MessageBox( ss.str().c_str() );

Автор: XSonicX 24.12.2008, 16:50
все спасибо большое еще раз, со всем справился ))
осталась одна проблемка, есть у мну Static text у него переменная c_d типа control, как можно изменить в нем программно значение border с false na true? 
вообще, что бы закрепить и больше не спрашивать, как можно добираться до этих значений? enable, border, default button, color и т.д(кароч все которые в свойствах элемента) ? на счет border весь мсдн перерыл, нифига, есть тока на создание окна (
спасибо зарание) 

Автор: Earnest 24.12.2008, 17:07
Цитата(XSonicX @  24.12.2008,  17:50 Найти цитируемый пост)
как можно добираться до этих значений? enable, border, default button, color 

Свойства, которые тебе визард показывает - это всего лишь оболочки.
В основном, это флаги стиля или расширенного стиля или и того и другого (border). Насчет цвета - не поняла, какой-такой цвет у статика в свойствах. Если ты имеешь в виду BLACKRECT и т.д. - это тоже стиль, а произвольного цвета нема. Можно через CTLCOLOR реализовать или через OwnerDraw или как-то еще, но это требует переопределения класса. 

Автор: XSonicX 24.12.2008, 19:32
все, и первое у меня тоже получилось smile спасибо большое)  сделал с помощью cstring.format(...)  smile 
dizzy1984, способ просто офигенный )) тока если бы можно было бы вывести это в поле не с помощью MessageBox, т.к он мне тут совершенно неуместен( это реально вообще?



Earnest, спасибо за ответ  smile про цвет я имел ввиду picture control, default button в св-вах button и т.д, вобщем вставить рамку программно нельзя?(
В таком случае как можно программно выделить static text (может быть цвет, жирность(я хотел рамкой  smile ) или подчеркнуть)?  smile 

Автор: Earnest 24.12.2008, 19:45
Можно - я уже написала - изменением стиля.
На MFC это будет так:
Код

// добавить простую рамку:
pWnd->ModifyStyle (0, WS_BORDER, SWP_FRAMECHANGED);
// убрать ее
pWnd->ModifyStyle (WS_BORDER, 0, SWP_FRAMECHANGED);

Вдавленность - это расширенные стили - см. символы WS_EX_... и функцию ModifyStyleEx
У каждого типа контрола, кроме общих (WS_), есть специализированные стили. Например, у статика это константы SS_... Короче смотри в MSDN.
Почти любой флаг можно добавить через изменение стилей. Но не все - некоторые как установлены при создании, так и будут. Дефолт баттон - это тоже стиль, но это лучше станавливать соответствующей функцией диалога, т.к. нужно снять это свойство с предыдущей Deafaul Button.

Автор: XSonicX 24.12.2008, 21:10
Earnest, аааа спасибо большоеее!!! smile  smile  smile 
и если можно, последний вопрос на сегодня  smile 
есть такая штучка
Код

formula2.Format(_T("(x+%.f)"),-(x2))


очень хочу узнать, что означет вот этот участок 
Код

%.f

я не знаю как это называется , но путем подбора втыкал, что эта штука управляет кол-ом знаков после запятой...
скажите пожалуйста, что это такое, какие они бывают и где можно их найти  smile 
А также самое главное, как сделать, чтобы оно не писало 4.0000(4.9000, 4.0500 и т.д) , если стоит определение %.4f, ну т.е отбрасывало последние нули, как это обычно делаем мы ?) smile 
огромное спасибо заранее ) smile 

Автор: voov 25.12.2008, 15:11
XSonicX, все описано в мсдн. строка формата как в printf

A format specification, which consists of optional and required fields, has the following form:
%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type

В случае, когда type = f :

 The precision value specifies the number of digits after the decimal point. If a decimal point appears, at least one digit appears before it. The value is rounded to the appropriate number of digits. 
 
Default precision is 6; if precision is 0, or if the period (.) appears without a number following it, no decimal point is printed.
 
т.е. так задается кол-во символов после запятой (последняя цыфра округляется). 
%.4f   - 4 знака
%f      - 6 знаков
%.f     - без десятичной точки (только целая часть)

нули средствами Format убрать нельзя, но так как это у нас строка, то можно сделать так
Код

formula2.Format(_T("x+%.4f"),-(x2))
formula2.Trim("0");


Автор: XSonicX 25.12.2008, 19:31
voov, спасибо, но к сожалению если знак, который необходимо убрать находится по средине строки(допустим в скобках) то он его не убирает( пришлось сравнивать с (int)и в зависимости от результата писать %.4f or %.f, но все равно спасибо) пока что вопросов нет, помечаю как решенный  smile 

Автор: Bukmop 26.12.2008, 14:53
Цитата(XSonicX @  24.12.2008,  22:10 Найти цитируемый пост)
А также самое главное, как сделать, чтобы оно не писало 4.0000(4.9000, 4.0500 и т.д) , если стоит определение %.4f, ну т.е отбрасывало последние нули, как это обычно делаем мы ?) 
Посмотри в сторону %g


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)