0

ユーザー名とパス用のテキストボックス、表示出力用のロックされたテキストボックス、およびログインボタンを備えた小さなウィンドウが表示されました。ログインプロセスはうまく機能します。

ログインに成功したら、ウィンドウを変更して、ユーザー名とパスワードの 2 つのテキスト ボックスを非表示にするか、ロックするか、当分の間削除するか、どちらか簡単な方にする必要があります。また、ログインに成功した後、ボタンのテキストをログインではなく「ログアウト」に変更する必要があります。ボタンからアクションを選択する前にloggedin boolをチェックすることで、ボタンの動作をすでに変更できますが、ボタンのテキストを変更する方法がわかりません。または、別のボタンに置​​き換えます。可視性の切り替え、テキストボックス/ウィンドウの削除などを検索しました。何も見つからないようです。それらを削除して別の WM_CREATE インスタンスをトリガーすることができれば、その場合はログイン後に 2 番目のレイアウトを作成できますが、削除する方法がわかりません。おそらくそれは通常の方法ではありません。私の質問に答えるか、これを行う別の方法を提案してください。ありがとうございました

私のコード:

#include "StdAfx.h"
#include "Resource.h"
#include <windows.h>
#include <string>

#define IDC_MAIN_BUTTON 101         // Button identifier
#define IDC_MAIN_EDIT   102         // Edit box identifier
HWND hEdit, hEdit2, noEdit;
bool loggedin = false;

LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
    WNDCLASSEX wClass;
    ZeroMemory(&wClass,sizeof(WNDCLASSEX));
    wClass.cbClsExtra=NULL;
    wClass.cbSize=sizeof(WNDCLASSEX);
    wClass.cbWndExtra=NULL;
    wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
    wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wClass.hIcon=NULL;
    wClass.hIconSm=NULL;
    wClass.hInstance=hInst;
    wClass.lpfnWndProc=(WNDPROC)WinProc;
    wClass.lpszClassName="Window Class";
    wClass.lpszMenuName=NULL;
    wClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClassEx(&wClass))
    {
        int nResult=GetLastError();
        MessageBox(NULL,
            "Window class creation failed\r\n",
            "Window Class Failed",
            MB_ICONERROR);
    }

    HWND hWnd=CreateWindowEx(NULL,
            "Window Class",
            "Windows application",
            WS_OVERLAPPEDWINDOW,
            200,
            200,
            300,
            200,
            NULL,
            NULL,
            hInst,
            NULL);

    if(!hWnd)
    {
        int nResult=GetLastError();

        MessageBox(NULL,
            "Window creation failed\r\n",
            "Window Creation Failed",
            MB_ICONERROR);
    }

    ShowWindow(hWnd,nShowCmd);

    MSG msg;
    ZeroMemory(&msg,sizeof(MSG));
    connect();
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
        {
            // Create an edit box
            hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
                "EDIT",
                "",
                WS_CHILD|WS_VISIBLE|
                ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
                50,
                70,
                200,
                25,
                hWnd,
                (HMENU)IDC_MAIN_EDIT,
                GetModuleHandle(NULL),
                NULL);
            hEdit2=CreateWindowEx(WS_EX_CLIENTEDGE,
                "EDIT",
                "",
                WS_CHILD|WS_VISIBLE|
                ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
                50,
                95,
                200,
                25,
                hWnd,
                (HMENU)IDC_MAIN_EDIT,
                GetModuleHandle(NULL),
                NULL);

                noEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
                "EDIT",
                "",
                WS_CHILD|WS_VISIBLE|ES_READONLY|
                ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
                50,
                20,
                200,
                50,
                hWnd,
                (HMENU)IDC_MAIN_EDIT,
                GetModuleHandle(NULL),
                NULL);

            HGDIOBJ hfDefault=GetStockObject(DEFAULT_GUI_FONT);

            SendMessage(hEdit,
                WM_SETFONT,
                (WPARAM)hfDefault,
                MAKELPARAM(FALSE,0));

            SendMessage(hEdit2,
                WM_SETFONT,
                (WPARAM)hfDefault,
                MAKELPARAM(FALSE,0));

            SendMessage(noEdit,
                WM_SETFONT,
                (WPARAM)hfDefault,
                MAKELPARAM(FALSE,0));


            SendMessage(hEdit,
                WM_SETTEXT,
                NULL,
                (LPARAM)"Nolan");

            SendMessage(hEdit2,
                WM_SETTEXT,
                NULL,
                (LPARAM)"password");

            // Create a push button

                HWND hWndButton=CreateWindowEx(NULL,
                "BUTTON",
                "Login",
                WS_TABSTOP|WS_VISIBLE|
                WS_CHILD|BS_DEFPUSHBUTTON,
                50,
                120,
                100,
                24,
                hWnd,
                (HMENU)IDC_MAIN_BUTTON,
                GetModuleHandle(NULL),
                NULL);

                SendMessage(hWndButton,
                WM_SETFONT,
                (WPARAM)hfDefault,
                MAKELPARAM(FALSE,0));


        }
        break;

        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_MAIN_BUTTON:
                {

                    char buffer[256];
                    SendMessage(hEdit,
                        WM_GETTEXT,
                        sizeof(buffer)/sizeof(buffer[0]),
                        reinterpret_cast<LPARAM>(buffer));
                    string user(buffer);
                    SendMessage(hEdit2,
                        WM_GETTEXT,
                        sizeof(buffer)/sizeof(buffer[0]),
                        reinterpret_cast<LPARAM>(buffer));
                    string pass(buffer);

                    if(login(user, pass))   
                    {
                        loggedin = true;
                        MessageBox(NULL, "You logged in!", "Information", MB_ICONINFORMATION);
                    }

                    else
                    {
                        loggedin = false;
                        MessageBox(NULL, "incorrect username or password", "Information", MB_ICONINFORMATION);
                    }
                }
                break;
            }
            break;

        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
        break;
    }

    return DefWindowProc(hWnd,msg,wParam,lParam);
}
4

1 に答える 1

1

ShowWindow() を使用して、必要のないコントロールを非表示にすることができます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx

あなたはこれを学んでいるようですが、メッセージループで各ボタンとコントロールのコードを処理する必要がある場合、これはかなり混乱する可能性があるため、よりOOPアプローチを使用することをお勧めします.

于 2013-09-07T23:27:36.303 に答える