Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Создание второго окна!


Автор: Marisha1989 1.11.2008, 00:29
Добрый день, помогите пожалуйста, разобратся, как можна создать и открыть второе окно, когда ты с первого окна нажимаеш на кнопку!
Тоесть вот этот код, он создает окно и выводим там объекты, а также объект hButton, вот мне нуно чтобы при нажатии на этоу кнопку убиралось первое окно и появлялось второе. 
Код

LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM IParam);
HINSTANCE hInstance;
LPCTSTR lpszClassName="MyApplication";
char szTitle[]="Добро пожаловать в игру,       ";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
HWND hWnd1;
WNDCLASSEX wndcl;

wndcl.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
wndcl.lpfnWndProc=(WNDPROC) WndProc;
wndcl.cbClsExtra = 0;
wndcl.cbWndExtra = 0;
wndcl.hInstance = hInstance;
wndcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wndcl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndcl.lpszMenuName = NULL;
wndcl.lpszClassName = lpszClassName;
wndcl.cbSize = sizeof (WNDCLASSEX);
wndcl.hIconSm=0;

if(!RegisterClassEx (&wndcl))
return (FALSE);


hWnd =CreateWindow(lpszClassName, "First", WS_OVERLAPPEDWINDOW,
                   CW_USEDEFAULT, 0, CW_USEDEFAULT,0,
                   NULL,NULL, hInstance, NULL);
if (!hWnd)
return (FALSE);
ShowWindow (hWnd, nCmdShow);
UpdateWindow(hWnd);

while (GetMessage(&msg, 0,0,0))
{
TranslateMessage (&msg);
DispatchMessage(&msg);
 }
return(msg.wParam);
}


LRESULT CALLBACK WndProc (HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM IParam)
{
LPCTSTR lpText;
LPCTSTR lpCaption;
HDC hdc;
RECT rect;
char mas[]="Введите имя:";
static HWND hEdit, hButton;
char chBuff[50];

switch(uMsg)
{
case WM_PAINT:
{
 PAINTSTRUCT ps;
 HDC hdc= BeginPaint(hWnd,&ps);
 GetClientRect(hWnd,&rect);
 DrawText(hdc,mas,-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
 EndPaint(hWnd,&ps);
return 0;
}
case WM_CREATE:
{
 hEdit=CreateWindow("edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT,330,300,300,20,\
                    hWnd,(HMENU)ID_EDIT,hInstance,NULL);


 hButton=CreateWindow("button","OK",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,430,350,100,30,
                      hWnd,(HMENU)ID_BUTTON,hInstance,NULL);



return 0;
}

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_EDIT:
{
if ((HIWORD(wParam))==EN_ERRSPACE)
MessageBox(hWnd,"Мало памяти",szTitle,MB_OK);
return 0;
}

case ID_BUTTON:
{

 return 0;
}
}
}


case WM_DESTROY:
{
        PostQuitMessage(0);
        break;
}
default:
        return(DefWindowProc(hWnd, uMsg, wParam, IParam));
}
return (0L);
}



Подскажите пожалуйста, может быть это как-то мона сделать через дочерное окно, куда именно надо напистаь и как это прописать???  smile 

Автор: BorisVorontsov 1.11.2008, 00:49
Тут так получается...

1. Регистрируешь новый оконный класс. Создаешь второй модуль, прописываешь там коллбэк-функцию для второго окна, в case ID_BUTTON создаешь второе окно посредством CreateWindow и вызываешь DestroyWindow для первого. Ну, и case WM_DESTROY: PostQuitMessage(0); переносишь в коллбэк-функцию второго окна.
2. Работаешь с тем же оконным классом. Так же в case ID_BUTTON создаешь второе окно и где-нибудь запоминаешь хэндл, затем вызываешь DestroyWindow для первого. В case WM_DESTROY смотришь, если hWnd равен хэндлу второго -- PostQuitMessage, иначе ничего не делать. Есть еще множество вариантов, но это самый простой.

Автор: Marisha1989 1.11.2008, 00:57
Пасибо, а скажи пожалуйста, просто закрасить или удалить все объекты с этой формы, по коду не будет менньше. Просто я так представила, что это еще столько же :(как бы нужно, чтобы при нажатии или появлялось другое окно, или же в этом опять писать, только чтобы оно было как бы очищено))) smile 

Автор: BorisVorontsov 1.11.2008, 12:31
Цитата(Marisha1989 @  1.11.2008,  00:57 Найти цитируемый пост)
просто закрасить или удалить все объекты с этой формы, по коду не будет менньше.


Меньше, чем по п. 2 не будет, будет экономней в плане потребления ресурсов... А что тебе нужно?

Автор: Marisha1989 1.11.2008, 20:39
нужно получить любым способом получить, чтобы при нажатии кнопки выводилось новое окно или это окно очищалось, чтобы было пустое поле в котором будут новые компоненты)))тоесть мона новое , а мона просто очистить, вот и ен могу придумать как :( smile 

Автор: HumanAPI 4.11.2008, 11:06
Вообще то программа в корне не правильна ))
Главная оконная функция должна оставаться для главного окна (тоесть для самой игры) а приглашение это всего лиш диалог который описывается в ресурсе и имеет свою оконную функцию.

Автор: Andrey44 4.11.2008, 11:30
Цитата(HumanAPI @  4.11.2008,  11:06 Найти цитируемый пост)
диалог который описывается в ресурсе

Совсем не обязательно.

Автор: Lycifer 10.11.2008, 19:04
Я не работаю с GUI, но насколько я помню по старой памяти:
Любой компонент это окно(button,text and someone)
Любому окну можно сделать visible, а точнее ShowWindow(descriptor, flag) -кажется так может что не так, не очень помню это было давно и не правда
Дескриптор своих элементов ты всегда можеш узнать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)