Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetInputString есть что-то подобное в WINAPI ?


Автор: andrew_121 22.8.2009, 06:50
Здравствуйте!

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

Спасибо!

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

не встречал, но можно написать, если не так охота добавлять ресурс: http://msdn.microsoft.com/en-us/library/ms644996(VS.85).aspx#template_in_memory

Автор: andrew_121 22.8.2009, 13:03
GremlinProg, Спасибо!

Автор: NeoRus 22.8.2009, 19:53
Делаешь окно класса Edit, без стиля WS_CHILD, получиться окно которое состоит из одного поля ввода

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

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

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

#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 секунд
И еще. Почему управление возвращается сразу? Должно возвращаться при нажатии на какую нибудь кнопку.

Автор: 586 23.8.2009, 11:58
Код
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 соответственно.

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

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

Автор: 586 23.8.2009, 18:43
Не должно быть проблем...
Убери лишние фигурные скобки и обработку сообщения 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;
}

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

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

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

manifest в помощь

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)