Edit в дочернем окне неактивен.
От: Deviant.Developer  
Дата: 17.08.10 11:26
Оценка:
Здравствуйте, уважаемые форумчане. Мне очень нужна Ваша помощь.
Учусь писать GUI на Visual C++.
Логика моей задачи такая: появляется основное окно и тут же появляется диалоговое окно, в котором пользователю предлагается ввести данные.

Что делаю:


#include <windows.h>
//----------------------------------------------------------------------------------
LRESULT CALLBACK MainframeProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY: {PostQuitMessage(0); return 0;}
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
//----------------------------------------------------------------------------------
LRESULT CALLBACK LogonframeProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY: {CloseWindow(hwnd); return 0;}
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
//----------------------------------------------------------------------------------
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, HINSTANCE hInstance)
{
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, Proc, 0, 0, 
                  hInstance, LoadIcon(NULL, IDI_APPLICATION), LoadCursor(NULL, IDC_ARROW), 
                  (HBRUSH)GetStockObject(GRAY_BRUSH), 0, szName, LoadIcon(NULL, IDI_APPLICATION)};
    return (RegisterClassEx(&wc) != 0);
}
//----------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    
    RegClass(MainframeProc, L"Mainframe", hInstance);
    HWND hMainWnd=CreateWindow(L"Mainframe", L"клиент", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, NULL);
    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);
    //---создаем дочернее окно для ввода логина
        RegClass(LogonframeProc, L"LogonFrame", hInstance);
        HWND LogonWnd=CreateWindowEx(0,L"LogonFrame",L"авторизация",
                                WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_SIZEBOX | WS_MINIMIZEBOX |WS_SYSMENU | WS_MAXIMIZEBOX, 
                                0, 0, 200,200,hMainWnd,NULL,hInstance,NULL);
        //--создаем на окне авторизации элемент ввода
        CreateWindowEx(WS_EX_CLIENTEDGE,L"EDIT",L"",WS_CHILD|WS_VISIBLE|ES_PASSWORD,
                    10,50,125,25,LogonWnd,(HMENU)4953495,NULL,NULL);
    //---
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}


Вот такой код я набросал.
Что не получается: Edit в дочернем окне не активен и туда не вводится информация.
Если его родительским окном назначить основное, то всё ОК.

Вопросы:
Правильная ли логика и структура программы вообще?
Почему эдит неактивен и как это исправить?
Правильно ли, что дочернее окно и его элементы я создаю в WinMain или лучше запихнуть всё это в обработчик WM_CREATE основного окна? И почему лучше?
Ну и просто покритикуйте код, я ещё только учусь, мог допустить совершенно тупые ошибки именно в логике.

Очень надеюсь на дискуссию с Вами, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.