Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод разноцветных букв

12K
10 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Здравствуйте!
Есть такой затык - требуется вывести на экран буквы в определенном месте определенного цвета. Есть ф-ии
WriteConsoleOutputCharacter
и
WriteConsoleOutputAttribute

Но требуется вывести на экран символ "нестандартного" цвета, т.е. не красный, синий, зеленый, а что нибудь вроде RGB(145,76,160). Как я понял, вышеперечисленные ф-ии не позволяют сделать этого.

Подскажите пожалуйста, какие ф-ии могут помочь в этом нелегком деле) или хотя бы в каком направлении мне копать

Заранее благодарен
3.7K
10 июля 2008 года
0nni
326 / / 24.06.2008
В консоли фиксированный набор цветов - 16 для текста и 8 для фона тут уж ничего не поделаешь :(
12K
10 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Тут просмотрел литературу и нашел решение - это ф-иb:

SetTextColor(HDC hdc, COLORREF color);
SetBkColor(HDC hdc, COLORREF color);

Всем спасибо, вопрос исчерпан)
3.7K
10 июля 2008 года
0nni
326 / / 24.06.2008
Вы как-то определитесь... вы работаете с GUI или с консолью:confused:
SetTextColor - не работает для консолей, даже не пытайтесь.
Воспользуетесь тогда RichEdit в сочетании с Edit, там вам и RGB и курсив будет
12K
11 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
2 0nni

Хм, ну я собирался действительно отказаться от конслои и использавать GUI.
А то за RichEdit такой (в консоли то); можно чуть подробне?
7.2K
11 июля 2008 года
polaroid
94 / / 05.07.2008
RichEdit это не в консоли. Это такой элемент управления GUI наподобие Edit, только с расширенными возможностями
12K
15 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Есть еще один затык по программированию окошек. Создал в VC проект Win32Api, написал код для создания окошка. Все хорошо.
У меня есть класс, этот класс должен уметь создавать окно. Только я вот никак не докумекаю, как вписать в файлы класса (.h/.cpp) этот функционал.
Что-то вроде:

Код:
BaseProject.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 и прочим шаманством?

Заранее благодарен
11
15 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
http://borland.xportal.ru/forum/viewtopic.php?t=17745&highlight=createwindow
а лучше не париться а использовать MFC, VCL и прочие GUI
3.7K
15 июля 2008 года
0nni
326 / / 24.06.2008
Цитата: Sholah_Weras

И вот надо, чтобы класс MegaClass мог создать окно и с ним работать. Как это связать с ф-ми WinMain, WindowProc и прочим шаманством?
Заранее благодарен


Есть два способа
1-й

 
Код:
wc : TWndClass
begin
wc.style         := CS_DBLCLKS;
  [COLOR="Red"]wc.lpfnWndProc   := @MyWindowProc;[/COLOR]//указатель на вашу оконную процедуру
  wc.hInstance     := hInstance;
  wc.lpszClassName := 'MyWindowClassName';
  RegisterClass(wc);


или присвоить уже после создания окна
 
Код:
wnd := CreateWindow('#32770', 'Title', WS_VISIBLE or WS_POPUP or WS_SYSMENU, 10, 10, 800, 600, 0, 0, HInstance, nil);
  [COLOR="Red"]SetWindowLong(wnd, GWL_WNDPROC, Integer(@MyWindowProc))[/COLOR];//Тот же указатель на функцию.

Класс окна #32770 один из предопределенных в windows (создается как CS_GLOBALCLASS и доступен ил луюого приложения).

Цитата: oxotnik333
http://borland.xportal.ru/forum/viewtopic.php?t=17745&highlight=createwindow
а лучше не париться а использовать MFC, VCL и прочие GUI


Змий искуситель :D. вариант хороший, но для начинающих, настоящих, если хочешь писать "чтобыбыстробыло" и САМ, то лучше с VCL слазить. Ну а если проект срочный, то заказчику принципе всеравно.

12K
15 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Наверное, я неправильно сформулировал вопрос. Поясню - насколько я понял программирование окошек - все происходит в ф-ии
int WINAPI WinMain {...}

создание окна, регистрация, обработка сообщений. Т.е. замечательная во всех отношениях функция.

Соотв, в моем классе должен быть какой-то аналог такой ф-ии, или как?
261
15 июля 2008 года
ahilles
1.5K / / 03.11.2005
классы в С++ и классы в Windows это совершенно разные вещи!!!
Класс окна создаётся с помощью функции RegisterClass(Ex)
P.S. почитай хоть немного литературы
12K
16 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
В общем, надо было что-то наподобие:

HWND mhWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_OUTPUT_DIALOG), NULL, (DLGPROC)OutputWndProc);

Окошко? Окошко :)
11
16 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: 0nni

