Frage

Mein Ziel ist es, einfach eine Pop-up-Box zu verwenden, um die Benutzer zu einer Eingabe zu fragen. Ich habe ziemlich viel gesucht herum und so ziemlich alle Ergebnisse sagen, dass eine messageBox schaffen, ist wirklich einfach:

MessageBox (NULL, "Hello World" , "Hello", MB_OKCANCEL);

Aber das ein Pop-up zu schaffen, die Eingabe erfolgt ist mehr beteiligt, und es gibt keine gerade vorwärts Weg, es zu tun. Alle Ergebnisse ich auf Google waren datiert irgendwo von 2001 bis 2005 über Ich glaube, ich bin hier zu fragen, ob einige weitere straight forward-Lösung in den letzten Jahren hat sich gefunden.

Hoffentlich etwas schön und gerade nach vorne wie in Java:

int number = JOptionPane.showInputDialog ("Enter an integer");

Wenn das nicht der Fall ist, könnte ich eine kurze Erklärung davon, wie es zu tun?


Edit: ich nichts zu Arbeit bekommen kann. :( Ich landete den Code zu schreiben, die Arbeit in Java zu tun, und schrieb dann eine Zeile von C ++ Code, um die .jar-Datei aufzurufen: - /. Da die Frage der Zeit empfindlich war, es war besser als nichts

.
War es hilfreich?

Lösung

Es gibt nichts, wie das für reine C ++. Im Grunde, was Sie versuchen, nur zu tun, indem Sie einen API-Aufruf an das Betriebssystem oder die mithilfe einer GUI-Bibliothek wie Qt erreicht werden (was ich denn es empfehlen ist waaaaay einfacher dann ruft nativen APIs und es ist auch Multi-Plattform)

Mit Qt können Sie einen Eingabedialog zeigen so ziemlich das gleiche wie Sie es auf Java zu tun:

bool ok;
QString text = QInputDialog::getText(
        "MyApp 3000", "Enter your name:", QLineEdit::Normal,
        QString::null, &ok, this );
if ( ok && !text.isEmpty() ) {
    // user entered something and pressed OK
} else {
    // user entered nothing or pressed Cancel
}

Sie können die Qt-Bibliothek hier herunterladen: qt.nokia.com/products/developer-tools /

Andere Tipps

Wenn Sie Visual C ++ Express verwenden gibt es eine Reihe von freien Ressourcen-Editoren, die verwendet werden können, Dialoge zu erstellen. ResEdit ist eines der besseren, die ich gefunden habe.

Sie brauchen eine Dialogressource in einer RC-Datei erstellen, die Sie zu Ihrem Projekt hinzufügen.

Dann Es ist ein sehr einfacher Fall von Aufrufen DialogBox - das wird das Dialogfeld aus Ihrer Ressource-Datei laden und legen sie sie auf dem Bildschirm. Der in DialogProc weitergegeben wird mit einer Reihe von Meldungen aufgerufen werden. Normalerweise würden Sie FALSCH für alles zurück, aber behandeln WM_INITDIALOG als Ort, um den Edit-Control mit Text zu initialisieren, und WM_COMMAND wird gesendet, wenn eine Schaltfläche geklickt wird.

Microsoft ist nicht der Ansicht Ihren Anwendungsfall häufig genug zu optimieren sein, wie mit MessageBox. Sie erwarten, dass Sie einen Dialog legen, mit vielen Kontrollen auf sie, vielleicht mit einigen komplexen Interaktion mit den Kontrollen, und nur reagieren, wenn der Dialog vollständig ausgefüllt ist. Was Sie für Fragen ist nur die vereinfachte Version von dem.

Die Ressourcen-Editor ist der einfachste Weg, um einen Dialog zu schaffen, aber das ist nicht in der freien Express-Version von Visual Studio enthalten. Sie würden entwerfen Sie den Dialog mit einer Textsteuerung für die prompten und ein Bearbeitungssteuer für den Benutzer ausfüllen. Sie präsentieren den Dialog mit der DialogBox Windows-Funktion, und es zurückgibt, wenn der Benutzer die OK-Taste oder die X trifft in der Ecke der Dialog. Microsoft hat eine Dokumentation für das hier .

Es gibt einige Plattformen zur Verfügung, die versucht, den Prozess zu erleichtern, wie MFC, WTL, Qt und wx, aber das ist, wie Sie es mit dem reinen Windows-API tun würden.

Ich muss zugeben, dass ich nicht wirklich viel in der Art von Eingabefeldern in Alter getan, aber man im Grunde außerhalb C gehen müssen ++, um jede Art von grafischen Eingabefeld zu erhalten. Es gibt einfach in die Sprache keinen Mechanismus für diese Art von Sachen für die Portabilität Gründen gebaut. Ich erinnere mich nicht, ob es in C ++ als auch angewandt, aber C nicht einmal annehmen, dass Sie eine Konsole haben. Wie auch immer, die beste Wahl etwas entlang der Linien würden Sie bereits versuchen. Win32-API, Qt, etc. Wenn Sie die Konsole verwenden können, aber fühlen Sie sich frei, nur die iostream-Bibliothek zu verwenden, die Arbeit zu erledigen

Meine Antwort basiert auf Stephen Quan Antwort auf wie laden und eine VBScript-Funktion aus C ++? Hinzugefügt vollständiger UTF-8-Unterstützung rufen, wie Sie von den Code-Kommentaren in der CPP-Datei sammeln können. Microsoft Script Control Anders als mit der InputBox zu erstellen, kann dies in x86 verwendet werden und x64 ausführbaren Dateien, Bibliotheken und Steuerelemente.

"inputbox.h":

extern "C" char *InputBox(char *Prompt, char *Title = (char *)"", char *Default = (char *)"");
extern "C" char *PasswordBox(char *Prompt, char *Title = (char *)"", char *Default = (char *)"");

"inputbox.cpp":

#include "inputbox.h"

// Windows API
#include <windows.h>

// VBScript InputBox
#include <atlbase.h>
#include <activscp.h>
#include <comdef.h>

// UTF-8 Support
#include <wchar.h>
#include <string>
#include <vector>

using std::string;
using std::vector;

typedef std::basic_string<wchar_t> tstring;

static tstring StringWiden(string Str)
{
    const size_t wchar_tCount = Str.size() + 1;

    vector<wchar_t> Buffer(wchar_tCount);

    return tstring{ Buffer.data(), (size_t)MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), -1, Buffer.data(), wchar_tCount) };
}

static string StringShorten(tstring Str)
{
    int nBytes = (size_t)WideCharToMultiByte(CP_UTF8, 0, Str.c_str(), (int)Str.length(), NULL, 0, NULL, NULL);

    vector<char> Buffer((size_t)nBytes);

    return string{ Buffer.data(), (size_t)WideCharToMultiByte(CP_UTF8, 0, Str.c_str(), (int)Str.length(), Buffer.data(), nBytes, NULL, NULL) };
}

static string StringReplaceAll(string Str, string SubStr, string NewStr)
{
    size_t Position = 0;
    const size_t SubLen = SubStr.length(), NewLen = NewStr.length();

    while ((Position = Str.find(SubStr, Position)) != string::npos)
    {
        Str.replace(Position, SubLen, NewStr);
        Position += NewLen;
    }

    return Str;
}

static string CPPNewLineToVBSNewLine(string NewLine)
{
    size_t Position = 0;

    while (Position < NewLine.length())
    {
        if (NewLine[Position] == '\n' || NewLine[Position] == '\r')
            NewLine.replace(Position, 2, "\" + vbNewLine + \"");

        Position += 1;
    }

    return NewLine;
}

class CSimpleScriptSite :
    public IActiveScriptSite,
    public IActiveScriptSiteWindow
{
public:
    CSimpleScriptSite() : m_cRefCount(1), m_hWnd(NULL) { }

    // IUnknown

    STDMETHOD_(ULONG, AddRef)();
    STDMETHOD_(ULONG, Release)();
    STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);

    // IActiveScriptSite

    STDMETHOD(GetLCID)(LCID *plcid) { *plcid = 0; return S_OK; }
    STDMETHOD(GetItemInfo)(LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) { return TYPE_E_ELEMENTNOTFOUND; }
    STDMETHOD(GetDocVersionString)(BSTR *pbstrVersion) { *pbstrVersion = SysAllocString(L"1.0"); return S_OK; }
    STDMETHOD(OnScriptTerminate)(const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) { return S_OK; }
    STDMETHOD(OnStateChange)(SCRIPTSTATE ssScriptState) { return S_OK; }
    STDMETHOD(OnScriptError)(IActiveScriptError *pIActiveScriptError) { return S_OK; }
    STDMETHOD(OnEnterScript)(void) { return S_OK; }
    STDMETHOD(OnLeaveScript)(void) { return S_OK; }

    // IActiveScriptSiteWindow

    STDMETHOD(GetWindow)(HWND *phWnd) { *phWnd = m_hWnd; return S_OK; }
    STDMETHOD(EnableModeless)(BOOL fEnable) { return S_OK; }

    // Miscellaneous

    STDMETHOD(SetWindow)(HWND hWnd) { m_hWnd = hWnd; return S_OK; }

