Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
rudeeeboy
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
1

Замена SetDlgItemInt на SendMessage

29.05.2012, 15:18. Просмотров 1282. Ответов 4
Метки нет (Все метки)

Надо заменить SetDlgItemInt на SendMessage
было
C++
1
2
3
4
5
6
HDLG=hDlg;
SetDlgItemInt(hDlg, IDC_EDIT1,str.x,1);
SetDlgItemInt(hDlg, IDC_EDIT2,str.y,1);  
SetDlgItemInt(hDlg, IDC_EDIT3,str.r,1);
SetDlgItemInt(hDlg, IDC_EDIT5,str.N,1);
SetDlgItemInt(hDlg, IDC_EDIT4,dTimer,1);
сделал
C++
1
2
3
4
5
6
7
8
9
10
11
HDLG=hDlg;
hWnd2=GetDlgItem(hDlg, IDC_EDIT1);
SendMessage(hWnd2,WM_SETTEXT,0,str.x);
hWnd3=GetDlgItem(hDlg, IDC_EDIT2);
SendMessage(hWnd3,WM_SETTEXT,0,str.y); 
hWnd4=GetDlgItem(hDlg, IDC_EDIT3);
SendMessage(hWnd4,WM_SETTEXT,0,str.r);
hWnd6=GetDlgItem(hDlg, IDC_EDIT5);
SendMessage(hWnd6,WM_SETTEXT,0,str.N);
hWnd5=GetDlgItem(hDlg, IDC_EDIT4);
SendMessage(hWnd5,WM_SETTEXT,0,dTimer);
выдаёт ошибку связанную с памятью

полный код
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
// --- Обязательный включаемый файл
#include <windows.h>
#include <math.h>
#include <time.h>
#include <commctrl.h>
#include <string>
#include <ColorDlg.h>
#include "resource.h"
#define PI 3.14156
void ugol(HDC hDC,int x1,int y1,int x2,int y2,int x3,int y3,int n);
void star(HDC hDC,struct STAR str);
void ugol(HDC hDC,int x1,int y1,int x2,int y2,int x3,int y3,int n)
    {
        int n1=n+1; double a; int xx1,yy1,xx2,yy2;
        for(int i=1; i<=n1; i++)
        {
            a=(i-1.)/n;
            xx1= x1+(x2-x1)*a; yy1= y1+(y2-y1)*a;
            xx2= x2+(x3-x2)*a; yy2= y2+(y3-y2)*a;
            MoveToEx(hDC,xx1,yy1, (LPPOINT) NULL); 
            LineTo(hDC,xx2,yy2); 
        }
    }
 
 
struct STAR
    {
        unsigned N; // количество фрагментов (вид изображения)
        int x,y; // координаты центра звезды (местоположение)
        unsigned r;         // радиус звезды (размер)
        COLORREF color;     // цвет линии (цвет изображения)
    }; 
void star(HDC hDC,struct STAR str)
    {
        int rc=str.r/3; // радиус центра звезды
        double a1,a2,a3,d=2.*PI/(str.N*2);
        HPEN hPen = CreatePen(PS_SOLID,0.5,str.color);
        HPEN hOldPen = (HPEN)SelectObject (hDC, hPen);
        for(int i=1; i<=str.N; i++) 
        // рисуем очередной фрагмент звезды ( 1<=i<=N)
        {
            // определение значений углов
            a1=2*PI*(i-1)/str.N; a2=a1+d; a3=a1-d;
 
            // вывод угла, заштрихованного отрезками
            ugol(hDC,str.x,str.y,str.x+str.r*sin(a1),str.y+str.r*cos(a1),str.x+rc*sin(a2),str.y+rc*cos(a2),25);
            ugol(hDC,str.x,str.y,str.x+str.r*sin(a1),str.y+str.r*cos(a1),str.x+rc*sin(a3),str.y+rc*cos(a3),25);
        }
        DeleteObject (hPen);
        SelectObject(hDC, hOldPen);
    }
STAR str;
static int nTimer;
static int dTimer;
char * tempstr;
int temp=0;
// --- Описание функции главного окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam);
// --- Глобальные переменные
HINSTANCE hInst;        // Дескриптор экземпляра приложения
HWND hWnd,hWnd2,hWnd3,hWnd4,hWnd5,hWnd6;
HWND HDLG;
char ClassName[]="Window";      // Название класса окна
char AppTitle[]="Application Win32";    // Заголовок главного окна
 
