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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetInputString есть что-то подобное в WINAPI ? 
:(
    Опции темы
andrew_121
Дата 22.8.2009, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Здравствуйте!

Подскажите, есть ли в WINAPI функция которая отображает диалог с единственным полем для ввода?

Спасибо!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GremlinProg
Дата 22.8.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(andrew_121 @  22.8.2009,  08:50 Найти цитируемый пост)
Подскажите, есть ли в WINAPI функция которая отображает диалог с единственным полем для ввода?

не встречал, но можно написать, если не так охота добавлять ресурс: http://msdn.microsoft.com/en-us/library/ms...plate_in_memory


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
andrew_121
Дата 22.8.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



GremlinProg, Спасибо!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
NeoRus
Дата 22.8.2009, 19:53 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Делаешь окно класса Edit, без стиля WS_CHILD, получиться окно которое состоит из одного поля ввода
PM MAIL   Вверх
andrew_121
Дата 23.8.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(GremlinProg @  22.8.2009,  12:15 Найти цитируемый пост)
можно написать, если не так охота добавлять ресурс: http://msdn.microsoft.com/en-us/library/ms...plate_in_memory 

Попробовал этот код. Вот что получилось smile 
user posted image
Вопрос: Эти контролы можно заставить отрисовываться как все нормальные контролы в виндавз? А то напоминает виндавз 3.1 smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 23.8.2009, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Все же решил сделать ресурс для диалога. Но есть проблема. Диалог появляется, он он какой-то подозрительный. То окно что под ним, затирает его контролы. Но если по ним попасть мышью, то они активируются и перерисовываются.
Вот код ресурса:
Код

#define IDD_DIALOGBAR                   103
#define INPUT_STRING                    1007
#define BUTTON_CANCEL                   1008
#define BUTTON_OK                       1009
#define MESSAGE_TEXT                    -1


А это сам код:
Код

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    RECT rect;
    /**  */
    switch (uMsg) {
        case WM_INITDIALOG: {
            return TRUE;
        }
        case WM_COMMAND: {
            switch (LOWORD(wParam)) {
                case BUTTON_OK: {
                    return TRUE;
                }
                case BUTTON_CANCEL: {
                    EndDialog(hwndDlg, LOWORD(wParam));
                    return FALSE;
            }
            }
            break;
        }
        case WM_PAINT: {
            BeginPaint(hwndDlg, &ps);
            GetClientRect(hwndDlg, &rect);
            EndPaint(hwndDlg, &ps);
            break;
        }
        default: {
            return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
        }
    }
    return FALSE;
}

tstring InputDialog(HWND hwnd, const tstring& text) {
    tstring result;
    
    HWND wnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGBAR), hwnd, DialogProc);
    ShowWindow(wnd, SW_SHOW);
    
    return result;
}


Что я не так делаю?
Еще мне не понятно как из поля ввода, получить текст. Т.е. про SendMessage() я знаю, но не понимаю как с его помощью из функции DialogProc записать текст в переменную result в InputDialog().

Добавлено через 3 минуты и 19 секунд
И еще. Почему управление возвращается сразу? Должно возвращаться при нажатии на какую нибудь кнопку.

Это сообщение отредактировал(а) andrew_121 - 23.8.2009, 04:36


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
586
Дата 23.8.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Код
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    RECT rect;
    tstring *s;
    TCHAR buf[260];
    /**  */
    switch (uMsg) {
        case WM_INITDIALOG: {
            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
            if(lParam)
                SetDlgItemText(hwndDlg, IDC_EDIT1, reinterpret_cast<tstring*>(lParam)->c_str());
            break;
                            }
        case WM_CLOSE:
            EndDialog(hwndDlg, IDCANCEL);
            break;
        case WM_COMMAND: {
            switch (LOWORD(wParam)) {
        case IDOK: {
            s = reinterpret_cast<tstring*>(GetWindowLongPtr(hwndDlg, DWLP_USER));
            if(s) {
                GetDlgItemText(hwndDlg, IDC_EDIT1, buf, 260);
                *s = buf;
            }
            EndDialog(hwndDlg, IDOK);
            break;
                   }
        case IDCANCEL: {
            EndDialog(hwndDlg, IDCANCEL);
            break;
                       }
            }
            break;
                         }
        case WM_PAINT: {
            BeginPaint(hwndDlg, &ps);
            GetClientRect(hwndDlg, &rect);
            EndPaint(hwndDlg, &ps);
            break;
                       }
        default: {
            return FALSE;
                 }
    }
    return TRUE;
}

bool InputDialog(HWND hwnd, tstring& text) {
    tstring result = text;

    //HWND wnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGBAR), hwnd, DialogProc);
    //ShowWindow(wnd, SW_SHOW);
    if(DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGBAR), hwnd, DialogProc, (LPARAM)&result) == IDOK)
    {
        text = result;
        return true;
    }
    return false;
}


Кнопки BUTTON_OK и BUTTON_CANCEL лучше переименовать в IDOK и IDCANCEL.
Сообщения IDOK и IDCANCEL будут приходить ещё при нажатии Enter и Esc соответственно.

Это сообщение отредактировал(а) 586 - 23.8.2009, 11:59
PM   Вверх
andrew_121
Дата 23.8.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



