Вывод разноцветных букв
Есть такой затык - требуется вывести на экран буквы в определенном месте определенного цвета. Есть ф-ии
WriteConsoleOutputCharacter
и
WriteConsoleOutputAttribute
Но требуется вывести на экран символ "нестандартного" цвета, т.е. не красный, синий, зеленый, а что нибудь вроде RGB(145,76,160). Как я понял, вышеперечисленные ф-ии не позволяют сделать этого.
Подскажите пожалуйста, какие ф-ии могут помочь в этом нелегком деле) или хотя бы в каком направлении мне копать
Заранее благодарен
SetTextColor(HDC hdc, COLORREF color);
SetBkColor(HDC hdc, COLORREF color);
Всем спасибо, вопрос исчерпан)
SetTextColor - не работает для консолей, даже не пытайтесь.
Воспользуетесь тогда RichEdit в сочетании с Edit, там вам и RGB и курсив будет
Хм, ну я собирался действительно отказаться от конслои и использавать GUI.
А то за RichEdit такой (в консоли то); можно чуть подробне?
У меня есть класс, этот класс должен уметь создавать окно. Только я вот никак не докумекаю, как вписать в файлы класса (.h/.cpp) этот функционал.
Что-то вроде:
int WINAPI WinMain (HINSTANCE hinstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//ля-ля-ля, тополя все тут хорошо
//создаем объект класса:
MegaClass *mc = new MegaClass();
}
//а тут сам класс находится
MegaClass.h
class MegaClass: public GigaClass
{
public:
MegaClass();
~MegaClass();
virtual void BestFunction(const string& tratata);
private:
string smthElse;
};
И вот надо, чтобы класс MegaClass мог создать окно и с ним работать. Как это связать с ф-ми WinMain, WindowProc и прочим шаманством?
Заранее благодарен
а лучше не париться а использовать MFC, VCL и прочие GUI
И вот надо, чтобы класс MegaClass мог создать окно и с ним работать. Как это связать с ф-ми WinMain, WindowProc и прочим шаманством?
Заранее благодарен
Есть два способа
1-й
begin
wc.style := CS_DBLCLKS;
[COLOR="Red"]wc.lpfnWndProc := @MyWindowProc;[/COLOR]//указатель на вашу оконную процедуру
wc.hInstance := hInstance;
wc.lpszClassName := 'MyWindowClassName';
RegisterClass(wc);
или присвоить уже после создания окна
[COLOR="Red"]SetWindowLong(wnd, GWL_WNDPROC, Integer(@MyWindowProc))[/COLOR];//Тот же указатель на функцию.
Класс окна #32770 один из предопределенных в windows (создается как CS_GLOBALCLASS и доступен ил луюого приложения).
а лучше не париться а использовать MFC, VCL и прочие GUI
Змий искуситель :D. вариант хороший, но для начинающих, настоящих, если хочешь писать "чтобыбыстробыло" и САМ, то лучше с VCL слазить. Ну а если проект срочный, то заказчику принципе всеравно.
int WINAPI WinMain {...}
создание окна, регистрация, обработка сообщений. Т.е. замечательная во всех отношениях функция.
Соотв, в моем классе должен быть какой-то аналог такой ф-ии, или как?
Класс окна создаётся с помощью функции RegisterClass(Ex)
P.S. почитай хоть немного литературы
HWND mhWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_OUTPUT_DIALOG), NULL, (DLGPROC)OutputWndProc);
Окошко? Окошко :)
Змий искуситель :D. вариант хороший, но для начинающих, настоящих, если хочешь писать "чтобыбыстробыло" и САМ, то лучше с VCL слазить. Ну а если проект срочный, то заказчику принципе всеравно.
Быстро это всмысле что бы окошки быстро по экрану бегали или быстро в разработке?
если 1-й вариант, то и вцл-ные окна шустро бегают (во всяком случае на современных компах)
если 2-й то быстрее чем на вцл-е окно создать со всякими контролами и назначить им обработчики событий, можно разве что в дотнете (а вообще это зависит от знаний ИДЕ).
{
myWnd mainWnd;
MSG Msg;
mainWnd.Init(hInstance);
while (GetMessage(&Msg,NULL,0,0))
{
if ((!IsWindow(mainWnd.gHwnd))||(!IsDialogMessage(mainWnd.gHwnd,&Msg)))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
return Msg.wParam;
}
Все же остальные операции с окном будут методами соответствующего класса. С диалоговыми окнами я подобное делал.
Итак, понеслась.
Я все балуюсь с классом-создающим-и-обрабатывающим-диалоговые-окошки. Требуется сделать нижеследующее:
1. Реализовать возможность выбора имени заголовка окна (Caption)
XXX.h
class XXX
{
//...
private:
//...
string dialogName;
//...
};
XXX.cpp
bool XXX::OutputWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
SetWindowText(hWnd, dialogName);
return TRUE;
}
}
}
И вот не работает. Пишет, матюгаясь:
no suitable conversion function from "std::string" to "char" exists
SetWindowText(hWnd, char(dialogName));
Я и массив char'ов пытался использовать - тоже все плохо. Понимаю, вопрос на грани фола, но в нете как-то не сложилось найти инфы пачку.
2. Т.к. объектов класса будет больше одного, то надо сделать так, чтобы окошки создавались не в одном месте => указывать координаты окошка => как это сделать (работа именно с Dialog)?
3. Для вывода информации в окошко использую IDC_EDIT. Есть ли у него свойство Align = AlClient, или надо будет как-то вручную все делать?
А положение окна задается Функцией SetWindowPos(); (в том же wm_initdialog) В качестве последнего параметра Укажи SWP_NOSIZE - тогда вместо ширины и высоты можешь писать "0".
И вот не работает. Пишет, матюгаясь:
no suitable conversion function from "std::string" to "char" exists
SetWindowText(hWnd, dialogName.c_str());
Все ваши диалоговые окна будут использовать одну и ту же
bool CALLBACK XXX::OutputWndProc(...) ?
Спасибо, коллеги, то что надо.
Все ваши диалоговые окна будут использовать одну и ту же
bool CALLBACK XXX::OutputWndProc(...) ?
Да, есть такой неприятный момент. Сначала разберусь с основным функционалом класса, а потом постараюсь решить эту задачу. Правда как - не знаю :mad:
Теоретически, есть не менее 2 вариантов решения проблемы:
1. Делать для каждого диалогового окна свой класс, наследуемый от одного базового, в котором данная функция будет виртуальной.
2. Сделать эту функцию переходником, который будет вызывать нужную функцию по указателю на функцию. Тогда, эти функции можно будет создавать вне класса.
2 Kogrom
По поводу статичной ф-ии (да, она static). У меня все прекрасно работает: т.е. я создаю окошки, в них добавляю разный текст (в какое окно хочу, в такое и добавляю), закрываю окна в разном порядке, закрываю нормально приложение (никаких ошибок), и, все нормально.
Я не шибко пока разбираюсь, почему должна была быть ошибка или некорректная работа приложения. Так вот, почему?
И еще, поискал в нете и литературе на тему изменения размера окошка и диалоговых элементов в нем (а именно, IDC_LIST). Какие-то сташно жуткие и громоздкие способы предлагают. Разве нет способа проще?
Я не шибко пока разбираюсь, почему должна была быть ошибка или некорректная работа приложения. Так вот, почему?
А где я говорил, что должна быть ошибка? Я намекал только на то, что диалоговые окна программы могут выполнять разные функции, содержать разные элементы управления. Поэтому функции обратного вызова у них могут быть разные. То есть одним классом для всех диалоговых окон обойтись трудно.
MoveWindow(...) подойдет?