// --- Функция WinMain
int WINAPI WinMain( HINSTANCE hInstance,
    // Дескриптор экземпляра приложения
    HINSTANCE hPrevInstance, // В Win32 всегда равен NULL
    LPSTR lpCmdLine, 
    // Указатель на командную строку. Он // позволяет
    // приложению получать данные из командной строки.
    int nCmdShow
    // Определяет, как приложение первоначально 
    // отображается на дисплее: пиктограммой
    // (nCmdShow = SW_SHOWMINNOACTIVE) 
    // или в виде открытого окна                    //(nCmdShow = SW_SHOWNORMAL).
    )
{
    HACCEL hAccel=LoadAccelerators(hInst,MAKEINTRESOURCE(IDR_ACCELERATOR1));
    WNDCLASS wc;    // Структура для информации о классе окна
    HWND hWnd;  // Дескриптор главного окна приложения
    MSG msg;    // Структура для хранения сообщения
// Сохраняем дескриптор экземпляра приложения в глобальной
// переменной, чтобы при необходимости воспользоваться им в
// функции окна.
    hInst=hInstance;
 
    // --- Проверяем, было ли приложение запущено ранее.
    // Воспользуемся функцией FindWindow, которая позволяет
    // найти окно верхнего 
    // уровня по имени класса или по заголовку окна:
    // HWND FindWindow(LPCTSTR lpClassName,
    // LPCTSTRlpWindowName);
    // Через параметр lpClassName передается указатель на
    // текстовую строку, в которую необходимо записать имя
    // класса искомого окна. На базе одного и того же класса 
    // можно создать несколько окон. Если необходимо найти 
    // окно с заданным заголовком, то имя заголовка следует
    // передать через параметр lpWindowName. Если же подойдет 
    // любое окно, то параметр lpWindowName может иметь
    // значение NULL.
    if((hWnd=FindWindow(ClassName, NULL))!=NULL)
    {
    // Пользователь может не помнить, какие приложения уже
    // запущены, а какие нет. Когда он запускает приложение, 
    // то ожидает, что на экране появится его главное окно.
    // Поэтому, если приложение было запущено ранее,
    // целесообразно активизировать и выдвинуть на передний
    // план его главное окно. Это именно то, к чему приготовился
    // пользователь.
        if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
        SetForegroundWindow(hWnd);
 
    // Найдена работающая копия - работа новой копии
    // прекращается.
        return FALSE;
    }
 
    // --- Работающая копия не найдена - функция WinMain
    // приступает к инициализации. Заполнение структуры
    // WNDCLASS для регистрации класса окна.
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName=ClassName;     // Имя класса окон
    wc.lpfnWndProc=(WNDPROC)WndProc;    
    // Адрес оконной функции
    wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса 
    wc.hInstance=hInstance;     // Экземпляр приложения
    wc.hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
    // Пиктограмма для окон
    wc.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(IDC_CURSOR1));  
    // Курсор мыши для окон
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);   
    // Кисть для окон
    wc.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);         // Ресурс меню окон
    wc.cbClsExtra=0;            // Дополнительная память
    wc.cbWndExtra=0;            // Дополнительная память
    // Pегистрация класса окна.
    RegisterClass(&wc);
    char sz[160];
    LoadString(hInst,103, sz, sizeof(sz)/sizeof(char));
    // Создаем главное окно приложения.
    hWnd=CreateWindow(
        ClassName,          // Имя класса окон
        sz,         // Заголовок окна 
        WS_OVERLAPPEDWINDOW,        // Стиль окна
        CW_USEDEFAULT,          // X-координаты 
        CW_USEDEFAULT,          // Y-координаты 
        CW_USEDEFAULT,          // Ширина окна
        CW_USEDEFAULT,          // Высота окна
        NULL,           // Дескриптор окна-родителя
        NULL,           // Дескриптор меню окна
        hInst,      // Дескриптор экземпляра приложения
        NULL);      // Дополнительная информация
    if(!hWnd) 
    {
        // Окно не создано, выдаем предупреждение.
        MessageBox(NULL,
        "Create: error",AppTitle,MB_OK|MB_ICONSTOP);
        return FALSE;
    }
 
    // Отображаем окно.
    ShowWindow(hWnd, nCmdShow);
 
    // Обновляем содержимое клиентской области окна.
    UpdateWindow(hWnd);
    // Запускаем цикл обработки очереди сообщений.
    // Функция GetMessage получает сообщение из очереди, 
    // выдает false при выборке из очереди сообщения WM_QUIT
    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(hWnd,hAccel,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return msg.wParam;
}
 
// --- Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    // Необходимо обновить содержимое клиентской области окна.
        case WM_CREATE:
        {
            nTimer=10;
            dTimer=5000;
            SetTimer(hWnd,nTimer,dTimer,NULL);
            RECT r; GetClientRect(hWnd,&r);
            str.N=6;
            str.r=30;
            str.x=400;
            str.y=400;
            str.color=RGB(255,0,0);
        }; break;
        case WM_PAINT: 
        {
            HDC hDC;
            PAINTSTRUCT ps;
            hDC=BeginPaint(hWnd,&ps);   
            // Получить контекст окна
            // Нарисовать текст
            star(hDC, str);
            EndPaint(hWnd,&ps); 
            // Освободить контекст окна
        }; break;
        case WM_TIMER:
        {
            RECT r; GetClientRect(hWnd,&r);
            if (temp==0){
                str.N=6;
                str.r=30;
                str.x=400;
                str.y=400;
                str.color=RGB(255,0,0);
                temp=1;}
                InvalidateRect(hWnd, NULL, TRUE);
                UpdateWindow(hWnd);
        }; break;
        case WM_COMMAND:
        {
            switch (HIWORD(wParam))//определение - от меню или акселератора
            {
                case 1: //от акселератора
                {
                    switch (LOWORD(wParam)){
                    case ID_FAST:
                        {
                            KillTimer(hWnd,nTimer);
                            dTimer*=1.1;
                            SetTimer(hWnd,nTimer,dTimer,NULL);
                        }; break;
                    case ID_SLOW:
                        {
                            KillTimer(hWnd,nTimer);
                            dTimer*=0.9;
                            SetTimer(hWnd,nTimer,dTimer,NULL);
                        }; break;
                    }
                }
                case 0://от меню
                {
                    switch (LOWORD(wParam))//определение - от меню или акселератора
                    {
                    case CM_TOOLS:
                        {
                            int nResult=DialogBox(hInst,MAKEINTRESOURCE (IDD_DIALOG1),hWnd,DlgProc);
                            if(nResult==IDOK)
                            {
                                InvalidateRect(hWnd, NULL, TRUE);
                                UpdateWindow(hWnd);
                                KillTimer(hWnd,nTimer);
                                SetTimer(hWnd,nTimer,dTimer,NULL);
                            }
                        }; break;
                    case CM_COLOR:
                        {
                            CHOOSECOLOR cc;                 // структура
                            static COLORREF acrCustClr[16]; // массив цветов
                            HWND hwnd;                      // окно - владелец
                            HBRUSH hbrush;                  // дескриптор кисти
                            static DWORD rgbCurrent;        // изначальный цвет
                            // Заполняем CHOOSECOLOR
                            ZeroMemory(&cc, sizeof(cc));
                            cc.lStructSize = sizeof(cc);
                            cc.hwndOwner = hWnd;
                            cc.lpCustColors = (LPDWORD) acrCustClr;
                            cc.rgbResult = str.color;
                            cc.Flags = CC_FULLOPEN | CC_RGBINIT;
                            if (ChooseColor(&cc)==TRUE)
                            {
                                hbrush = CreateSolidBrush(cc.rgbResult);
                                str.color = cc.rgbResult;
                            };
                            RECT r;
                            GetClientRect(hWnd,&r);
                            InvalidateRect(hWnd,&r,1);
                            UpdateWindow(hWnd);
                        };break;
                    }
                }
            }
        }; break;
        case WM_DESTROY:
        {
        // Если данная функция является оконной функцией
        // главного окна, то следует в очередь сообщений
        // приложения послать сообщение WM_QUIT 
            KillTimer (hWnd,nTimer);
            PostQuitMessage(0);
        }; break;
 
        // Необработанные сообщения передаем в стандартную
        // функцию обработки сообщений по умолчанию.
    default: return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0l;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam)
    {
        switch(message)
        {
            case WM_INITDIALOG:
            {   // различные инициализации
                // приложение само может установить фокус ввода на нужный 
                // элемент управления (SetFocus), тогда возвращают FALSE.
                // Для предоставления Windows возможности установки фокуса ввода следует возвратить TRUE.
                 HDLG=hDlg;
                 hWnd2=GetDlgItem(hDlg, IDC_EDIT1);
                 SendMessage(hWnd2,WM_SETTEXT,0,str.x);
                 hWnd3=GetDlgItem(hDlg, IDC_EDIT2);
                 SendMessage(hWnd3,WM_SETTEXT,0,str.y); 
                 hWnd4=GetDlgItem(hDlg, IDC_EDIT3);
                 SendMessage(hWnd4,WM_SETTEXT,0,str.r);
                 hWnd6=GetDlgItem(hDlg, IDC_EDIT5);
                 SendMessage(hWnd6,WM_SETTEXT,0,str.N);
                 hWnd5=GetDlgItem(hDlg, IDC_EDIT4);
                 SendMessage(hWnd5,WM_SETTEXT,0,dTimer);
                 return TRUE;
                // SetFocus();
                // различные инициализации
                // приложение само может установить фокус ввода на нужный 
                // элемент управления (SetFocus), тогда возвращают FALSE.
                // Для предоставления Windows возможности установки фокуса ввода следует возвратить TRUE.
                    
            };
            case WM_COMMAND:
            {   switch(LOWORD(wParam))
                {
                    case IDCANCEL:
                        {
                        // нажаты или ESC, илиCtrl+Break, или пункт 
                        // меню IDCANCEL, или кнопка IDCANCEL
                        EndDialog(hDlg, IDCANCEL); 
                        return TRUE;
                        };break;
                    case IDOK:
                        {
                            // нажата кнопка IDOK или пункт меню IDOK
                             int x;
                             int y;
                             int r;
                             int N;
                             str.x=GetDlgItemInt(hDlg, IDC_EDIT1, &x,1);
                             str.y=GetDlgItemInt(hDlg, IDC_EDIT2, &y,1);
                             str.r=GetDlgItemInt(hDlg, IDC_EDIT3, &r,1);
                             str.N=GetDlgItemInt(hDlg, IDC_EDIT5, &N,1);
                             dTimer=GetDlgItemInt(hDlg,IDC_EDIT4,&r,1);
                             GetWindowText(GetDlgItem(hDlg,IDC_EDIT1), tempstr, 100); 
                             /*frn.x=int(x);
                             frn.y=int(y);
                             frn.h=int(h);*/
                             EndDialog(hDlg, LOWORD(wParam));
                             EndDialog(hDlg, IDOK); 
                             return TRUE;
                        };break;
                    // обработка сообщений от других элементов управления
                }
            }; break;
            case WM_CLOSE: // закрытие окна при помощи системного меню 
            {   // моделирование отказа от работы с панелью
                PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
            }; return TRUE;
        }
        return FALSE;
    }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2012, 15:18
Ответы с готовыми решениями:

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

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

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

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

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

4
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26125 / 17520 / 6948
Регистрация: 22.10.2011
Сообщений: 30,857
Записей в блоге: 6
29.05.2012, 16:39 2
WM_SETTEXT ожидает в lParam получить
A pointer to a null-terminated string that is the window text.
, а ты ему int подсовываешь. Вот система и негодует
0
rudeeeboy
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
29.05.2012, 18:39  [ТС] 3
всмысле надо SendMessage(hWnd2,WM_SETTEXT,0,(LPARAM)str.x);?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26125 / 17520 / 6948
Регистрация: 22.10.2011
Сообщений: 30,857
Записей в блоге: 6
29.05.2012, 18:45 4
Лучший ответ Сообщение было отмечено volvo как решение

Решение

В смысле надо сначала число сконвертировать в строку (проще всего это делается через sprintf, или его Юникодный аналог swprintf), и саму строку уже передавать через WM_SETTEXT
1
rudeeeboy
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
29.05.2012, 21:34  [ТС] 5
всё, сделал, спасибо
0
29.05.2012, 21:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 21:34

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

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

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


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

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

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