afro228offical Опубликовано 27 июня, 2016 Поделиться Опубликовано 27 июня, 2016 Доброго времени суток . Мне нужно создать форму функциями winapi на языке c++ .Главную форму я создал. Скрытый текст Надо сделать так , чтобы при нажатии на кнопку создавалось ещё одно окно с другим именем и с каким-либо компонентом в нём (Хоть с той же кнопкой). Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 27 июня, 2016 Поделиться Опубликовано 27 июня, 2016 Джеффри РИХТЕР Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 27 июня, 2016 Автор Поделиться Опубликовано 27 июня, 2016 Никто подсказать не может ? Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 27 июня, 2016 Поделиться Опубликовано 27 июня, 2016 14 minutes ago, afro228offical said: Никто подсказать не может ? А в чем проблема? 1. Создай кнопку OK передав туда параметр HMENU Spoiler hwndButtonOK = CreateWindow( "BUTTON", // predefined class "OK", // button text WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles 10, // starting x position 90, // starting y position 100, // button width 30, // button height hwnd, // parent window (HMENU) 1, // ВОТ ЭТО ЗНАЧЕНИЕ (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL); // pointer not needed 2. В процедуру обработки оконных сообщений WndProc добавь в switch обработку константы WM_COMMAND, пример: Spoiler /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_COMMAND: switch (LOWORD(wParam)) { case 1: // ТУТ ВЫПОЛНИТСЯ ТВОЙ КОД ПРИ НАЖАТИИ НА КНОПКУ break; } break; case WM_DESTROY: PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } 3. И просто создавай через CreateWindow новое окно, и в него добавляй что тебе надо. P.S. Возможно это не самый лучший вариант, но этим вариантом я пользуюсь при создании TrainMe. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 27 июня, 2016 Автор Поделиться Опубликовано 27 июня, 2016 (изменено) Чет не помогло ... Изменено 27 июня, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 27 июня, 2016 Поделиться Опубликовано 27 июня, 2016 20 minutes ago, afro228offical said: Чет не помогло У меня работает ) Значит что-то не так у тебя. А разбираться придется тебе самому, врядли кто-то решится копаться в чужой шахте. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 28 июня, 2016 Автор Поделиться Опубликовано 28 июня, 2016 (изменено) 13 часа назад, holy сказал: У меня работает ) Значит что-то не так у тебя. А разбираться придется тебе самому, врядли кто-то решится копаться в чужой шахте. Нужно создавать класс дополнительного окна . Изменено 28 июня, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 28 июня, 2016 Автор Поделиться Опубликовано 28 июня, 2016 (изменено) Пока , получилось только окно в окне . Это мне не совсем подходит... Изменено 28 июня, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 28 июня, 2016 Автор Поделиться Опубликовано 28 июня, 2016 Вот . Делал как тут http://netcode.ru/cpp/?click=r-2482.php.htm Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 28 июня, 2016 Поделиться Опубликовано 28 июня, 2016 (изменено) 2 hours ago, afro228offical said: Пока , получилось только окно в окне . Это мне не совсем подходит... Тебе не хватает понимания того что ты делаешь. По этому не разобрался в моем примере и в том примере который ты привел по ссылке. Но не страшно, метод "тыка" тоже имеет место быть. В функции CreateWindowEx (которую ты наверняка используешь, ибо в коде по ссылке это именно она) четвертый параметр с конца это родительской HWND окна, установи его в NULL. И из стилей созданного окна убери WS_CHILD. А лучше, CTRL+C код для создания основного окна, CTRL+V туда где создаешь второе окно по клику. Изменено 28 июня, 2016 пользователем holy Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 28 июня, 2016 Автор Поделиться Опубликовано 28 июня, 2016 Ща попробую... Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 28 июня, 2016 Автор Поделиться Опубликовано 28 июня, 2016 Неа , не работает HWND child = CreateWindowEx(0, L"ChildWClass", (LPCTSTR)NULL, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 150, NULL, (HMENU)(int)(5), hinst, NULL); Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 28 июня, 2016 Поделиться Опубликовано 28 июня, 2016 ShowWindow(CreateWindowExW(0,WinName,WinName,WS_SYSMENU+WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,0,0,0,0,0,0),SW_SHOW); ShowWindow(CreateWindowExW(0,WinName,L"zzz",WS_SYSMENU+WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,0,0,0,0,0,0),SW_SHOW); хз что в этом сложного 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 29 июня, 2016 Автор Поделиться Опубликовано 29 июня, 2016 gmz , если честно , то ждал именно твоего ответа Ща попробую , отпишусь ... Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 29 июня, 2016 Автор Поделиться Опубликовано 29 июня, 2016 Окно нельзя передвинуть или закрыть ( Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 июня, 2016 Поделиться Опубликовано 29 июня, 2016 (изменено) 35 минуты назад, afro228offical сказал: Окно нельзя передвинуть или закрыть ( afro228offical, ты же вроде делаешь много трейнеров? 1. Можно задать свойства новой формы со стандартными свойствами окна Виндус (перетаскивание, закрытие, минимизация, максимизация и т.д.). (я С++ не знаю, но это не проблема найти в инете всю инфу). BorderStyle: bsSizeable - обычный вид окна Windows (Скорее всего нужно вместо вот этого: WS_SYSMENU+WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT поставить тоько это: bsSizeable. Но точно не знаю, так как трейнерами плотно не занимался.) 2. Для закрытия новой формы можно также создать кнопку на ней и прописать закрытие формы на событие - нажатия кнопки. Изменено 29 июня, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 июня, 2016 Поделиться Опубликовано 29 июня, 2016 2 часа назад, afro228offical сказал: Окно Вот примерчик твоей задачи на CE_LUA: скрипт: Скрытый текст F1 = createForm(true) B1 = createButton(F1) B1.Caption ='ОК!' control_onClick(B1,ClickB1) function ClickB1() Form2 = createForm() Button2 = createButton(Form2) Button2.Caption ='Что это?' control_onClick(Button2,ClickButton2) end function ClickButton2() showMessage('Это пример на CE_LUA для afro228offical.') end Результат (картинка): Скрытый текст 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 29 июня, 2016 Поделиться Опубликовано 29 июня, 2016 Пример создавал в Code::Blocks Полностью рабочий, но большая концентрация быдлокода. Spoiler #include <tchar.h> #include <windows.h> #include "windowsx.h" /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); int createdWindow = FALSE; HINSTANCE main_hThisInstance; /* Make the class name into a global variable */ TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp"); int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { main_hThisInstance = hThisInstance; HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ _T("Code::Blocks Template Windows App | Example for afro228offical"), /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); HWND hwndButtonOK = CreateWindow( "BUTTON", // predefined class "Click here", // button text WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles 10, // starting x position 90, // starting y position 100, // button width 30, // button height hwnd, // parent window (HMENU) 123, // ВОТ ЭТО ЗНАЧЕНИЕ main_hThisInstance, NULL); // pointer not needed /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK ChildProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam) { if (Message == WM_DESTROY ) { createdWindow = FALSE; return 0; } return DefWindowProc(hwnd,Message,wparam,lparam); } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_COMMAND: switch (LOWORD(wParam)) { case 123: if (createdWindow == TRUE) break; createdWindow = TRUE; // Создание второго окна WNDCLASS w; memset(&w,0,sizeof(WNDCLASS)); w.lpfnWndProc = ChildProc; w.hInstance = main_hThisInstance; w.hbrBackground = GetStockBrush(WHITE_BRUSH); w.lpszClassName = "ChildWClass"; RegisterClass(&w); HWND newWin = CreateWindowEx ( 0, /* Extended possibilites for variation */ w.lpszClassName, /* Classname */ _T("New window"), /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ main_hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); ShowWindow(newWin, SW_NORMAL); UpdateWindow(newWin); break; } break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 4 июля, 2016 Автор Поделиться Опубликовано 4 июля, 2016 (изменено) Всё работает , спасибо holy Изменено 4 июля, 2016 пользователем afro228offical Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения