Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2009, 15:14   #1
STill_ace
Пользователь
 
Аватар для STill_ace
 
Регистрация: 18.06.2009
Сообщений: 15
По умолчанию почему DrawText криво работает?

Ф-ия DrawText() выводит текст в заранее определенный прямоугольник. По умолчанию, она должна начать вывод текста с верхнего левого угла. Но вместо этого, она начинает вывод на строчку выше прямоугольника. В результате первой строчки не видно.

Код:
            // создадим прямоугольник, с которым будем работать
            RECT rect; SetRect( &rect, 530, 20, 770, 150 );
            
            // нарисуем его желтым цветом с помощью ф-ии FillRect()
            FillRect( hDC, &rect, CreateSolidBrush( RGB(255,255,0) ));

            // воспользуемся ф-ей DrawText(), и напишем в выбранном                                                                             
            // прямоугольнике текст
            LPCTSTR text = L"a \n b \n c \n d \n e";
            DrawText( hDC, text, -1, &rect, 0 );


Привожу скриншот. На скриншоте есть желтый прямоугольник. Теоретически, в нем должны быть 5 строк. Каждая из этих строк должна содержать по 1 букве. Начиная с верхней строки, соответственно, a,b,c,d,e.
Но буквы а не видно, потому что ф-ия DrawText() почему-то вывела ее на строчку выше прямоугольника.

В чем тут может быть дело?
Изображения
Тип файла: jpg DrawText.jpg (44.3 Кб, 191 просмотров)
STill_ace вне форума Ответить с цитированием
Старый 24.08.2009, 15:22   #2
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

используешь уникод? тогда почему LPCTSTR , а не LPWSTR. не используешь уникод? тогда зачем литера "L" перед строкой?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.08.2009, 15:29   #3
STill_ace
Пользователь
 
Аватар для STill_ace
 
Регистрация: 18.06.2009
Сообщений: 15
По умолчанию

Спасибо за замечание, но код и так работает, видимо, происходит неявное преобразование к юникоду. Я проверил - это не влияет на результат. Первая строка по-прежнему выпадает сверху за пределы выбранного прямоугольника.
STill_ace вне форума Ответить с цитированием
Старый 24.08.2009, 15:31   #4
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2STill_ace
у меня "и так работает" не работает. что логично. после правки все ок
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.08.2009, 15:32   #5
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2STill_ace
у меня "и так работает" не работает. что логично. после правки все ок
и вообще, что за индусский подход ("видимо", "я проверил"). надо наверное понимать, что ты делаешь
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.08.2009, 15:34   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

LPCTSTR в зависимости от настроек становится либо LPCWSTR либо LPCSTR. Раз компилится значит правильно всё... У меня Ваш пример работает нормально...
netrino вне форума Ответить с цитированием
Старый 24.08.2009, 15:38   #7
STill_ace
Пользователь
 
Аватар для STill_ace
 
Регистрация: 18.06.2009
Сообщений: 15
По умолчанию

Цитата:
У меня Ваш пример работает нормально...
И букву 'a' тоже видно в желтом прямоугольнике?

Цитата:
что за индусский подход ("видимо", "я проверил"). надо наверное понимать, что ты делаешь
Конечно, можно написать и LPCWSTR. Но от этого буква "а" не появится в желтом прямоугольнике.

Последний раз редактировалось STill_ace; 24.08.2009 в 15:41.
STill_ace вне форума Ответить с цитированием
Старый 24.08.2009, 15:42   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да, 'a' тоже видно = )
Вот моя процедура:
Код:
long __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT paint;
	HDC hDC;
	RECT rect;
	static LPCTSTR text = TEXT("a \n b \n c \n d \n e");

	switch(uMsg) {
		case WM_CREATE:
			break;
		case WM_PAINT:
			hDC = BeginPaint(hWnd, &paint);
// создадим прямоугольник, с которым будем работать
            SetRect( &rect, 530, 20, 770, 150 );
            
            // нарисуем его желтым цветом с помощью ф-ии FillRect()
            FillRect( hDC, &rect, CreateSolidBrush( RGB(255,255,0) ));

            // воспользуемся ф-ей DrawText(), и напишем в выбранном                                                                             
            // прямоугольнике текст
            
            DrawText( hDC, text, -1, &rect, 0 );
			EndPaint(hWnd, &paint);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}

	return true;
}
netrino вне форума Ответить с цитированием
Старый 24.08.2009, 15:43   #9
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
LPCTSTR в зависимости от настроек становится либо LPCWSTR либо LPCSTR.
щас там.

msdn:
Цитата:
LPCTSTR:
An LPCWSTR if UNICODE is defined, an LPCTSTR otherwise.
а не в LPCSTR. Если честно, я сам не понимаю, как он сам на себя дефайнится. Но у меня при ДАННОМ коде и отключонном уникоде в проекте так не компилится.

2STill_ace да, видно. вставил именно ваш код, заменил LPCTSTR на LPCSTR, убрал литеру L
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.08.2009, 15:46   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
щас там.

msdn:


а не в LPCSTR. Если честно, я сам не понимаю, как он сам на себя дефайнится. Но у меня при ДАННОМ коде и отключонном уникоде в проекте так не компилится.

2STill_ace да, видно. вставил именно ваш код, заменил LPCTSTR на LPCSTR, убрал литеру L
winnt.h:
Код:
//
// Neutral ANSI/UNICODE types and macros
//
#ifdef  UNICODE                     // r_winnt

#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */

typedef LPWCH LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote      // r_winnt

#else   /* UNICODE */               // r_winnt

#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */

typedef LPCH LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#define __TEXT(quote) quote         // r_winnt

#endif /* UNICODE */                // r_winnt
#define TEXT(quote) __TEXT(quote)   // r_winnt
LPCTSTR = LPCSTR, при отключённом UNICODE.

Последний раз редактировалось netrino; 24.08.2009 в 15:49. Причина: перепутал заголовочник
netrino вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Криво работает polygon ROD Общие вопросы C/C++ 5 06.02.2009 20:54
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46
почему не работает domovoi Общие вопросы Delphi 1 15.10.2008 18:42
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33