0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 2
1

WM_PAINT - символы вместо обычного текста

08.05.2015, 14:21. Показов 722. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу в VS C++.
Вот код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <windows.h>
 
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hlnst;
 
int WINAPI WinMain(HINSTANCE hlnstance, HINSTANCE hPrevkstance, LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg; HWND hwnd; hlnst=hlnstance;
 
 
    if(!RegClass( WndProc,L"Window", 3))
        return FALSE;
 
    hwnd = CreateWindow(L"Window",L"Window",
        WS_OVERLAPPEDWINDOW, 100,50,600,300,0,0,hlnstance, NULL);
 
    ShowWindow(hwnd,SW_SHOWNORMAL);
 
    while(GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
 
    return msg.wParam;
}
 
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc; wc.hInstance = hlnst;
    wc.hIcon = LoadIcon(NULL, NULL);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(brBackground);
    wc.lpszMenuName = NULL; wc.lpszClassName = szName;
    return (RegisterClass(&wc)!=0);
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    char szText[]="Привет Мир - Hello Word";
    static short cx,cy;
 
    switch (msg)
    {
    case WM_SIZE:
        {
            cx=LOWORD(lParam);
            cy=HIWORD(lParam);
            return 0;
        };
 
    case WM_PAINT:
        { 
            PAINTSTRUCT ps;
            HDC  hdc = BeginPaint(hwnd,&ps);
            SetTextColor(hdc,RGB(255,0,0));
            SetBkColor(hdc,RGB(0,255,255));
            SetTextAlign(hdc,TA_CENTER);
            TextOut(hdc,cx/2,cy/2,LPCWCHAR(szText),strlen(szText));
            EndPaint(hwnd,&ps);
            return 0;
        }
    case WM_CREATE :
        {
            return 0;
        };
 
    case WM_DESTROY: { PostQuitMessage(0); return 0;};
 
    }
    return DefWindowProc(hwnd,msg, wParam,lParam);
}
По идеи должен по средине рабочей области программы писать "Привет Мир - Hello Word", а пишет на самом деле не понятные символы. Прилепляю скриншот с тем, что программа мне выдает. В чем проблема? У меня есть подозрение что когда я char преобразую в LPCWSTR (59 строчка кода) то получается такой текст. Может кто-нибудь знает как преобразовать нормально?
Миниатюры
WM_PAINT - символы вместо обычного текста  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2015, 14:21
Ответы с готовыми решениями:

Автоматическое копирование данных по цвету текста вместо текста обычного
Вечер добрый. Подскажите как составить формулу для следующей ситуации. Есть столбец с текстами в...

Сайт вместо обычного текста каракули показываеть
Помогите если не сложно!!!!! Скачал шаблон, там все по английски написано было, решил переделать...

Вместо текста получаю символы
Здравствуйте! Хочу взять по ссылке из текстового документа - текст... Вот мой код: WebClient...

Непонятные символы вместо текста
Помогите пожалуйста открыть этот файл, чтобы отображался текст. У меня mathcad 14

5
Заблокирован
08.05.2015, 15:04 2
C++
1
char szText[]="Привет Мир - Hello Word";
поменяй на
C++
1
wchar_t szText[]=L"Привет Мир - Hello Word";
Цитата Сообщение от snoomru Посмотреть сообщение
TextOut(hdc,cx/2,cy/2,LPCWCHAR(szText),strlen(szText));
тут убери LPCWCHAR
0
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 2
08.05.2015, 18:28  [ТС] 3
Огромное спасибо=) но теперь strlen(szText)); выдает ошибку.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
08.05.2015, 19:10 4
поменяй на wcslen(const wchar_t* str); подключи <wchar.h> или <string.h> если что. Лучше пока используй типы зависящие от настроек проекта (Unicode или Multibyte char) из файла <tchar.h>:
char/wchar_t - TCHAR
char*/wchar_t* - LPTSTR
const char*/const wchar_t* - LPCTSTR
wcslen/strlen - _tcslen и т.д.
0
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
09.05.2015, 15:28 5
Цитата Сообщение от snoomru Посмотреть сообщение
но теперь strlen(szText)); выдает ошибку.
Уясните для себе начальные установки проекта, обычно вся путаница и происходит из-за этого.
Также, если создаем GUI ( win32 проект ), желательно использовать функции соответствующие,
т.е. консольный проект: strlen(), GUI (win32) lstrlen(), разумеется это ни факт, но если Вы будете
использовать статистическую библиотеку (для формирования проекта) - это значительно скажется
на размере исполняемого файла, а также Вы - просто, запутаетесь.
* В данном случае, замените "strlen()", на lstrlenA().
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.05.2015, 00:25 6
Цитата Сообщение от snoomru Посмотреть сообщение
В чем проблема? У меня есть подозрение что когда я char преобразую в LPCWSTR (59 строчка кода) то получается такой текст
Верно, в этом причина. Например, переменная sz имеет тип char[]. А если написать (LPCWSTR)sz, то первые два байта sz[0] и sz[1] будут являться 16-разрядным кодом одного "широкого" символа. Байты sz[2] и sz[3] - код второго символа. И т.д.

Добавлено через 14 минут
Цитата Сообщение от snoomru Посмотреть сообщение
Может кто-нибудь знает как преобразовать нормально?
Не надо преобразовывать. Если char[], то можно использовать функцию TextOutA() с параметром char[].
Для char, функции TextOutA, strlen, ...
Для wchar_t, функции TextOutW, wcslen, ...
(последняя буква в названии функции ...A - ANSI, ...W - wide )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2015, 00:25
Помогаю со студенческими работами здесь

Вместо текста символы '?' в программе
Всем привет! Пишу программу на Delphi 7 и уже не первый раз сталкиваюсь с проблемой кодировки, а...

Странные символы вместо текста
Открыл прогу, в которой должен находится текст, вместо текста - вот такие значки!!! Как сделать,...

Символы вместо русского текста
решил создать пробный html сайт и выложить его на ucoz.ru написал и выложил. теперь вместо...

Вместо текста, выводятся какие-то символы
Написал простую программку по выводу текста и одной переменной, как положено скомпилировал её и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru