Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
jumper.leto
1 / 1 / 0
Регистрация: 08.11.2010
Сообщений: 66
1

winapi sendmessage

01.05.2012, 00:38. Просмотров 2664. Ответов 3
Метки нет (Все метки)

Прошу о помощи, обрабатываю WM_KEYDOWN, если пишу запятую то меняет на точку,
C++
1
2
3
4
5
6
7
8
9
10
case WM_KEYDOWN:
           {
               char sMSG[256] ={0};
              if (hdc = GetDC(hWnd)) {
               sMSG[0] = GetSymbolFromVK(wParam);
               if (sMSG[0] == ',')
                   sMSG[0] = '.';   
               SendMessage (GetDlgItem(hWnd, 3002), WM_SETTEXT, 0,  sMSG[0]);
               } break; 
           }
Все бы ничего но компилятор выдает при нажатии клавишы: "Stack overflow"
после отладки ( шаг за шагом ) было обнаружено что он тупо пропускает едит и зацикливается на данном case;
Может поможет, при использовании Textout, все работает, но textout не подходит,
при использовании
SetWindowText
SetDlgItemText
SetDlgItemInt
аналогичная проблема.

Вот если поможет весь код:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <windows.h>
//#include <stdlib.h>
//#include <iostream>
//#include <string.h>
#include <stdio.h>
#include <tchar.h>
#include "Fib DLL3.h"
extern "C" int parll(int a, int b);
typedef BOOL (WINAPI * SLWAProc)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
// объявим необходимые константы
#ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0x00080000
#endif
#define LWA_ALPHA 0x00000002
 
WORD GetSymbolFromVK(WPARAM wParam) // переводит код нажатой клавиши в текст
{
    WORD Symbol; 
    BYTE btKeyState[256];
    HKL  hklLayout = GetKeyboardLayout(0); // узнаем язык клавиатуры
    GetKeyboardState(btKeyState); 
    if(!
        
        ((ToAsciiEx(wParam, MapVirtualKey(wParam, 0), btKeyState, &Symbol, 0, hklLayout) == 1) 
        && // сам перевод
        0 <= GetKeyState(VK_CONTROL) 
        && 
        0 <= GetKeyState(VK_MENU))) // проверяем CTRL и ALT
        Symbol = -1;
    return Symbol;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR ch;
char * sBuf = NULL;
TCHAR fibs[256];
TCHAR parS[256],parH[256];
TCHAR fibss[256],parSS[256];
int fibi, parHi,parSi;
char szText[256];
unsigned int key;
TCHAR text1[] = _T("1) Найти N-ое число Фибоначчи ;");
TCHAR text2[] = _T("2) Найти площадь параллелограмма  по известным стороне и высоте;");
TCHAR text3[] = _T("Номер элемента :");
TCHAR text4[] = _T("Сторона :");
TCHAR text5[] = _T("Высота :");
TCHAR text6[] = _T("Ответ :");
 
 
switch(message)
{
     case WM_COMMAND:
         switch (LOWORD(wParam)) {
         case 1:
             if (GetWindowText(GetDlgItem(hWnd, 1001), fibs, 10) == NULL) break;
                GetWindowText(GetDlgItem(hWnd, 1001), fibs, 10);
 
                //SendMessage (GetDlgItem(hWnd, 1011), WM_SETTEXT, 0, (LPARAM)fibs);
                fibi = _wtoi(fibs);
                fibi = Fib::MyFib::FibN(fibi);
                _itow_s(fibi,fibss,10);
                SendMessage (GetDlgItem(hWnd, 2011), WM_SETTEXT, 0, (LPARAM)fibss);
                //MessageBox(hWnd, fibss, TEXT(" Задание № 1"), 0);
                break; 
         case 2:
                GetWindowText(GetDlgItem(hWnd, 1002), LPWSTR(parS), 50);
                //GetDlgItemText(hWnd,1002,parS,50);
                GetWindowText(GetDlgItem(hWnd, 1003), LPWSTR(parH), 50);
                parSi= _wtoi(parS);
                parHi= _wtoi(parH);
                parSi = parll(parSi,parHi);
                _itow_s(parSi,parSS,10);
                SendMessage (GetDlgItem(hWnd, 2012), WM_SETTEXT, 0, (LPARAM)parSS);
                //MessageBox(hWnd, parSS, TEXT(" Задание № 2"), 0);
                break;
         }
     case WM_KEYDOWN:
           {
               char sMSG[256] ={0};
              if (hdc = GetDC(hWnd)) {
               sMSG[0] = GetSymbolFromVK(wParam);
               if (sMSG[0] == ',')
                   sMSG[0] = '.';
                   SendMessage (GetDlgItem(hWnd, 3002), WM_SETTEXT, 0,  sMSG[0]);
               } break; 
           } 
    case WM_CREATE:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        
        //Cоздаем ТЕКСТ 1 задания Фтб.
        TextOut(hdc, 10, 10, text1, _tcslen(text1));
 
        //Cоздаем ТЕКСТ 2 задания S.
        TextOut(hdc, 10, 130, text2, _tcslen(text2));
 
        //Оформляем
        TextOut(hdc, 10, 40, text3, _tcslen(text3));
        TextOut(hdc, 10, 170, text4, _tcslen(text4));
        TextOut(hdc, 10, 210, text5, _tcslen(text5));
        TextOut(hdc, 10, 80, text6, _tcslen(text6));
        TextOut(hdc, 10, 250, text6, _tcslen(text6));
 
    EndPaint(hWnd, &ps);
        break;
        default: return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2012, 00:38
Ответы с готовыми решениями:

SendMessage
Доброго времени суток, товарищи. Проблема такова, что не отправляется сообщение...

SendMessage
Помогите правильно сформировать запрос для окна. Нужно повторить такое...

Edit'ы. SendMessage
Добрый день! Задача такая: надо сгенерировать случайное число и вывести его в...

Ускорить SendMessage
можно как либо ускорить и отчего зависит скорость SendMessage? PostMessage не...

PostMessage и SendMessage
В общем такая проблема.... отправляю сообщение: PostMessage (hWnd, 1001, 1,...

3
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
01.05.2012, 11:37 2
SendMessage (GetDlgItem(hWnd, 3002), WM_SETTEXT, 0, sMSG[0] );

Последний параметр должен быть указателем на строку.
0
jumper.leto
1 / 1 / 0
Регистрация: 08.11.2010
Сообщений: 66
01.05.2012, 12:25  [ТС] 3
Ну , у меня так и есть вроде .
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
01.05.2012, 12:49 4
Цитата Сообщение от jumper.leto Посмотреть сообщение
char sMSG[256] ={0};
Цитата Сообщение от jumper.leto Посмотреть сообщение
sMSG[0]
Какой же это указатель? Это символ типа char.

Добавлено через 1 минуту
(LPARAM)&sMSG[0]
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2012, 12:49

SendMessage из потока
Здравствуйте, почему то не приходят сообщения отправленные из потока функцией...

SetDlgItemText и SendMessage
Собственно код: void Out(HWND hEdit) { SetDlgItemText(hEdit, EDIT2,...

Аналог SendMessage
Есть ли аналог SendMessage , тк sm ждет когда выполнить код по отправленному...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru