Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с кареткой 
V
    Опции темы
yngwie19
Дата 19.4.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Скажите как правильно использовать DestroyCaret() ? Когда вызываю эту функцию то GetLasError возвращает ("Отказано в доступе")
PM MAIL   Вверх
586
Дата 19.4.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Что возвращает DestroyCaret - TRUE или FALSE? Функция работает?
Вызывать GetLastError следует тогда, когда функция возвращает FALSE.
PM   Вверх
yngwie19
Дата 19.4.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



586, функция возвращает FALSE, может потаму что Я не вызвал функцию CreateCaret() ? поэтому не работает . ?
PM MAIL   Вверх
586
Дата 19.4.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Где эта функция вызывается и для чего?
PM   Вверх
yngwie19
Дата 19.4.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



586, CreateCaret() вызывать не нужно?
Ну вот посмотри ээто твой пример который ты мне давал в нем эта функция в обработке WM_CREATE:
Код

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <Richedit.h>

HWND hMainWnd = 0;
HWND hWndRichEdit = 0;
HWND CiipboardViewer = 0;


LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_SIZE:
        {
        MoveWindow(hWndRichEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);

        PARAFORMAT pf = {0};
        pf.cbSize = sizeof(pf);
        pf.dwMask = PFM_ALIGNMENT;
        pf.wAlignment = PFA_CENTER;

        // Выделить текст
        SendMessage(hWndRichEdit,EM_SETSEL,0,-1);
        
        // Применить к выделению центрирование
        SendMessage(hWndRichEdit,EM_SETPARAFORMAT,0,(LPARAM)&pf);
        
            SendMessage(hWndRichEdit, (WM_USER + 225), 6, 5);     
        break;
        }
    case WM_CREATE:
        DestroyCaret();
        break;
        
    case WM_CHANGECBCHAIN:
        break;

    case WM_DRAWCLIPBOARD:
        break;

    }
    
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc = {0};

    wc.cbSize = sizeof(wc);
    wc.lpfnWndProc = MainWndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wc.lpszClassName = _T("MainWndClass");
    RegisterClassEx(&wc);

    

    hMainWnd = CreateWindowEx(0, wc.lpszClassName, _T("TestApp"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        200, 200, 400, 365, NULL, NULL, hInstance, NULL);

    // Очистка буфера обмена
    if (OpenClipboard(hMainWnd))
        EmptyClipboard();

    LoadLibrary("Msftedit.dll");

    hWndRichEdit = CreateWindowEx(0, _T("RichEdit50W"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER |
            ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | ES_CENTER,
        0, 0, 380, 320, hMainWnd, NULL, hInstance, NULL);

    HANDLE hFile = CreateFile(_T("C:\\3.rtf"), GENERIC_READ, FILE_SHARE_READ,
        0, OPEN_EXISTING, 0, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwRead = 0, dwSize = GetFileSize(hFile, NULL);
        char *buf = new char[dwSize+1];
        ReadFile(hFile, buf, dwSize, &dwRead, 0);
        buf[dwRead] = '\0';
        CloseHandle(hFile);

        SetWindowTextW(hWndRichEdit, (wchar_t*)buf);   // передаётся ANSI строка. работает. тестировалось в WinXP SP2.
                // при портировании на другие версии ОС Windows может не работать.
     
      delete []buf;
    }


    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

PM MAIL   Вверх
586
Дата 19.4.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(yngwie19 @  19.4.2009,  23:33 Найти цитируемый пост)
    case WM_CREATE:
        DestroyCaret();

Это для того, чтобы скрыть каретку RichEdit'а? В момент вызова hMainWnd WM_CREATE, RichEdit ещё не создан. А вообще, для cкрытия кареток лучше использовать функцию HideCaret.


Это сообщение отредактировал(а) 586 - 19.4.2009, 22:46
PM   Вверх
GremlinProg
Дата 19.4.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(586 @  20.4.2009,  00:45 Найти цитируемый пост)
А вообще, для cкрытия кареток лучше использовать функцию HideCaret.

нет, 586, не пройдет
пара BeginPaint-EndPaint уже ее скрывает и показывает вновь,
нужно удалять, причем удалять после установки фокуса в RichEdit
либо не удалять, но тогда и предотврящать ее создание, но это я уже повторяюсь

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

последнее, по-моему - наименее кривой способ, относительно остальных


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 19.4.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



GremlinProg, а сообщение о нажатой левой кнопки мыши не вернет курсор обратно?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(yngwie19 @  20.4.2009,  01:05 Найти цитируемый пост)
а сообщение о нажатой левой кнопки мыши не вернет курсор обратно?

ты о чем? куда обратно?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 19.4.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



GremlinProg, ну если мы его уничтожим, что при нажатии левой кнопки мыши он не вернется в RichEdit?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



если уничтожать, то уничтожать свякий раз при установке фокуса,
т.е. на событие WM_SETFOCUS, смотри свои темы, я же об этом писал


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 20.4.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



GremlinProg, при обработке WM_SETFOCUS GetLastError() акже возвращает "Отказано в доступе"
PM MAIL   Вверх
GremlinProg
Дата 20.4.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



процедура окна RichEdit'а:
Код

...
case WM_SETFOCUS:
        rv = ::CallWindowProc(...);
        ::DestroyCaret();
        return rv;
...




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 20.4.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(GremlinProg @  20.4.2009,  11:34 Найти цитируемый пост)
CallWindowProc(...);

а это зачем, что это вообще за функция
PM MAIL   Вверх
GremlinProg
  Дата 20.4.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.