public:
    LONG m_cRefCount;
    HWND m_hWnd;
};

STDMETHODIMP_(ULONG) CSimpleScriptSite::AddRef()
{
    return InterlockedIncrement(&m_cRefCount);
}

STDMETHODIMP_(ULONG) CSimpleScriptSite::Release()
{
    if (!InterlockedDecrement(&m_cRefCount))
    {
        delete this;
        return 0;
    }
    return m_cRefCount;
}

STDMETHODIMP CSimpleScriptSite::QueryInterface(REFIID riid, void **ppvObject)
{
    if (riid == IID_IUnknown || riid == IID_IActiveScriptSiteWindow)
    {
        *ppvObject = (IActiveScriptSiteWindow *)this;
        AddRef();
        return NOERROR;
    }
    if (riid == IID_IActiveScriptSite)
    {
        *ppvObject = (IActiveScriptSite *)this;
        AddRef();
        return NOERROR;
    }
    return E_NOINTERFACE;
}

static HHOOK hHook = 0;
static bool HideInput = false;

static LRESULT CALLBACK InputBoxProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < HC_ACTION)
        return CallNextHookEx(hHook, nCode, wParam, lParam);

    if (nCode = HCBT_ACTIVATE)
    {
        if (HideInput == true)
        {
            HWND TextBox = FindWindowExA((HWND)wParam, NULL, "Edit", NULL);
            SendDlgItemMessage((HWND)wParam, GetDlgCtrlID(TextBox), EM_SETPASSWORDCHAR, '*', 0);
        }
    }

    if (nCode = HCBT_CREATEWND)
    {
        if (!(GetWindowLongPtr((HWND)wParam, GWL_STYLE) & WS_CHILD))
            SetWindowLongPtr((HWND)wParam, GWL_EXSTYLE, GetWindowLongPtr((HWND)wParam, GWL_EXSTYLE) | WS_EX_DLGMODALFRAME);
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

static char *InputBoxHelper(char *Prompt, char *Title, char *Default)
{
    HRESULT hr = S_OK;
    hr = CoInitialize(NULL);

    // Initialize
    CSimpleScriptSite *pScriptSite = new CSimpleScriptSite();
    CComPtr<IActiveScript> spVBScript;
    CComPtr<IActiveScriptParse> spVBScriptParse;
    hr = spVBScript.CoCreateInstance(OLESTR("VBScript"));
    hr = spVBScript->SetScriptSite(pScriptSite);
    hr = spVBScript->QueryInterface(&spVBScriptParse);
    hr = spVBScriptParse->InitNew();

    // Replace quotes with double quotes
    string strPrompt = StringReplaceAll(Prompt, "\"", "\"\"");
    string strTitle = StringReplaceAll(Title, "\"", "\"\"");
    string strDefault = StringReplaceAll(Default, "\"", "\"\"");

    // Create evaluation string
    string Evaluation = "InputBox(\"" + strPrompt + "\", \"" + strTitle + "\", \"" + strDefault + "\")";
    Evaluation = CPPNewLineToVBSNewLine(Evaluation);
    tstring WideEval = StringWiden(Evaluation);

    // Run InpuBox
    CComVariant result;
    EXCEPINFO ei = {};

    DWORD ThreadID = GetCurrentThreadId();
    HINSTANCE ModHwnd = GetModuleHandle(NULL);
    hr = pScriptSite->SetWindow(GetAncestor(GetActiveWindow(), GA_ROOTOWNER));
    hHook = SetWindowsHookEx(WH_CBT, &InputBoxProc, ModHwnd, ThreadID);
    hr = spVBScriptParse->ParseScriptText(WideEval.c_str(), NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &result, &ei);
    UnhookWindowsHookEx(hHook);


    // Cleanup
    spVBScriptParse = NULL;
    spVBScript = NULL;
    pScriptSite->Release();
    pScriptSite = NULL;

    CoUninitialize();
    static string strResult;
    _bstr_t bstrResult = (_bstr_t)result;
    strResult = StringShorten((wchar_t *)bstrResult);
    return (char *)strResult.c_str();
}

char *InputBox(char *Prompt, char *Title, char *Default)
{
    HideInput = false;

    return InputBoxHelper(Prompt, Title, Default);
}

char *PasswordBox(char *Prompt, char *Title, char *Default)
{
    HideInput = true;

    return InputBoxHelper(Prompt, Title, Default);
}

Erstellen Sie die beiden oben genannten Dateien und fügen Sie dann zu Ihrem Visual Studio-Projekt.

In jeder Datei, die Sie die Eingabe oder Passwort-Box-Funktionen wollen, (im Header gefunden), ist einfach die Header:

#include "inputbox.h"

// use functions here

ich auch loswerden der Standard-Windows-Anwendung-Symbol in der Titelleiste des VBScript InputBox bekam, weil eine Menge Leute, die ich gesehen habe darüber beklagen, wie hässlich es ist zu sehen, dass es.

Lassen Sie mich wissen, wenn Sie Fragen haben.

ein Konsolenfenster verwenden ist besser auf die Art der Kommunikation geeignet, bei denen ein Programm fordert den Benutzer auf, setzt, fordert den Benutzer wieder, und so weiter.

Und, dass Sie die Standard-Bibliothek Einrichtungen wie cin und cout verwenden können.

Im Gegensatz zu Visual Basic und anderen Sprachen gibt es kein Eingabefeld wie Befehl in c „eingebaut“ ++. Im Gegensatz zu MessageBox, die gerade aufgerufen werden können, InputBox () muss geschrieben werden. In der Tat, ich habe es getan. In dem folgenden Artikel wird beschrieben, wie man Umsetzung solche InputBox als Teil einer kleinen statische Bibliothek, die verwendet werden kann, ohne Ressourcen von jedem Win32 c ++ Programm. Quellcode auf Github . Es kann wie folgt verwendet werden:

LPWSTR GetString(LPCTSTR szCaption, LPCTSTR szPrompt, LPCTSTR szDefaultText = L"");

Zum Beispiel:

LPWSTR result = SG_InputBox::GetString(
     L"Code Project Demo", 
     L"What is your name");

versuchen Sie dies: InputBox in c ++ VS2010

#include "stdafx.h"
#using <system.windows.forms.dll>
#using <Microsoft.VisualBasic.dll>

using namespace System;

int main(array<System::String ^> ^args)
{
    Microsoft::VisualBasic::Interaction::InputBox(L"Hello", L"Title", L"DefResp", 500, 500);
    return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top