586, Спасибо за код! Но еще проблемка осталась. Так же фоновое окно затирает диалог. И теперь никакие контролы не обрабатываются. Ощущение что программа висит. Что исправить?

Добавлено через 3 минуты и 4 секунды
Кнопки переименовал так как вы сказали.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
586
Дата 23.8.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Не должно быть проблем...
Убери лишние фигурные скобки и обработку сообщения WM_PAINT.
Все должно работать.
Если что не так - выложи скриншот.
Возможно, проблема в родительском окне...
Код
#include <windows.h>
#include <tchar.h>
#include <string>
#include "resource.h"

#ifndef UNICODE
#define tstring std::string
#else
#define tstring std::wstring
#endif

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    RECT rect;
    tstring *s;
    TCHAR buf[260];
    /**  */
    switch (uMsg)
    {
        case WM_INITDIALOG:
            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
            if(lParam)
                SetDlgItemText(hwndDlg, IDC_EDIT1, reinterpret_cast<tstring*>(lParam)->c_str());
            break;

        case WM_CLOSE:
            EndDialog(hwndDlg, IDCANCEL);
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case IDOK:
                s = reinterpret_cast<tstring*>(GetWindowLongPtr(hwndDlg, DWLP_USER));
                if(s) {
                    GetDlgItemText(hwndDlg, IDC_EDIT1, buf, 260);
                    *s = buf;
                }
                EndDialog(hwndDlg, IDOK);
                break;

            case IDCANCEL:
                EndDialog(hwndDlg, IDCANCEL);
                break;
            }
            break;

        default:
            return FALSE;
    }
    return TRUE;
}

bool InputDialog(HWND hwnd, tstring& text) {
    tstring result = text;

    //HWND wnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGBAR), hwnd, DialogProc);
    //ShowWindow(wnd, SW_SHOW);
    if(DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc, (LPARAM)&result) == IDOK)
    {
        text = result;
        return true;
    }
    return false;
}

INT APIENTRY _tWinMain(HINSTANCE hinst, HINSTANCE, LPTSTR, INT)
{
    tstring s = _T("asdfghjkl");
    InputDialog(NULL, s);
    MessageBox(NULL, s.c_str(), _T(""), 0);
    return 0;
}

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


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Все равно ничего путного не выходит. Затираются контролы. Как будто, диалог рисуется по хендлу основного окна.
Выкладываю файлы. Гляньте кто нибудь.

main.cpp
Код


#include <windows.h>
#include <tchar.h>
#include <string>
#include "resource.h"

#ifndef UNICODE
#define tstring std::string
#else
#define tstring std::wstring
#endif

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    RECT rect;
    tstring *s;
    TCHAR buf[260];
    /**  */
    switch (uMsg) {
        case WM_INITDIALOG:
            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
            if(lParam)
                SetDlgItemText(hwndDlg, MESSAGE_TEXT, reinterpret_cast<tstring*>(lParam)->c_str());
            break;
        case WM_CLOSE:
            EndDialog(hwndDlg, IDCANCEL);
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case IDOK:
                s = reinterpret_cast<tstring*>(GetWindowLongPtr(hwndDlg, DWLP_USER));
                if(s) {
                    GetDlgItemText(hwndDlg, INPUT_STRING, buf, 260);
                    *s = buf;
                }
                EndDialog(hwndDlg, IDOK);
                break;
            case IDCANCEL:
                EndDialog(hwndDlg, IDCANCEL);
                break;
            }
            break;
        default:
            return FALSE;
    }
    return TRUE;
}
tstring InputDialog(HWND hwnd, const tstring& text) {
    if(DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGBAR), hwnd, DialogProc, (LPARAM)&text) == IDOK) {
        return text;
    }
    return tstring();
}

INT APIENTRY _tWinMain(HINSTANCE hinst, HINSTANCE, LPTSTR, INT) {
    tstring s = _T("Test");
    InputDialog(NULL, s);
    return 0;
}



resource.h
Код

#define IDD_DIALOGBAR                   103
#define INPUT_STRING                    1007
#define BUTTON_CANCEL                   1008
#define BUTTON_OK                       1009
#define MESSAGE_TEXT                    -1


resource.rc
Код


#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
#include "afxres.h"
#undef APSTUDIO_READONLY_SYMBOLS

IDD_DIALOGBAR DIALOGEX 0, 0, 272, 47
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_CAPTION
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
    LTEXT           "Static",MESSAGE_TEXT,6,6,259,8
    EDITTEXT        INPUT_STRING,6,28,138,12,ES_AUTOHSCROLL
    PUSHBUTTON      "Cancel",IDCANCEL,215,26,50,14
    PUSHBUTTON      "Ok",IDOK,156,26,50,14
END



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 24.8.2009, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(andrew_121 @  23.8.2009,  01:54 Найти цитируемый пост)
Вопрос: Эти контролы можно заставить отрисовываться как все нормальные контролы в виндавз? А то напоминает виндавз 3.1 smile  

manifest в помощь


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 24.8.2009, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(mes @  24.8.2009,  01:43 Найти цитируемый пост)
manifest в помощь 

Так я уже в другом направлении решил рыть. Пока неудачно smile 



--------------------
Удалил аккаунт. Прощайте!
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.1350 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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