У меня есть форма окна, которая имеет простое меню и выполняет простую операцию, я хочу иметь возможность создать другую форму окна со всеми функциями строки меню, сообщения и т. Д. Как отдельную ветку, чтобы я могла затем поделитесь результатами операции во втором окне.
И.Е.
1) Открывается форма A Открывается форма B как отдельная тема
2) Форма А выполняет операцию
3) Форма A передает результаты по памяти в форму B
4) Результаты отображения формы B
Я не совсем понимаю, как это сделать, главное приложение работает нормально, но я не уверен, как добавить второе окно, если первое уже существует. Я думаю, что использование CreateWindow позволит мне создать другое окно, но опять же я не уверен, как получить доступ к насосу сообщений, чтобы я мог отвечать на определенные события, такие как WM_CREATE во втором окне.
Надеюсь, это имеет смысл.
Спасибо!
Edit:
Я попытался создать второе окно, и хотя это компилируется, окна не отображаются при сборке.
//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
//Fields
WCHAR buffer[256];
struct DiceData storage;
HWND hwnd;
// Act on current message
switch(message)
{
case WM_CREATE:
AddMenus(hMainWindow);
hwnd = CreateWindowEx(
0,
"ChildWClass",
(LPCTSTR) NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE,
0,
0,
0,
0,
hMainWindow,
NULL,
NULL,
NULL);
ShowWindow(hwnd, SW_SHOW);
break;
Любые предложения относительно того, почему это происходит?
Редактировать 2:
Это все, что есть, я понятия не имею, реализую ли я это право, но я пытался быть совместимым с созданием другого окна.
//////////////////
// WINDOWS MAIN //
//////////////////
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode)
{
// Declaration of window class (used to register program),
// handle to window (returned by CreateWindow)
// and windows message (holds messages received from windows)
WNDCLASS wcl;
WNDCLASS scl;
HWND hwnd;
MSG msg;
// Name of window and window class
LPCWSTR szWinName = L"DiceRoller - Producer";
LPCWSTR szClassName = L"DiceRollProd";
LPCWSTR szCWinName = L"Dice - Consumer";
LPCWSTR szCClassName = L"DiceRollCon";
// Set up the windows class struct
wcl.hInstance = hThisInst;
wcl.lpszClassName = szClassName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = 0;
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
// Set up the windows class struct
scl.hInstance = hThisInst;
scl.lpszClassName = szCClassName;
scl.lpfnWndProc = WindowFunc;
scl.style = 0;
scl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
scl.hCursor = LoadCursor(NULL, IDC_ARROW);
scl.lpszMenuName = NULL;
scl.cbClsExtra = 0;
scl.cbWndExtra = 0;
scl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
// Register the windows class
if(!RegisterClass(&wcl))
{
return 0;
}
if(!RegisterClass(&scl))
{
return 0;
}
// Create the main window
hwnd = CreateWindowEx(0,
szClassName,
szWinName,
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
100,
100,
400,
400,
HWND_DESKTOP,
NULL,
hThisInst,
NULL );
// Show the main window
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
// Main message processing loop
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
//////////////////////
// WINDOWS FUNCTION //
//////////////////////
LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
WPARAM wParam, LPARAM lParam)
{
//Fields
WCHAR buffer[256];
struct DiceData storage;
HWND hwnd;
// Act on current message
switch(message)
{
case WM_CREATE:
AddMenus(hMainWindow);
hwnd = CreateWindowEx(
0,
"ChildWClass",
(LPCTSTR) NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE,
CW_USEDEFAULT, // x location
CW_USEDEFAULT, // y location
400, // width
300, // height
hMainWindow,
NULL,
NULL,
NULL);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
break;