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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача в строку 
:(
    Опции темы
Sekmegalife
Дата 16.12.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задание следующее: Создать строку ввода с числом 0 и справа от нее - маленькую вертикальную полосы прокрутки. Под ними кнопки ДА и ВЫХОД. При нажатии на верхнюю кнопку полосы число в строке ввода увеличить на единицу, а на нижнюю - уменьшить на единицу. При нажатии кнопки Да - отобразить содержимое строки ввода.
В принципе всё написано, проблема лишь в изменении числа по нажатию мыши...
Насколько я понимаю необходимо:
1. Записать строку в буфер
2. Преобразовать в int
3. Увеличить на 1-цу
4. Вернуть в char
5. Передать обратно в строку (проблема с этим пунктом)... Может кто-либо знает, как это реализовать... Буду очень благодарен...

Код

#include "stdafx.h"
#include "zzz.h"
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#define ID_EDIT 2999
#define ID_BUTTON 3000
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szChildClass[] = _T("child");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
HINSTANCE hInst;
int Cmd;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Call to RegisterClassEx1 failed!"),
            _T("Win32 Guided Tour"),
            NULL);
        return 1;
    }
    hInst = hInstance;
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        800,800,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Call to CreateWindow failed!"),
            _T("Win32 Guided Tour"),
            NULL);

        return 1;
    }
    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);

    
    Cmd = nCmdShow;
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit, hButton,hStatic,hBut;
    static HWND Scroll;
    char chBuff[80];
    int x; 
    switch (message)
    {
    case WM_CREATE:
        {
            hStatic=CreateWindow(L"static",L"Введите число и нажмите 'OK'",WS_CHILD|WS_VISIBLE|SS_CENTER,250,250,300,20,hWnd,(HMENU)0,hInst,NULL);
            hEdit=CreateWindow(L"edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT,200,400,400,30,hWnd,(HMENU)ID_EDIT,hInst,NULL);

            Scroll=CreateWindow(L"scrollbar",NULL, WS_CHILD|WS_VISIBLE|SBS_VERT,620,350,30,150,hWnd,(HMENU)-1,hInst,NULL);
            
            hButton=CreateWindow(L"button",L"Выход",WS_CHILD | WS_VISIBLE |BS_DEFPUSHBUTTON, 250, 450, 100, 50, hWnd,(HMENU)ID_BUTTON, hInst, NULL);
            hBut=CreateWindow(L"button",L"Да",WS_CHILD | WS_VISIBLE |BS_DEFPUSHBUTTON, 450, 450, 100, 50, hWnd,(HMENU)ID_BUTTON, hInst, NULL);
            SetFocus(hEdit);
            return 0;

        }
    case WM_COMMAND:
        { switch (LOWORD(wParam))
            { case ID_EDIT:
                {  if ((HIWORD(wParam))==EN_ERRSPACE)
                    MessageBox(hWnd,L"Мало памяти",szTitle,MB_OK);
                return 0;
                }
                case ID_BUTTON:
                    {
                    SendMessage(hEdit,EM_GETLINE,0,(LPARAM)chBuff);
                    MessageBox(hWnd, (LPCWSTR)chBuff,szTitle,MB_OK);
                    SetWindowText(hEdit,(LPCWSTR)"\0");
                    SetFocus(hEdit);
                    return 0;
                    }
                case SB_LINEDOWN:
                    { 
                        // при нажатии кнопки скролла записываем значение из строки в буфер
                        // преобразовываем буфер в int
                        // увеличиваем на единицу
                        //  преобразовываем в char
                        // передаем результат строке ?????????
                        SendMessage(hEdit,EM_GETLINE,0,(LPARAM)chBuff); // записали в буффер
                        x=int(chBuff);  // преобразовали в int
                        while (x<10)    // уыеличиваем число пока оно меньше 10
                        { 
                        x++;// увеличили на 1 
                        }
                        chBuff[80]=char (x); // перобразовали обратно в char
                        
                        }    
        }
        return 0;        
        }
     case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}




Это сообщение отредактировал(а) xvr - 16.12.2011, 17:49
PM MAIL   Вверх
xvr
Дата 16.12.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Sekmegalife @  16.12.2011,  16:53 Найти цитируемый пост)
Код

                       // при нажатии кнопки скролла записываем значение из строки в буфер
                        // преобразовываем буфер в int
                        // увеличиваем на единицу
                        //  преобразовываем в char
                        // передаем результат строке ?????????
                        SendMessage(hEdit,EM_GETLINE,0,(LPARAM)chBuff); // записали в буффер
                        x=int(chBuff);  // преобразовали в int
                        while (x<10)    // уыеличиваем число пока оно меньше 10
                        { 
                        x++;// увеличили на 1 
                        }
                        chBuff[80]=char (x); // перобразовали обратно в char
                        
                        }  
  

