Здравствуйте, уважаемые форумчане. Мне очень нужна Ваша помощь.
Учусь писать 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 основного окна? И почему лучше?
Ну и просто покритикуйте код, я ещё только учусь, мог допустить совершенно тупые ошибки именно в логике.
Очень надеюсь на дискуссию с Вами, спасибо.