在 Gui Win32 中创建子窗口C++
Create child window in C++ Gui Win32
我是 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`
}
}
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 如何为窗口截屏
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息