miniGui中创建多个子窗体及子窗体资源的回收
来源:互联网 发布:科幻片 知乎 编辑:程序博客网 时间:2024/05/23 13:03
1.一个工程中只要一个消息循环检测就可
while(GetMessage(&Msg,hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg)
}
MainWindowThreadCleanup(hMainWnd);
在MSG_CLOSE中的代码调用DestroyMainWindow(hWnd);
来销毁CreateMainWindow(&CreateInfo);的窗体,如果要退出整个工程,在
MSG_CLOSE中还要调用PostQuitMessage (hWnd);来是主消息循环退出,最后
调用MainWindowThreadCleanup(hMainWnd);来清理剩余资源
2.对于通过主循环界面弹出新增加的界面
1>如果是通过对话框模板 DLGTEMPLATE和 CTRLDATA来创建的,则对控件的一
些初始化可在过程回调函数的MSG_INITDIALOG中设置,设置完返回0,如果要
退出对应的模板只要在过程回调函数的MSG_CLOSE中调用EndDialog (hDlg, IDCANCEL);
并返回0就可
2>如果新弹出的对话框也是通过CreateMainWindow (&CreateInfo);创建的
则不需要在次调用
while(GetMessage(&Msg,hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg)
}来循环读取消息,因为这个可以和主界面消息循环共用.这时窗体内的控件需要在
本窗体的过程回调函数中的MSG_CREATE中通过CreateWindow(TRL_STATIC,
This_is_a_simple_static_control,
WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,
IDC_STATIC1,
10, 10, 180, 20, hWnd, 0);来创建,结束用break;
控件始化则可在MSG_INITDIALOG中设置。需要关闭对话框时,在MSG_CLOSE中调用
DestroyMainWindow(hWnd) 和 MainWindowCleanup(hWnd);来关闭窗体,结束返回0, 同时在 MSG_DESTROY中调用DestroyAllControls(hWnd);来销毁控件资源,结束返回0;
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#define IDC_DLGBUTTON 100
#define IDC_CREATEBUTTON 101
#define IDC_PROMPTINFO 200
#define IDC_PROGRESS 201
#define IDC_BUTTON 300
//通过对话框模板 DLGTEMPLATE和 CTRLDATA来创建
DLGTEMPLATE DlgInitProgress=
{
WS_BORDER | WS_CAPTION,
WS_EX_NONE,
120, 150, 400, 130,
"initializing...",
0, 0,
3, NULL,
0
};
CTRLDATA CtrlInitProgress[]=
{
{
"static",
WS_VISIBLE | SS_SIMPLE,
10, 10, 380, 16,
IDC_PROMPTINFO,
"initializing...",
0
},
{
CTRL_PROGRESSBAR,
WS_VISIBLE,
10, 40, 380, 20,
IDC_PROGRESS,
NULL,
0
},
{
"button",
WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
170, 70, 60, 25,
IDOK,
"sure",
0
}
};
static int
DialogBoxProc1 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_INITDIALOG:
return 1;
case MSG_COMMAND:
switch (wParam) {
case IDOK:
case IDCANCEL:
EndDialog (hDlg, wParam);
break;
}
break;
case MSG_CLOSE:
EndDialog (hDlg, IDCANCEL);
return 0;
}
return DefaultDialogProc (hDlg, message, wParam, lParam);
}
static void testDialogBox1 (HWND hWnd)
{
DlgInitProgress.controls = CtrlInitProgress;
DialogBoxIndirectParam (&DlgInitProgress, hWnd, DialogBoxProc1, 0L);
}
static HWND hMainWnd = HWND_INVALID;
static int ControlTestWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_CREATE:
CreateWindow (CTRL_BUTTON,
"Push_Button",
WS_CHILD | BS_PUSHBUTTON | BS_CHECKED | WS_VISIBLE,
IDC_BUTTON,
10, 10, 80, 40, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"Multiple_Lines_Push_Button",
BS_PUSHBUTTON | BS_MULTLINE | WS_VISIBLE,
IDC_BUTTON + 1,
110, 10, 80, 40, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"Normal_check_box",
BS_CHECKBOX | BS_CHECKED | WS_VISIBLE,
IDC_BUTTON + 2,
220, 10, 150, 40, hWnd, 0);
break;
case MSG_COMMAND:
{
if (wParam == IDCANCEL) {
PostMessage (hWnd, MSG_CLOSE, 0, 0);
}
}
break;
case MSG_DESTROY:
DestroyAllControls (hWnd);
hMainWnd = HWND_INVALID;
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
MainWindowCleanup (hWnd);
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}
static void InitCreateInfo2(PMAINWINCREATE pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_VISIBLE;
pCreateInfo->dwExStyle = WS_EX_NONE;
pCreateInfo->spCaption = "Button_controls";
pCreateInfo->hMenu = 0;
pCreateInfo->hCursor = GetSystemCursor(1);
pCreateInfo->hIcon = 0;
pCreateInfo->MainWindowProc = ControlTestWinProc;
pCreateInfo->lx = 0;
pCreateInfo->ty = 0;
pCreateInfo->rx = 520;
pCreateInfo->by = 350;
pCreateInfo->iBkColor = GetWindowElementColor (WE_MAINC_THREED_BODY);
pCreateInfo->dwAddData = 0;
pCreateInfo->hHosting = HWND_DESKTOP;
}
void button_demo (HWND hwnd)
{
MAINWINCREATE CreateInfo;
if (hMainWnd != HWND_INVALID) {
ShowWindow (hMainWnd, SW_SHOWNORMAL);
return;
}
InitCreateInfo2 (&CreateInfo);
CreateInfo.hHosting = hwnd;
hMainWnd = CreateMainWindow (&CreateInfo);
}
//主循环窗体过程回调函数
int DialogTestMainWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_CREATE:
CreateWindow (CTRL_BUTTON,
"打开 DLGTEMPLATE界面",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | BS_CHECKED,
IDC_DLGBUTTON,
20, 120, 230, 30, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"打开 CreateWindow界面",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | BS_CHECKED,
IDC_CREATEBUTTON,
20, 170, 230, 30, hWnd, 0);
break;
case MSG_COMMAND:
switch (wParam)
{
case IDC_DLGBUTTON:
testDialogBox1 (hWnd);
break;
case IDC_CREATEBUTTON:
button_demo (hWnd);
break;
}
break;
case MSG_DESTROY:
DestroyAllControls(hWnd);
return 0;
case MSG_CLOSE:
if (MessageBox (hWnd, "Are_you_sure_to_quit", "DlgTest",
MB_YESNOCANCEL | MB_ICONQUESTION |
MB_BASEDONPARENT) != IDYES)
return 0;
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}
static void InitCreateInfo (PMAINWINCREATE pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
pCreateInfo->dwExStyle = WS_EX_NONE | WS_EX_USEPRIVATECDC;
pCreateInfo->spCaption = "main widget";
pCreateInfo->hMenu = 0;
pCreateInfo->hCursor = GetSystemCursor (IDC_ARROW);
pCreateInfo->hIcon = 0;
pCreateInfo->MainWindowProc = DialogTestMainWinProc;
pCreateInfo->lx = 0;
pCreateInfo->ty = 0;
pCreateInfo->rx = 500;
pCreateInfo->by = 400;
pCreateInfo->iBkColor = COLOR_lightwhite;
pCreateInfo->dwAddData = 0;
pCreateInfo->hHosting = HWND_DESKTOP;
}
//主函数入口
//BITMAP bmp_bkgnd;
int MiniGUIMain (int args, const char* arg[])
{
MSG Msg;
MAINWINCREATE CreateInfo;
HWND hMainWnd;
#ifdef _MGRM_PROCESSES
int i;
const char* layer = NULL;
for (i = 1; i < args; i++) {
if (strcmp (arg[i], "-layer") == 0) {
layer = arg[i + 1];
break;
}
}
GetLayerInfo (layer, NULL, NULL, NULL);
if (JoinLayer (layer, arg[0], 0, 0 ) == INV_LAYER_HANDLE) {
printf ("JoinLayer: invalid layer handle.\n");
exit (1);
}
#endif
// if (LoadBitmap (HDC_SCREEN, &bmp_bkgnd, "./bkgnd.jpg"))
// return 1;
//MGPlusRegisterFashionLFRDR();
if(args > 1)
SetDefaultWindowElementRenderer(arg[1]);
InitCreateInfo (&CreateInfo);
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow (hMainWnd, SW_SHOWNORMAL);
while( GetMessage (&Msg, hMainWnd) ) {
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
MainWindowThreadCleanup (hMainWnd);
// UnloadBitmap (&bmp_bkgnd);
return 0;
}
#ifdef _MGRM_THREADS
#include <minigui/dti.c>
#endif
//Makefile
helloworld:miniguiHelloWorld.o
gcc -o helloworld miniguiHelloWorld.c -L/usr/local/lib -lminigui_ths -lpng -ldl -lm -lpthread -ljpeg
clean:
rm helloworld miniguiHelloWorld.o
while(GetMessage(&Msg,hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg)
}
MainWindowThreadCleanup(hMainWnd);
在MSG_CLOSE中的代码调用DestroyMainWindow(hWnd);
来销毁CreateMainWindow(&CreateInfo);的窗体,如果要退出整个工程,在
MSG_CLOSE中还要调用PostQuitMessage (hWnd);来是主消息循环退出,最后
调用MainWindowThreadCleanup(hMainWnd);来清理剩余资源
2.对于通过主循环界面弹出新增加的界面
1>如果是通过对话框模板 DLGTEMPLATE和 CTRLDATA来创建的,则对控件的一
些初始化可在过程回调函数的MSG_INITDIALOG中设置,设置完返回0,如果要
退出对应的模板只要在过程回调函数的MSG_CLOSE中调用EndDialog (hDlg, IDCANCEL);
并返回0就可
2>如果新弹出的对话框也是通过CreateMainWindow (&CreateInfo);创建的
则不需要在次调用
while(GetMessage(&Msg,hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg)
}来循环读取消息,因为这个可以和主界面消息循环共用.这时窗体内的控件需要在
本窗体的过程回调函数中的MSG_CREATE中通过CreateWindow(TRL_STATIC,
This_is_a_simple_static_control,
WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,
IDC_STATIC1,
10, 10, 180, 20, hWnd, 0);来创建,结束用break;
控件始化则可在MSG_INITDIALOG中设置。需要关闭对话框时,在MSG_CLOSE中调用
DestroyMainWindow(hWnd) 和 MainWindowCleanup(hWnd);来关闭窗体,结束返回0, 同时在 MSG_DESTROY中调用DestroyAllControls(hWnd);来销毁控件资源,结束返回0;
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#define IDC_DLGBUTTON 100
#define IDC_CREATEBUTTON 101
#define IDC_PROMPTINFO 200
#define IDC_PROGRESS 201
#define IDC_BUTTON 300
//通过对话框模板 DLGTEMPLATE和 CTRLDATA来创建
DLGTEMPLATE DlgInitProgress=
{
WS_BORDER | WS_CAPTION,
WS_EX_NONE,
120, 150, 400, 130,
"initializing...",
0, 0,
3, NULL,
0
};
CTRLDATA CtrlInitProgress[]=
{
{
"static",
WS_VISIBLE | SS_SIMPLE,
10, 10, 380, 16,
IDC_PROMPTINFO,
"initializing...",
0
},
{
CTRL_PROGRESSBAR,
WS_VISIBLE,
10, 40, 380, 20,
IDC_PROGRESS,
NULL,
0
},
{
"button",
WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
170, 70, 60, 25,
IDOK,
"sure",
0
}
};
static int
DialogBoxProc1 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_INITDIALOG:
return 1;
case MSG_COMMAND:
switch (wParam) {
case IDOK:
case IDCANCEL:
EndDialog (hDlg, wParam);
break;
}
break;
case MSG_CLOSE:
EndDialog (hDlg, IDCANCEL);
return 0;
}
return DefaultDialogProc (hDlg, message, wParam, lParam);
}
static void testDialogBox1 (HWND hWnd)
{
DlgInitProgress.controls = CtrlInitProgress;
DialogBoxIndirectParam (&DlgInitProgress, hWnd, DialogBoxProc1, 0L);
}
//通过CreateMainWindow (&CreateInfo);创建
static HWND hMainWnd = HWND_INVALID;
static int ControlTestWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_CREATE:
CreateWindow (CTRL_BUTTON,
"Push_Button",
WS_CHILD | BS_PUSHBUTTON | BS_CHECKED | WS_VISIBLE,
IDC_BUTTON,
10, 10, 80, 40, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"Multiple_Lines_Push_Button",
BS_PUSHBUTTON | BS_MULTLINE | WS_VISIBLE,
IDC_BUTTON + 1,
110, 10, 80, 40, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"Normal_check_box",
BS_CHECKBOX | BS_CHECKED | WS_VISIBLE,
IDC_BUTTON + 2,
220, 10, 150, 40, hWnd, 0);
break;
case MSG_COMMAND:
{
if (wParam == IDCANCEL) {
PostMessage (hWnd, MSG_CLOSE, 0, 0);
}
}
break;
case MSG_DESTROY:
DestroyAllControls (hWnd);
hMainWnd = HWND_INVALID;
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
MainWindowCleanup (hWnd);
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}
static void InitCreateInfo2(PMAINWINCREATE pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_VISIBLE;
pCreateInfo->dwExStyle = WS_EX_NONE;
pCreateInfo->spCaption = "Button_controls";
pCreateInfo->hMenu = 0;
pCreateInfo->hCursor = GetSystemCursor(1);
pCreateInfo->hIcon = 0;
pCreateInfo->MainWindowProc = ControlTestWinProc;
pCreateInfo->lx = 0;
pCreateInfo->ty = 0;
pCreateInfo->rx = 520;
pCreateInfo->by = 350;
pCreateInfo->iBkColor = GetWindowElementColor (WE_MAINC_THREED_BODY);
pCreateInfo->dwAddData = 0;
pCreateInfo->hHosting = HWND_DESKTOP;
}
void button_demo (HWND hwnd)
{
MAINWINCREATE CreateInfo;
if (hMainWnd != HWND_INVALID) {
ShowWindow (hMainWnd, SW_SHOWNORMAL);
return;
}
InitCreateInfo2 (&CreateInfo);
CreateInfo.hHosting = hwnd;
hMainWnd = CreateMainWindow (&CreateInfo);
}
//主循环窗体过程回调函数
int DialogTestMainWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_CREATE:
CreateWindow (CTRL_BUTTON,
"打开 DLGTEMPLATE界面",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | BS_CHECKED,
IDC_DLGBUTTON,
20, 120, 230, 30, hWnd, 0);
CreateWindow (CTRL_BUTTON,
"打开 CreateWindow界面",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | BS_CHECKED,
IDC_CREATEBUTTON,
20, 170, 230, 30, hWnd, 0);
break;
case MSG_COMMAND:
switch (wParam)
{
case IDC_DLGBUTTON:
testDialogBox1 (hWnd);
break;
case IDC_CREATEBUTTON:
button_demo (hWnd);
break;
}
break;
case MSG_DESTROY:
DestroyAllControls(hWnd);
return 0;
case MSG_CLOSE:
if (MessageBox (hWnd, "Are_you_sure_to_quit", "DlgTest",
MB_YESNOCANCEL | MB_ICONQUESTION |
MB_BASEDONPARENT) != IDYES)
return 0;
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);
}
static void InitCreateInfo (PMAINWINCREATE pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
pCreateInfo->dwExStyle = WS_EX_NONE | WS_EX_USEPRIVATECDC;
pCreateInfo->spCaption = "main widget";
pCreateInfo->hMenu = 0;
pCreateInfo->hCursor = GetSystemCursor (IDC_ARROW);
pCreateInfo->hIcon = 0;
pCreateInfo->MainWindowProc = DialogTestMainWinProc;
pCreateInfo->lx = 0;
pCreateInfo->ty = 0;
pCreateInfo->rx = 500;
pCreateInfo->by = 400;
pCreateInfo->iBkColor = COLOR_lightwhite;
pCreateInfo->dwAddData = 0;
pCreateInfo->hHosting = HWND_DESKTOP;
}
//主函数入口
//BITMAP bmp_bkgnd;
int MiniGUIMain (int args, const char* arg[])
{
MSG Msg;
MAINWINCREATE CreateInfo;
HWND hMainWnd;
#ifdef _MGRM_PROCESSES
int i;
const char* layer = NULL;
for (i = 1; i < args; i++) {
if (strcmp (arg[i], "-layer") == 0) {
layer = arg[i + 1];
break;
}
}
GetLayerInfo (layer, NULL, NULL, NULL);
if (JoinLayer (layer, arg[0], 0, 0 ) == INV_LAYER_HANDLE) {
printf ("JoinLayer: invalid layer handle.\n");
exit (1);
}
#endif
// if (LoadBitmap (HDC_SCREEN, &bmp_bkgnd, "./bkgnd.jpg"))
// return 1;
//MGPlusRegisterFashionLFRDR();
if(args > 1)
SetDefaultWindowElementRenderer(arg[1]);
InitCreateInfo (&CreateInfo);
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow (hMainWnd, SW_SHOWNORMAL);
while( GetMessage (&Msg, hMainWnd) ) {
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
MainWindowThreadCleanup (hMainWnd);
// UnloadBitmap (&bmp_bkgnd);
return 0;
}
#ifdef _MGRM_THREADS
#include <minigui/dti.c>
#endif
//Makefile
helloworld:miniguiHelloWorld.o
gcc -o helloworld miniguiHelloWorld.c -L/usr/local/lib -lminigui_ths -lpng -ldl -lm -lpthread -ljpeg
clean:
rm helloworld miniguiHelloWorld.o
0 0
- miniGui中创建多个子窗体及子窗体资源的回收
- 在主窗体中创建子窗体的方法
- MDI中在父窗体中从一个子窗体跳转到另一个另一个子窗体
- MFC多个子窗体覆盖
- DockPanel里如何在一个子窗体里打开另一个子窗体 显示在主窗体中
- C#中MDI子窗体的创建方法
- WINFORM 中mdi结构的子窗体不重复创建
- VC中如何将MDI的多个子窗体设置为不同的标题
- 一个关于C#中一次关闭多个子窗体的问题
- c#中如何打开并关闭多个子窗体的代码
- 在CMainFrame中创建MDI子窗体
- 子窗体创建过程
- Qt创建子窗体
- QT 创建子窗体
- 子线程创建窗体
- C# 父窗体中点击多个子窗体不出现重复
- 子窗体创建以及子窗体父窗体之间的通信
- 子窗体创建以及子窗体父窗体之间的通信2
- 求解偏微分方程开源有限元软件deal.II学习--Step 7
- STM32F407的外部中断设置_RCC_APB2PeriphClockCmd_RCC_APB2Periph_SYSCFG
- Android studio使用grdle打包
- WORD批量转图片助手v8.6最新版
- Unity Assetbundle的实战
- miniGui中创建多个子窗体及子窗体资源的回收
- 兼容ie8 的 rgba()用法
- UVA 1586 Molar mass
- AsyncTask源码分析
- 关于swift应用中的相关知识记录
- 高流量站点NGINX与PHP-fpm配置优化
- suricata 3.1 源码分析32 (FlowWorker处理流程1)
- Ubuntu12.04异常关机后无法开启的问题解决
- python自动优化之路-day2.1