Змий искуситель :D. вариант хороший, но для начинающих, настоящих, если хочешь писать "чтобыбыстробыло" и САМ, то лучше с VCL слазить. Ну а если проект срочный, то заказчику принципе всеравно.


Быстро это всмысле что бы окошки быстро по экрану бегали или быстро в разработке?
если 1-й вариант, то и вцл-ные окна шустро бегают (во всяком случае на современных компах)
если 2-й то быстрее чем на вцл-е окно создать со всякими контролами и назначить им обработчики событий, можно разве что в дотнете (а вообще это зависит от знаний ИДЕ).

87
16 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Можно сделать классовую обертку для окна, но, насколько я понимаю, все равно функция int WINAPI WinMain(...) останется. Ну может сократится к виду типа:

Код:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    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;
}

Все же остальные операции с окном будут методами соответствующего класса. С диалоговыми окнами я подобное делал.
12K
18 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Вижу, мои вопросы, не отличающиеся высоким уровнем сложности, вызывают массу споров, потому Show Must Go On (хотя, на самом деле, я не нашел топика - "у меня страшная ашипка, че делать и куда тыкать???!!!")

Итак, понеслась.
Я все балуюсь с классом-создающим-и-обрабатывающим-диалоговые-окошки. Требуется сделать нижеследующее:

1. Реализовать возможность выбора имени заголовка окна (Caption)
Код:
XXX  *xxx = new XXX("Best window");

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, или надо будет как-то вручную все делать?
3.7K
18 июля 2008 года
0nni
326 / / 24.06.2008
Начет SetWindowText попробуй использовать вместо string - ansichar (а вообще "проблема" известная).
А положение окна задается Функцией SetWindowPos(); (в том же wm_initdialog) В качестве последнего параметра Укажи SWP_NOSIZE - тогда вместо ширины и высоты можешь писать "0".
87
18 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Sholah_Weras

И вот не работает. Пишет, матюгаясь:
no suitable conversion function from "std::string" to "char" exists


SetWindowText(hWnd, dialogName.c_str());

Все ваши диалоговые окна будут использовать одну и ту же
bool CALLBACK XXX::OutputWndProc(...) ?

12K
19 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
2 All
Спасибо, коллеги, то что надо.

Цитата: Kogrom
SetWindowText(hWnd, dialogName.c_str());

Все ваши диалоговые окна будут использовать одну и ту же
bool CALLBACK XXX::OutputWndProc(...) ?



Да, есть такой неприятный момент. Сначала разберусь с основным функционалом класса, а потом постараюсь решить эту задачу. Правда как - не знаю :mad:

87
19 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Sholah_Weras
Да, есть такой неприятный момент. Сначала разберусь с основным функционалом класса, а потом постараюсь решить эту задачу. Правда как - не знаю :mad:



Теоретически, есть не менее 2 вариантов решения проблемы:

1. Делать для каждого диалогового окна свой класс, наследуемый от одного базового, в котором данная функция будет виртуальной.

2. Сделать эту функцию переходником, который будет вызывать нужную функцию по указателю на функцию. Тогда, эти функции можно будет создавать вне класса.

12K
20 июля 2008 года
Sholah_Weras
99 / / 04.12.2007
Я WinApi только начал изучать, потому вот так.

2 Kogrom
По поводу статичной ф-ии (да, она static). У меня все прекрасно работает: т.е. я создаю окошки, в них добавляю разный текст (в какое окно хочу, в такое и добавляю), закрываю окна в разном порядке, закрываю нормально приложение (никаких ошибок), и, все нормально.
Я не шибко пока разбираюсь, почему должна была быть ошибка или некорректная работа приложения. Так вот, почему?

И еще, поискал в нете и литературе на тему изменения размера окошка и диалоговых элементов в нем (а именно, IDC_LIST). Какие-то сташно жуткие и громоздкие способы предлагают. Разве нет способа проще?
87
21 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Sholah_Weras
По поводу статичной ф-ии (да, она static). У меня все прекрасно работает: т.е. я создаю окошки, в них добавляю разный текст (в какое окно хочу, в такое и добавляю), закрываю окна в разном порядке, закрываю нормально приложение (никаких ошибок), и, все нормально.
Я не шибко пока разбираюсь, почему должна была быть ошибка или некорректная работа приложения. Так вот, почему?


А где я говорил, что должна быть ошибка? Я намекал только на то, что диалоговые окна программы могут выполнять разные функции, содержать разные элементы управления. Поэтому функции обратного вызова у них могут быть разные. То есть одним классом для всех диалоговых окон обойтись трудно.

Цитата: Sholah_Weras
И еще, поискал в нете и литературе на тему изменения размера окошка и диалоговых элементов в нем (а именно, IDC_LIST). Какие-то сташно жуткие и громоздкие способы предлагают. Разве нет способа проще?


MoveWindow(...) подойдет?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог