Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: trupca
Дата сообщения: 13.08.2013 10:28
есть примерно такой код. его отлично хавает гцц, но не переваривает msvc10. чяднт? ругается на строку: struct foo<T>::bar foo<T>::operator[](int x). спрашивается а как ещё о можно разрешить доступ к struct bar из области видимости foo<t>?


Код: #include <iostream>

using namespace std;

template <typename T>
class foo {
public:
    struct bar {
        T br;    
    };

    struct bar operator[](int);
private:
    T * bor;
};

template <typename T>
struct foo<T>::bar foo<T>::operator[](int x) {
    struct Bar brrr;

    return brrr;
}

int main() {
    

    return 0;
}
Автор: ValidolX
Дата сообщения: 13.08.2013 18:47

Цитата:
ругается на строку: struct foo<T>::bar foo<T>::operator[](int x).


допустим, а текст ошибки можно?
Автор: panda3
Дата сообщения: 15.08.2013 09:04
trupca
Одно слово замени:

Код: template <typename T>
typename foo<T>::bar foo<T>::operator[](int x)
Автор: SaharKobrin
Дата сообщения: 29.08.2013 20:55
помогите пжл с мануалом, инструкцией, уроками, примерами с описанием по post get в С++ и post get на https страницу в С++.
Автор: georgbird
Дата сообщения: 07.09.2013 15:57
Доброго времени суток.
Я недавно начал изучать фреймворк QT и вот столкнулся с такой задачей - надо сформировать структуру из векторов, так, чтобы можно было обращаться к каждому по индексу. Векторы разного размера и количество их может быть разным. Нужно что-то типа безразмерного массива векторов. И я вот думаю, что лучше всего подойдёт для решения этой задачи. Я ещё не до конца разобрался во всех тонкостях QT, там есть свои ньюансы. Посему прошу советов у профессионалов.
Автор: vlary
Дата сообщения: 07.09.2013 20:01
georgbird Вообще-то эта тема чисто по C/С++. По QT имеется своя тема:
Qt (Trolltech Qt, Nokia Qt, Digia Qt)
Автор: Radioniker
Дата сообщения: 15.09.2013 15:34
Всем привет. Пытаюсь сделать так, чтобы при выделении текста мышью или клавиатурой в RichEdit отображался нужный мне цвет выделения. По умолчанию в RichEdit инверсный цвет и если сделать фон текста нужным-инверсным, то получим нужный цвет выделения. Такой код работает, в принципе, как надо, но только при выделении текста клавиатурой.

В WndProc ловлю WM_NOTIFY и вызываю эту процедуру:

void testselect(LPARAM lParam)
{
    NMHDR nmhdr = (*(SELCHANGE*)lParam).nmhdr;
    CHARFORMAT2 charFormat;

    if (nmhdr.code == EN_SELCHANGE)
        {
            ZeroMemory((PVOID)&charFormat, sizeof(CHARFORMAT2));
            charFormat.cbSize = sizeof(CHARFORMAT2);
            charFormat.dwMask = CFM_COLOR | CFM_BACKCOLOR;
            
            charFormat.crTextColor = RGB(0, 0, 0);
            charFormat.crBackColor = RGB(255, 255, 255);
            SendMessage(nmhdr.hwndFrom, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&charFormat);
            
            charFormat.crTextColor = RGB(255, 255, 255);
            charFormat.crBackColor = RGB(127, 64, 0);
            SendMessage(nmhdr.hwndFrom, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&charFormat);
        }
}

При выделении текста мышью оно, конечно, тоже работает, но только после того, как отпустишь кнопку мыши. Вопрос, собственно, в том, как сделать, чтобы код мог отслеживать, сколько выделено символов мышью во время выделения, а не после. Чтобы на лету изменять текст цвета и тд. На ум приходит бредовая мысль об отслеживании координат мыши, но как то это слишком. Код должен быть исключительно на C++/WinAPI, так что идеи со всякими библиотеками-обертками не предлагать. Заранее спасибо.
Автор: Abs62
Дата сообщения: 15.09.2013 16:01
Radioniker
Хм. Отслеживать WM_MOUSEMOVE после WM_LBUTTONDOWN и проверять состояние выделения через EM_GETSEL?
Автор: Radioniker
Дата сообщения: 15.09.2013 16:58
Abs62
Возможно, это то, что мне нужно, но у меня возникла проблема: WM_MOUSEMOVE приходит только от окна программы, а не от RichEdit. Как быть?
Автор: Abs62
Дата сообщения: 15.09.2013 17:11
Radioniker
Можно попробовать субклассинг. Подсунуть окну RichEdit новый обработчик сообщений через SetWindowLongPtr с GWLP_WNDPROC и отлавливать WM_MOUSEMOVE и прочие сообщения, что потребуются, в нём..
Автор: Radioniker
Дата сообщения: 15.09.2013 18:27
Abs62
Ага. Меняю процедуру обработки:

SetWindowLongPtr(hTextBox, GWLP_WNDPROC, (LONG_PTR)(WNDPROC)REditProc);

На:

LRESULT CALLBACK REditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {    
        case WM_MOUSEMOVE:
            //выполняем код
            break;
        
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

В итоге я получаю от RichEdit сообщение WM_MOUSEMOVE, что и требовалось, но он перестал вести себя нормально, будто DefWindowProc не обрабатывает остальные сообщения. В чем ошибка?
Автор: Abs62
Дата сообщения: 15.09.2013 19:14
Radioniker

Цитата:
В итоге я получаю от RichEdit сообщение WM_MOUSEMOVE, что и требовалось, но он перестал вести себя нормально, будто DefWindowProc не обрабатывает остальные сообщения. В чем ошибка?

Дык, потом-то сообщения (и WM_MOUSEMOVE тоже) надо обратно в RichEdit отдать, иначе он их обрабатывать и не будет. DefWindowProc не годится.

Код: WNDPROC OldREditProc = (WNDPROC)SetWindowLongPtr(hTextBox, GWLP_WNDPROC, (LONG_PTR)(WNDPROC)REditProc);
...
LRESULT CALLBACK REditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
return OldREditProc(hWnd, message, wParam, lParam);
}
Автор: boctopr
Дата сообщения: 21.09.2013 22:14
Какие слышал что в STL есть функции для комбинаторики, не подскажите?
Автор: dragon010
Дата сообщения: 21.09.2013 22:16
boctopr
Например, next_permutation
Автор: bomzzz
Дата сообщения: 28.09.2013 07:49
никто не подскажет как сделать, чтоб пунктира не появлялось?


Автор: ne_viens
Дата сообщения: 28.09.2013 16:35
Такое обычно пройсходит, если в форме нет не однои кнопки.
Добавь: CONTROL "xxx", 1000, BUTTON, BS_PUSHBUTTON, ...
Автор: bomzzz
Дата сообщения: 28.09.2013 18:27
спасибо. у меня полно кнопок там, если я правильно понял - форма это же все окно?
Автор: ne_viens
Дата сообщения: 28.09.2013 18:37
Ну тогда субклассом только:


Код: WNDPROC oldChkProc;
///////////////////////////////////////////////////////////////////
int __stdcall chkProc(HWND hWin, int msg, WPARAM w, LPARAM l)
{
    if(WM_SETFOCUS == msg || WM_KILLFOCUS == msg)
        return 0;
    return CallWindowProc(oldChkProc, hWin, msg, w, l);
}

///////////////////////////////////////////////////////////////////
int __stdcall DlgProc(HWND hDlg, int msg, WPARAM w, LPARAM l)
{
    switch(msg)
    {
    case WM_INITDIALOG:
        oldChkProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, 1003), GWLP_WNDPROC, (LONG_PTR)chkProc);
//...
Автор: bomzzz
Дата сообщения: 29.09.2013 07:46
спасибо.
Автор: Olim98
Дата сообщения: 30.09.2013 19:37
Здраствуйте ув. форумчане! Я в програмирование полный 0, но захотелось поковырятся в одной программе))). Это консольное приложение, вместо русских символов она отображает иероглифы, частично я смог это исправить перекодировав все файлы в OEM866 кодировку, но есть текст который она берет из интернета в кодировке UTF-8 и он постоянно отображается иероглифами. Так вот немогли бы вы сделать функцию которая перекодировывала бы из UTF-8 в 866 кодировку? Был бы очень благодарен
Автор: ne_viens
Дата сообщения: 01.10.2013 12:26
Как то так примерно:


Код: #include <windows.h>
#include <stdlib.h>
#include <stdio.h>

main()
{
    FILE* f;
    short wide[0x100];
    char mbyte[0x100];

    f = fopen("utf.txt", "rb");
    fgets(mbyte, sizeof(mbyte), f);
    fclose(f);
    
    MultiByteToWideChar(CP_UTF8, 0, &mbyte[3], -1, wide, sizeof(wide) / 2);
    WideCharToMultiByte(CP_OEMCP, 0, wide, -1, mbyte, sizeof(mbyte), NULL, NULL);
    puts(mbyte);
}
Автор: Olim98
Дата сообщения: 01.10.2013 12:28
ne_viens
не могли бы подсказать как его использовать?
Автор: ne_viens
Дата сообщения: 01.10.2013 13:48
Ф-я с примером вызова:

Код: #include <windows.h>
#include <stdlib.h>
#include <stdio.h>

/////////////////////////////////////////////////////////////////////////////
int utf2oem(char* inp, char* outp, int outpLen)
{
    int ret, i;
    LPWSTR mem;
    
    i = MultiByteToWideChar(CP_UTF8, 0, inp, -1, NULL, 0);
    if(!i)
        return 0;
    mem = malloc(i * 2);
    i = MultiByteToWideChar(CP_UTF8, 0, inp, -1, mem, i * 2);
    ret = WideCharToMultiByte(CP_OEMCP, 0, mem, i, outp, outpLen, NULL, NULL);
    free(mem);
    return ret;
}

/////////////////////////////////////////////////////////////////////////////
int main()
{
    int len;
    FILE* f;
    char *mem, mbyte[0x100];

    f = fopen("utf.txt", "rb");
    fgets(mbyte, sizeof(mbyte), f);
    fclose(f);
    
    len = utf2oem(&mbyte[3], NULL, 0);    //get output buffer length
    if(!len)
        return -1;
    mem = malloc(len);
    if(!mem)
        return -1;
    utf2oem(&mbyte[3], mem, len);        //convert
    
    puts(mem);
    free(mem);
    return 0;
}
Автор: bomzzz
Дата сообщения: 01.10.2013 14:21
наверно еще надо предложить программу которая перехватит функцию в упомянутом консольном приложении и на лету будет перекодировать
Автор: Olim98
Дата сообщения: 01.10.2013 15:07
а где там текст который должен переконвертироваться???
CONSOLE_Print( "[INFO: " + m_ServerAlias + "] " + Message );
жирным шрифтом идет текст в кодировке UTF-8
функция выводящая текст в консоль и в лог
[more=функция]void CONSOLE_Print( string message )
{
    cout << message << endl;

    // logging

    if( !gLogFile.empty( ) )
    {
        if( gLogMethod == 1 )
        {
            ofstream Log;
            Log.open( gLogFile.c_str( ), ios :: app );

            if( !Log.fail( ) )
            {
                time_t Now = time( NULL );
                string Time = asctime( localtime( &Now ) );

                // erase the newline

                Time.erase( Time.size( ) - 1 );
                Log << "[" << Time << "] " << message << endl;
                Log.close( );
            }
        }
        else if( gLogMethod == 2 )
        {
            if( gLog && !gLog->fail( ) )
            {
                time_t Now = time( NULL );
                string Time = asctime( localtime( &Now ) );

                // erase the newline

                Time.erase( Time.size( ) - 1 );
                *gLog << "[" << Time << "] " << message << endl;
                gLog->flush( );
            }
        }
    }
}
[/more]
Автор: bomzzz
Дата сообщения: 02.10.2013 18:57
напишите для Olim98-а как делать инжектирование или hook, чтоб подсунуть программе данные с измененной кодировкой
Автор: ne_viens
Дата сообщения: 03.10.2013 09:01
Зачем? Так C++ source программы на руках у него.
Автор: Olim98
Дата сообщения: 03.10.2013 10:31
ne_viens пожалуйста расскажите поподробней как юзать вашу функцию
Автор: ne_viens
Дата сообщения: 03.10.2013 10:53
Мой код на C, а в C++ я не силён.
Автор: Abs62
Дата сообщения: 03.10.2013 12:23
Olim98
Как-то так:

Код: string utf2oem( string const & in_str )
{
int n = MultiByteToWideChar( CP_UTF8, 0, in_str.data(), in_str.size(), NULL, 0 );
if( n == 0 )
return in_str;

wstring tmp;
tmp.resize( n );

int ret = MultiByteToWideChar(CP_UTF8, 0, in_str.data(), in_str.size(), &tmp.front(), tmp.size() );
if( ret == 0 )
return in_str;

string out_str;
out_str.resize( n );

ret = WideCharToMultiByte(CP_OEMCP, 0, tmp.data(), n, &out_str.front(), n, NULL, NULL);

return( ret == 0 ? in_str : out_str );
}

....

CONSOLE_Print( "[INFO: " + m_ServerAlias + "] " + utf2oem( Message ) );

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.