在 Gui Win32 中创建子窗口C++

Create child window in C++ Gui Win32

本文关键字:窗口 C++ 创建 Gui Win32      更新时间:2023-10-16

我是 c++ win32 编程的新手。 我正在使用Visual Studio 2015版本进行开发。 我想从主窗口创建子窗口并使用子窗口执行一些任务。 请指导我如何创建多个子窗口并执行与数据库相关的功能。 这是我的代码,任何人都可以帮助我为什么子窗口没有创建?

#include <Windows.h>
#define ITEM_MASTER         1
#define CLIENT_MASTER       2
#define QUIT_APP            3
#define ADD_ITEM            4
#define VIEW_ITEM           5
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);           // main window call back
LRESULT CALLBACK DialogProcedure(HWND, UINT, WPARAM, LPARAM );          // child window call back
void AddMenu(HWND);
void CreateNewItem(HWND);
void ViewItemMaster(HWND);
void registerDialogClass(HINSTANCE);
void displayDialog(HWND );
HMENU hMenu;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {  //main function
//MessageBox(NULL, "Hello world !!", "My first Gui", MB_OK);
WNDCLASSW wc = { 0 };
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = hInst;
wc.lpszClassName = L"myWindowClass";
wc.lpfnWndProc = WindowProcedure;
if (!RegisterClassW(&wc)) {
return -1;
}
registerDialogClass(hInst);
HWND hWnd=CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500,
NULL, NULL, NULL, NULL);
ShowWindow(hWnd, ncmdshow);
UpdateWindow(hWnd);
MSG msg = { 0 };
while (GetMessage((&msg), NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {  // callback
switch (msg) {
case WM_COMMAND:
switch (wp) {
case QUIT_APP:
DestroyWindow(hWnd);
break;
case ADD_ITEM:
displayDialog(hWnd);
//                  CreateNewItem(hWnd);
break;
case VIEW_ITEM:
ViewItemMaster(hWnd);
break;
}
break;
case WM_CREATE:
displayDialog(hWnd);
AddMenu(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd,msg,wp,lp);
}
return 0;
}
void AddMenu(HWND hWnd) {          // different menu
hMenu = CreateMenu();
HMENU hMstMenu = CreateMenu();
HMENU hItemMenu = CreateMenu();
AppendMenu(hItemMenu, MF_STRING, ADD_ITEM, "Add Product");       // sub-sub master
AppendMenu(hItemMenu, MF_STRING, VIEW_ITEM, "View Product");
AppendMenu(hMstMenu, MF_POPUP, (UINT_PTR)hItemMenu, "Product Master");   // sub master
AppendMenu(hMstMenu, MF_STRING, CLIENT_MASTER, "Client Master");
AppendMenu(hMstMenu, MF_SEPARATOR, NULL,NULL);
AppendMenu(hMstMenu, MF_STRING, QUIT_APP, "Quit");
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMstMenu, "Master");        //main master
AppendMenu(hMenu, MF_STRING, NULL, "Transaction");
SetMenu(hWnd, hMenu);
}
void CreateNewItem(HWND hWnd1) {               // some db functionality
CreateWindowW(L"static", L"Code :", WS_VISIBLE | WS_CHILD , 50, 50, 48, 20, hWnd1, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER, 100, 50, 100, 20, hWnd1, NULL, NULL, NULL);                                        // some db functionality
CreateWindowW(L"static", L"Name :", WS_VISIBLE | WS_CHILD, 50, 75, 48, 20, hWnd1, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER, 100, 75, 100, 20, hWnd1, NULL, NULL, NULL);                                // some db functionality
}
void ViewItemMaster(HWND hWnd) {             // some db functionality
CreateWindowW(L"static", L"Rate :", WS_VISIBLE | WS_CHILD, 50, 50, 48, 20, hWnd, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER, 100, 50, 100, 20, hWnd, NULL, NULL, NULL);                                      // some db functionality
}

LRESULT CALLBACK DialogProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {     // callback
switch (msg) {
case WM_CLOSE:
DestroyWindow(hWnd);
break;
default:
DefWindowProcW(hWnd,msg,wp,lp);
}
return 0;
}
void registerDialogClass(HINSTANCE hInst) {               // registration for child window
WNDCLASSW d1 = { 0 }; 
ZeroMemory(&d1, sizeof(WNDCLASS));
d1.hbrBackground = (HBRUSH)COLOR_WINDOW;               // initialize window class
d1.hCursor = LoadCursor(NULL, IDC_ARROW);
d1.hInstance = hInst;
d1.lpszClassName = L"myDialogClass";
d1.lpfnWndProc = DialogProcedure;                  // call back procedure
RegisterClassW(&d1);                              // register class
}
void displayDialog(HWND hWnd) {                         // creating child window
HWND hDlg=CreateWindowW(L"myDialogClass", L"New Product", WS_VISIBLE | WS_OVERLAPPEDWINDOW|WS_CHILD, 400, 400, 200, 200, hWnd, NULL, NULL, NULL);         // create child window
CreateNewItem(hDlg);
}

子窗口进程正在破坏窗口创建过程。

像这样修改:

LRESULT CALLBACK DialogProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {     // callback
switch (msg) {
case WM_CLOSE:
DestroyWindow(hWnd);
break;
default:
return DefWindowProcW(hWnd, msg, wp, lp); // Need to add `return` 
}
}