Сильно! Но неправильно  smile 
Что бы из строки сделать число можно позвать strtoul или atoi (ну или sscanf в крайнем случае)

Что бы сделать из числа строку проще всего воспользоваться sprintf

Вместо while (x<10) явно должно быть if (x<10)

Ну и для установки числа обратно в Edit нужно воспользоваться сообщением WM_SETTEXT
Кстати, для EM_GETLINE нужно специальным образом проинициализировать chBuff, лучше возьмите WM_GETTEXT

PM MAIL   Вверх
Sekmegalife
Дата 16.12.2011, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насколько я понял, должно выглядеть примерно так:
Код

case SB_LINEDOWN:
                    { 

                         SendMessage(hEdit, WM_GETTEXT, 0, (LPARAM)chBuff);   // записали в буффер
                              i=atoi(chBuff);  // в int
                         while (i<10)
                         {
                         i++;
                         }
                         
                         wsprintf((LPWSTR)chBuff,(LPWSTR)"%d",i);
                         SendMessage(hEdit,WM_SETTEXT,0,i);                
                        }    

нет под рукой на чём проверить работоспособность...

M
GremlinProg
для оформления кода пользуйтесь кнопкой "Код"


Это сообщение отредактировал(а) GremlinProg - 19.12.2011, 06:18
PM MAIL   Вверх
feodorv
Дата 16.12.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



У Вас опять while (i<10) smile 

У меня же другой вопрос. Ваш проект UNICODE? Почему на определение char chBuff[80] Вы делаете приведение типа (LPWSTR)chBuff? И что выйдет из этого: (LPWSTR)"%d"smile 
Безумное смешение _T(...)L"..." и (LPWSTR)... smile 

Для SendMessage(...WM_SETTEXT...) нужно посылать буфер, а не переменную i.
И для WM_GETTEXT нужно задавать размер буфера в символах...

Это сообщение отредактировал(а) feodorv - 16.12.2011, 22:05


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Sekmegalife
Дата 19.12.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё-таки сделал немного по-другому... Может пригодиться кому-то:
Код

case WM_VSCROLL:
        {
                    switch(LOWORD(wParam))
                    {
                        case SB_LINEUP:
                            {
                                int f=1, z=1;
                        SendMessage(hEdit,EM_GETLINE,0,(LPARAM)t);
                        lo=GetWindowTextLength(hEdit);
                        chislo[f][z] = atoi(t);
chislo[f][z]+=1;
 _itoa_s(chislo[f][z],massiv[f][z].txt,10);
SetWindowText(hEdit,massiv[f][z].txt);
 
                          break;
                            }
                        case SB_LINEDOWN:
                            {
 
                                int f=1, z=1;
                        SendMessage(hEdit,EM_GETLINE,0,(LPARAM)t);
                        lo=GetWindowTextLength(hEdit);
                        chislo[f][z] = atoi(t);
chislo[f][z]-=1;
 _itoa_s(chislo[f][z],massiv[f][z].txt,10);
SetWindowText(hEdit,massiv[f][z].txt);
 
                                break;
                            }
                        
                    } 
                    
    case WM_COMMAND:
            { switch (LOWORD(wParam))
                { 
                case ID_EDIT:
                {  if ((HIWORD(wParam))==EN_ERRSPACE)
                    MessageBox(hWnd, "Мало памяти",szTitle,MB_OK);
                return 0;
                }
                
            case ID_BUT:
                    {
                    SendMessage(hEdit,EM_GETLINE,0,(LPARAM)t);
                    lo=GetWindowTextLength(hEdit);
                    strncpy_s(massiv[1][1].txt,t,lo);
                    MessageBox(hWnd, massiv[1][1].txt,szTitle,MB_OK);
                     
                    return 0;
                    }    
                case ID_BUTTON:
                    {
                         PostQuitMessage(0); 
                    break;


M
GremlinProg
для оформления кода пользуйтесь кнопкой "Код"


Это сообщение отредактировал(а) GremlinProg - 19.12.2011, 06:18
PM MAIL   Вверх
Sphinx
Дата 19.12.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть же готовая API-шная функция - CreateUpDownControl. Программа упрощается в разы.
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.0807 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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