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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисуем в WM_MOUSEMOVE, Текст накладывается да еще и с прицепом. 
V
    Опции темы
MAXIQ
Дата 1.4.2008, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Здрасте! Люди, объясните пожалуйста почему при рисовании текста в WM_MOUSEMOVE текст отображается все время поверх предыдущего текста без стирания да еще и с прицепом в виде каких-то символов, хотя должны были быть только цифры. Вот код
Код

HDC hDC
int X,Y;
char Str[]="";
case WM_MOUSEMOVE:
        {
        GetClientRect(hWnd,&Rect);
        hDC=GetDC(hWnd);
        //SetBkMode(hDC,TRANSPARENT);
        X=LOWORD(lParam);
        itoa(X,Str,10);
        TextOut(hDC,Rect.left+600,Rect.top,Str,6);
        Y=HIWORD(lParam);
        itoa(Y,Str,10);
        TextOut(hDC,Rect.left+600,Rect.top+25,Str,6);
        ReleaseDC(hWnd,hDC);
        };break;

Пробовал всяких сообщений окну посылать.... ничего этот текст не берет... Как мазал сам по себе так и мажет, в конце, если поерзать мышой достаточно долго превращается в черные прямоугольники. И прицеп в виде символа пробела и еще какой-то хрени за ним берется не пойми откуда, ведь на выходе должно быть только число(((   
PM MAIL   Вверх
Andrey44
Дата 1.4.2008, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну во-первых рисовать правильнее и лучше в WM_PAINT.
А во-вторых тогда делай хотя-бы перед выводом текста InvalidateRect(..................)


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Pulse69
Дата 1.4.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

char Str[]="";
...
itoa(X,Str,10);

Здесь выход за границу массива. Сначала объявляется массив длиной в 1 байт (завершающий ноль), потом в него записываются несколько байт (строковое представление числа).
Пропробуйте написать что-нибудь типа
Код

char Str[128];

Может, в этом проблема с паразитными символами.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
MAXIQ
Дата 1.4.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Текст мазать по себе перестал, однако прицеп в символах остался(
Новый код: StrX  и StrY  объявлены глобально как StrX[3],StrY[3] так как не выходят за рамки трехзначного числа. Еще объявлен еще один екземпляр структуры RECT rRectText. Однако если меньше, то вылят опять спонтанные каракули.
есть там конечно символ пробела, сразу за координатами, и можно на него цикл поставить, отловить и обрезать строку, но это ж криво будет, может знает кто как нормально разрулить ситуацию? 
Код

case WM_PAINT:
        {
        hDC=BeginPaint(hWnd,&ps);
        memset(&Rect,0,sizeof(Rect));
        GetClientRect(hWnd,&Rect);
        SetBkMode(hDC,TRANSPARENT);
        TextOut(hDC,Rect.left+600,Rect.top,StrX,3);
        TextOut(hDC,Rect.left+600,Rect.top+25,StrY,3);
        EndPaint(hWnd,&ps);
        }break;
        case WM_MOUSEMOVE:
        {
        GetClientRect(hWnd,&Rect);
        rRectText.left=Rect.left+600;
        rRectText.top=Rect.top;
        rRectText.right=rRectText.left+25;
        rRectText.bottom=rRectText.top+40;
        InvalidateRect(hWnd,&rRectText,TRUE);
        X=LOWORD(lParam);
        itoa(X,StrX,10);
        Y=HIWORD(lParam);
        itoa(Y,StrY,10);
        };break;

PM MAIL   Вверх
Andrey44
Дата 1.4.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



TextOut(hDC,Rect.left+600,Rect.top,StrX,strlen(StrX));


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
MAXIQ
Дата 2.4.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Ура, однако!! правда был прикол с инициализацией строки нулями в самом начале. И вылазили координаты по Х а потом 000Window, но если без инициализации то нормал! Спасибо за участие!
PM MAIL   Вверх
Pulse69
Дата 2.4.2008, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MAXIQ @  1.4.2008,  20:49 Найти цитируемый пост)
Новый код: StrX  и StrY  объявлены глобально как StrX[3],StrY[3] так как не выходят за рамки трехзначного числа.

Если число трёхзначное,  тогда нужно как минимум четрые символа в массиве, чтобы поместился завершающий ноль.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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