【问题标题】:no window appears in Visual C++ programVisual C++ 程序中不出现窗口
【发布时间】:2011-08-28 12:35:21
【问题描述】:

我正在开发一个 Win32 应用程序,当应用程序在登录窗口中启动时用户登录,然后主窗口打开

但是当我运行程序时,什么也没有出现。

这是代码

HINSTANCE   ghInstance;
HWND hWnd;

HWND hWndPopUp;

LRESULT WINAPI PopUpWndProc( HWND hWnd2, UINT msg, WPARAM wParam, LPARAM lParam );
LRESULT WINAPI  MainWndProc( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam );

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpszCmdLine , int nCmdShow){

WNDCLASS wc;
WNDCLASS wcPopUp;
MSG msg;
//HWND hWnd;
BOOL bRet;

if( !hPrevInstance )
{

    wc.lpszClassName    =   L"MainAppClass" ;

    wc.lpfnWndProc      =   MainWndProc ;

    wc.style            =   CS_OWNDC    |   CS_VREDRAW  |   CS_HREDRAW ;

    wc.hInstance        =   hInstance ;

    wc.hIcon            =   LoadIcon( NULL, IDI_APPLICATION ) ;

    wc.hCursor          =   LoadCursor( NULL, IDC_ARROW ) ;

    wc.hbrBackground    =   (HBRUSH)( COLOR_WINDOW+1 ) ;

    wc.lpszMenuName     =   NULL ;

    wc.cbClsExtra       =   0 ;

    wc.cbWndExtra       =   0 ;

    RegisterClass( &wc ) ;

    wcPopUp.lpszClassName   =   L"PopUpAppClass" ;

    wcPopUp.lpfnWndProc     =   PopUpWndProc ;

    wcPopUp.style           =   CS_OWNDC    |   CS_VREDRAW  |   CS_HREDRAW ;

    wcPopUp.hInstance       =   hInstance ;

    wcPopUp.hIcon           =   LoadIcon( NULL, IDI_APPLICATION ) ;

    wcPopUp.hCursor         =   LoadCursor( NULL, IDC_ARROW ) ;

    wcPopUp.hbrBackground   =   (HBRUSH)( COLOR_WINDOW+1 ) ;

    wcPopUp.lpszMenuName        =   NULL ;

    wcPopUp.cbClsExtra      =   0 ;

    wcPopUp.cbWndExtra      =   0 ;

    RegisterClass( &wcPopUp );

}

ghInstance = hInstance;

hWndPopUp = CreateWindowEx(WS_EX_CONTEXTHELP,                         
                        wcPopUp.lpszClassName,                          
                        L"Stock Ticker Login",                          
                        WS_OVERLAPPEDWINDOW,
                        0,
                        0,
                        CW_USEDEFAULT,                          
                        CW_USEDEFAULT,                          
                        NULL,                           
                        NULL,                           
                        hInstance,                          
                        NULL
                    );


bool show = ShowWindow( hWndPopUp, SW_MAXIMIZE  ) ;

UpdateWindow(hWndPopUp);

hPE = NULL;


/** While there is no WM_QUIT message in the Message Queue
    Fetch Message from the queue and Dispatch it to WindowProc()
**/
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )
{
    if (bRet == -1)
    {
        // handle the error and possibly exit

        int nerror = GetLastError();

        MessageBox(hWnd,L"Window Error",L"Window error", MB_ICONERROR);

        exit(1);
    } 

    else {

        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
}

return (int)msg.wParam;

}

LRESULT WINAPI PopUpWndProc( HWND hWnd2, UINT msg, WPARAM wParam, LPARAM lParam ){

HDC hdc;
PAINTSTRUCT ps;

RECT rc;
GetClientRect(hWnd, &rc);

int height  = rc.bottom - rc.top;
int width = rc.right -rc.left;

switch( msg )
{

    case WM_CREATE:

        hWndStaticUsername = CreateWindowEx(    0
                                            , L"static"
                                            , L"Username"
                                            , WS_CHILD | WS_VISIBLE
                                            , rc.left + width/8
                                            , rc.top + height/4
                                            , 100
                                            , 30
                                            , hWnd2
                                            , 0
                                            , ghInstance
                                            , 0
                                    );

        hWndEditUsername = CreateWindowEx(  WS_EX_CLIENTEDGE
                                        , L"edit"
                                        , L""
                                        , WS_CHILD | WS_VISIBLE
                                        , rc.left + width/8 + 150
                                        , rc.top + height/4 
                                        , 150
                                        , 30
                                        , hWnd2
                                        , 0
                                        , ghInstance
                                        , 0
                                );
        hWndBtnLogin = CreateWindowEx(  0
                                    , L"button"
                                    , L"Login"
                                    , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON
                                    , rc.left + width/8
                                    , rc.top + height/4 + 80 
                                    , 50
                                    , 30
                                    , hWnd2
                                    , 0
                                    , ghInstance
                                    , 0
                            );

        break;

    case WM_COMMAND:

        if(HIWORD(wParam)== BN_CLICKED  && lParam==(LPARAM)hWndBtnLogin )
        {
            TCHAR* uname =new TCHAR;
            Edit_GetText(hWndEditUsername, uname, 20);

            if(wcscmp(uname,L"")==0)

                return 0;

            else 
            {
                StartTicker(uname);
                DestroyWindow(hWnd);
            }

        }

        break;

    case WM_DESTROY:

        hWnd = CreateWindowEx(WS_EX_CONTEXTHELP,                          
                        L"MainAppClass",                            
                        L"Assignment 2",                            
                        WS_OVERLAPPEDWINDOW,
                        0,
                        0,
                        CW_USEDEFAULT,                          
                        CW_USEDEFAULT,                          
                        NULL,                           
                        NULL,                           
                        ghInstance,                         
                        NULL
                    );

        ShowWindow( hWnd, SW_MAXIMIZE ) ;

        UpdateWindow(hWnd);

        break;

    default:

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

return 0;

}

请帮我找到解决办法。

【问题讨论】:

    标签: visual-studio-2010 winapi visual-c++


    【解决方案1】:
        return DefWindowProc(hWnd, msg, wParam, lParam );
    

    窗口句柄错误,应该是hWnd2。

    为了让这篇文章超越“为我调试代码”的答案,有两件基本的事情你做错了,它们会给你带来更多的麻烦:

    • 选择好的变量名太草率了。您应该从不有一个名为“hWnd”的全局变量。那当然应该是 hWndMain,你永远不会犯这个错误。
    • 没有任何错误检查。如果有的话,您很快就会发现 CreateWindowEx() 返回 NULL 而 GetLastError() 返回 1400。如果不进行错误检查,您只能观察它的异常行为,而无法诊断它。

    使用原始 winapi 需要对这些小细节一丝不苟。考虑改用类库。

    【讨论】:

    • 感谢您富有洞察力的回答,您为我节省了很多时间。是的,你是对的 Windows 编程需要高度关注,即使是一个小错误也可能需要数小时才能解决。我刚刚开始使用win32 api,我必须使用原始api,甚至不是MFC。但是,我从这个错误中吸取了很多教训。感谢您的帮助
    • 同样的问题在 GetClientRect(hWnd, &rc);
    【解决方案2】:

    你怎么打来的:

    ShowWindow( hWnd, SW_MAXIMIZE ) ;
    UpdateWindow(hWnd);
    

    仅在以下范围内:case WM_DESTROY:

    我想你在正常执行中调用 ShowWindow 而不是在破坏中:)

    【讨论】:

    • 不,那是另一个窗口,它应该在第一个关闭后打开,但第一个(我正在创建并在 WINMAIN 中显示)没有出现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多