LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: rambo0808

MiniGUI什么语句可获取主窗口句柄,等同于VC中AfxGetApp()->GetMainWnd();

[复制链接]
发表于 2007-4-23 11:25:23 | 显示全部楼层
MyDlgProc 中 ID_OK 接受到 MSG_COMMAND 事件后,直接
  1. SetTimer(GetMainWindowHandle(hWnd), IDTIMER, 20);
复制代码

不好吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-24 01:09:50 | 显示全部楼层
谢谢 DoDo 和 dave3068

根据你们的建议,我修改了一下,现在可以完成想要实现的功能了

代码我发在下面

但是这里依然存在几个问题

1、  dave3068   说的 :
** 在 WinPro 中CREATE的时候直接把 hWnd 保存到全局变量 h_MainWnd。**

对你的这句话按照我的理解,我做的修改是代码中 加粗 的部分,不知道是否是你的本来的意思?如果不是,希望你提供一下你的意思的代码表示,
我对你所说的“保存”还有点不明确,谢谢。

2、DoDo  的意思是 SetTimer(GetMainWindowHandle(hWnd), IDTIMER, 20);

我试试了很多方法,包括  SetTimer(GetParent(hDlg), IDTIMER, 20);

还是不能成功,希望大家再帮帮忙,一起探讨一下问题的所在。

谢谢你们二位了!!!


  1. #include <stdio.h>

  2. #include <minigui/common.h>   
  3. #include <minigui/minigui.h>
  4. #include <minigui/gdi.h>
  5. #include <minigui/window.h>
  6. #include <minigui/control.h>

  7. #define IDTIMER          0
  8. #define IDC_DISP1        1000
  9. #define ID_OK            1001
  10. #define ID_CANCEL        1002
  11. #define ID_RECEIVE1      1003
  12. #define ID_RECEIVE2      1004

  13. [b]HWND hWnd1;[/b]

  14. static DLGTEMPLATE  MyDlg =
  15. {   WS_VISIBLE | WS_BORDER,
  16.     WS_EX_NONE,
  17.     512, 0, 128 ,480,
  18.     "",
  19.     0, 0,
  20.     3,
  21.     NULL,
  22.     0
  23. };

  24. static CTRLDATA CtrlInitData [] =
  25. {   
  26.   
  27.   {  "button",
  28.     WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
  29.     20, 50, 80,25,
  30.     ID_OK,
  31.     "开始扫描",
  32.     0,
  33.     WS_EX_NONE,
  34.   },

  35.   {  "button",
  36.     WS_VISIBLE | WS_TABSTOP,
  37.     20, 100, 80 ,25,
  38.     ID_CANCEL,
  39.     "停止扫描",
  40.     0,
  41.     WS_EX_NONE,
  42.   },

  43. {  "static",
  44.     WS_VISIBLE | SS_SIMPLE,
  45.     10, 300, 110 ,16,
  46.     IDC_DISP1,
  47.     "欢迎使用MiniGUI" ,
  48.     0,
  49.     WS_EX_NONE
  50.   }

  51. };

  52. static int MyDlgProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
  53.   {   
  54.    // HWND hWnd;
  55.     switch (message)
  56.        {
  57.         case MSG_INITDIALOG:
  58.                   printf("this is a test3\n");  
  59.                   return 1;

  60.         case MSG_COMMAND:
  61.               switch (wParam)
  62.                {
  63.                    case ID_OK:
  64.                        
  65.                        //  PostMessage(hWnd1, ID_RECEIVE1,0L, (LPARAM)ID_OK);******---also good---*********
  66.                            PostMessage(hWnd1, ID_RECEIVE1,0L, 0L);
  67.                            printf("this is a test6\n");
  68.                            break;
  69.   
  70.                    case  ID_CANCEL:

  71.                          PostMessage(hWnd1, ID_RECEIVE2,0L, 0L);
  72.                       // KillTimer(hDlg, IDTIMER);

  73.                          break;
  74.    
  75.                    default:
  76.                          break;
  77.                }
  78.         break;

  79.       
  80.         default:
  81.             return DefaultDialogProc(hDlg, message, wParam, lParam);
  82.     }
  83.     return 0;
  84. }

  85. static void InitDialogBox(HWND hWnd)
  86. {   MyDlg.controls = CtrlInitData;
  87.     DialogBoxIndirectParam(&MyDlg, hWnd, MyDlgProc, 0L);
  88. }


  89. static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
  90. {
  91.     HDC hdc;
  92.   [b]  hWnd1 = hWnd;[/b]
  93.     static BITMAP s_bmp;
  94.     static char bmpno[] = "00.jpg";

  95.     RECT rc = {0,0,512,480};

  96.     switch (message) {

  97.         case MSG_CREATE:
  98.             LoadBitmapFromFile(HDC_SCREEN, &s_bmp, bmpno);
  99.             hdc = BeginPaint (hWnd);
  100.             FillBoxWithBitmap (hdc, 0, 0, 512, 480, &s_bmp);
  101.             EndPaint(hWnd, hdc);
  102.             printf("this is a test1\n");
  103.             InitDialogBox(hWnd);
  104.             return 0;

  105.         case ID_RECEIVE1:
  106.                SetTimer(hWnd, IDTIMER, 20);
  107.                printf("this is a test7\n");
  108.                return 0;   
  109.         
  110.         case ID_RECEIVE2:
  111.               KillTimer(hWnd, IDTIMER);
  112.               break;

  113.         case MSG_TIMER:
  114.                 printf("this is a test4\n");
  115.                if(LOWORD(wParam) == IDTIMER)
  116.                InvalidateRect (hWnd, &rc, TRUE);
  117.                break;

  118.         case MSG_ERASEBKGND:
  119.             printf("this is a test2\n");

  120.             if(bmpno[1] == '9')

  121.              {  bmpno[0] = bmpno[0]+1;
  122.                bmpno[1] = '0';
  123.               }
  124.             else
  125.                {bmpno[1] = bmpno[1]+1;}

  126.            LoadBitmapFromFile(HDC_SCREEN, &s_bmp, bmpno);
  127.            hdc = BeginPaint (hWnd);
  128.            FillBoxWithBitmap (hdc, 0, 0, 512, 480, &s_bmp);
  129.            EndPaint(hWnd, hdc);
  130.             
  131.             if(bmpno[0] == '3' && bmpno[1] == '1')
  132.               {
  133.             bmpno[0] = '0';
  134.             bmpno[1] = '0';
  135.             }
  136.             
  137.             return 0;

  138.         default:

  139.     return DefaultMainWinProc(hWnd, message, wParam, lParam);
  140. }
  141.   return 0;
  142. }

  143. int MiniGUIMain (int argc, const char* argv[])
  144. {
  145.     MSG Msg;
  146.     HWND hMainWnd;
  147.     MAINWINCREATE CreateInfo;

  148. #ifdef _LITE_VERSION
  149.     SetDesktopRect(0, 0, 800, 600);
  150. #endif

  151.    CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER;
  152.     CreateInfo.dwExStyle = WS_EX_NONE;
  153.     CreateInfo.spCaption = "";
  154.     CreateInfo.hMenu = 0;
  155.     CreateInfo.hCursor = GetSystemCursor(0);
  156.     CreateInfo.hIcon = 0;
  157.     CreateInfo.MainWindowProc = WinProc;
  158.     CreateInfo.lx = 0;
  159.     CreateInfo.ty = 0;
  160.     CreateInfo.rx = 640;
  161.     CreateInfo.by = 480;
  162.     CreateInfo.iBkColor = PIXEL_lightwhite;
  163.     CreateInfo.dwAddData = 0;
  164.     CreateInfo.hHosting = HWND_DESKTOP;
  165.    
  166.     hMainWnd = CreateMainWindow (&CreateInfo);
  167.    
  168.     if (hMainWnd == HWND_INVALID)
  169.         return -1;
  170.     ShowWindow(hMainWnd, SW_SHOWNORMAL);

  171.     while (GetMessage(&Msg, hMainWnd)) {
  172.         TranslateMessage(&Msg);
  173.         
  174.         DispatchMessage(&Msg);
  175.     }

  176.     MainWindowThreadCleanup (hMainWnd);

  177.     return 0;
  178. }

  179. #ifndef _LITE_VERSION
  180. #include <minigui/dti.c>
  181. #endif

复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-24 09:25:41 | 显示全部楼层
我说的“保存”也就是赋值的意思拉,窗口创建后其HWND一般是不会变的(根据我以前使用Windows的经验来说,MiniGUI是否不同我就不知道了)
没必要每次WinProc的时候都赋值,只要在 MSG_CREATE 的时候赋值就可以了。
  1. static HWND hWnd1;
  2. static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
  3. {
  4.         // ...
  5.         switch (message) {
  6.         case MSG_CREATE:
  7.                 hWnd1 = hWnd;
  8.         // ...
  9. }
复制代码
其实,在 MiniGUIMain 中 CreateMainWindow 的时候赋值就可以了。
  1. static HWND hMainWnd;
  2. // ...
  3. int MiniGUIMain (int argc, const char* argv[])
  4. {
  5.         // ...
  6.         hMainWnd = CreateMainWindow (&CreateInfo);
  7.         // ...
  8. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-25 01:04:11 | 显示全部楼层
你说的对
没有必要每次都初始化
这样的话 有两个方法能够实现
1、 放在MSG—CREATE 中
2、 把 static hWnd1 = hWnd 把放在过程函数中, switch 前面,只在第一次进入时初始化


另外,你说的

  1. static HWND hMainWnd;
  2. // ...
  3. int MiniGUIMain (int argc, const char* argv[])
  4. {
  5.         // ...
  6.         hMainWnd = CreateMainWindow (&CreateInfo);
  7.         // ...
  8. }
复制代码


让 hMainWnd  来做窗口句柄,最后
PostMessage(hMainWnd, ID_RECEIVE1,0L, 0L)
来传ID—OK的消息,

这个方法我试了一下,还是不能实现。
我想应该是我们定义了 2 个客户区(显示窗口hWnd和控件窗口hDlg),他们都是放在 hMainWnd 上的,
所以用 PostMessage(hMainWnd, ID_RECEIVE1,0L, 0L)  还是找不到主过程函数的窗口句柄。

另外,你是否对 9楼 的代码中

  1.               case ID_OK:
  2.           //            PostMessage(GetMainWindowHandle(GetParent(hWnd)), ID_RECEIVE,0L, 0L);
  3.           //            PostMessage(GetParent(hDlg), ID_RECEIVE,0L, (LPARAM)ID_OK);
  4.           //            PostMessage(GetMainWindowHandle(hWnd), ID_RECEIVE,0L, 0L);
  5.           //            PostMessage(GetMainWindowHandle(hDlg), ID_RECEIVE,0L, (LPARAM)ID_OK);
  6.                      
  7.                          PostMessage(GetMainWindowHandle(hWnd), ID_RECEIVE,0L, (LPARAM)ID_OK);
  8.                         
  9.                          break;
复制代码


这部分代码有什么看法,因为通过
GetParent(hDlg),
GetMainWindowHandle(hWnd),
来获取主窗口句柄的办法一直都没有成功。

呵呵,谢谢你啊

今天 Where is DoDo?
回复 支持 反对

使用道具 举报

发表于 2007-4-25 11:16:52 | 显示全部楼层
我没搞过MiniGUI。不过,刚才从网上下了个<MiniGUI Prog. Guide>看了看。
from: <MiniGUI Prog. Guide>

MiniGUI 中有三种窗口类型:主窗口、对话框和控件窗口(子窗口)。每一个MiniGUI
应用程序一般都要创建一个主窗口,作为应用程序的主界面或开始界面。主窗口通常包括一
些子窗口,这些子窗口通常是控件窗口,也可以是自定义窗口类。应用程序还会创建其它类
型的窗口,例如对话框和消息框。对话框本质上就是主窗口,应用程序一般通过对话框提示
用户进行输入操作。消息框是用于给用户一些提示或警告的主窗口,属于内建的对话框类型。
GetParent()的结果会否是DESKTOP?GetMainWindowHandle()的结果会否是hDlg?
不知道“对话框的托管主窗口”和 Parent 是否意义相同?
不如你测试的时候,把 GetParent()/GetMainWindowHandle()/hDlg/hWnd/hMainWnd,都打印出来看看?
from: <MiniGUI Prog. Guide>

MiniGUI 中,使用 DialogBoxIndirectParam 函数建立的对话框就是模态对话框。
实际上,该对话框首先根据模板建立对话框,然后禁止其托管主窗口,并在主窗口的 MSG_CREATE 消息中创建控件,之后发送 MSG_INITDIALOG
消息给回调函数,最终建立一个新的消息循环,并进入该消息循环,直到程序调用 EndDialog函数为止。

我们也可以在 MiniGUI 中利用对话框模板建立普通的主窗口,即非模态对话框。
这时, 我们使用 CreateMainWindowIndirect 函数。
用 CreateMainWindowIndirect 替换 DialogBoxIndirectParam 试试?
回复 支持 反对

使用道具 举报

发表于 2007-4-25 11:23:16 | 显示全部楼层
Post by rambo0808

今天 Where is DoDo?

找我有事吗?貌似楼主的问题以经解决了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-26 01:48:58 | 显示全部楼层
就象你说的那样,把各种方法都试了,还是老样子

按照资料上的介绍,“对话框的托管主窗口”和 Parent 是一样的

这里就有个问题了

HWND_DESKTOP,   hMainWnd,   主过程函数的窗口句柄 hWnd, 他们之间是个什么关系?

到底谁是谁的 Parent?

用 CreateMainWindowIndirect 替换 DialogBoxIndirectParam  是个很好的注意

这点我再试一下

我把试的结果及时发上来~~~你们看问题都很有见解啊,佩服!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-26 01:57:28 | 显示全部楼层
呵呵
DoDo “貌似楼主的问题以经解决了”

此言诧异啊
大家一起讨论就热闹了哈
回复 支持 反对

使用道具 举报

发表于 2007-4-26 10:51:52 | 显示全部楼层
HWND_DESKTOP 一般是你的主窗口的 host

想知道 GetParent 或者类似的函数返回的究竟是什么东东,把它的返回值和已知的 hwnd 比较一下就知道了

上 LinuxSir,尽自己所能回复一些帖子,这是我的个人习惯,并没有想让这里变热闹的意思,如果我的参与讨论破坏了 linuxsir 冷静优雅的氛围,那么真是抱歉,我改进就是了。

BTW,我上面这句话并不是和楼主找碴,只是因为一个“热闹”的讨论技术的论坛真的很让人恶心,比如很多学校论坛
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-28 12:43:31 | 显示全部楼层
我们这里昨天光缆维修,断网了
我试了一下,有几点

1、HWND_DESKTOP系统自定义的最顶层托管窗口。
   hMainWnd 是我们自己定义的主窗口句柄,
   主函数中的 hWnd  是主函数中的形参,当系统调用Winproc()时,执行 hWnd = hMainWnd

2、在Winproc() 的MSG_CREATE中,执行 InitDialogBox(hWnd),实质就是执行  InitDialogBox(hMainWnd),()里面的 hMainWnd 就为控件窗口的母窗口句柄, 但是采用GetMainWindowHandle(hMainWnd),   GetParent(hDlg), GetMainWindowHandle(HWND_DESKTOP), 还是返回不了母窗口句柄~~~~

3、关于CreateMainWindowIndirect(),根据资料的介绍,有两种实现方式
  1. static void InitDialogBox(HWND hWnd)
  2. {   MyDlg.controls = CtrlInitData;
  3.     CreateMainWindowIndirect(&MyDlg, hWnd, MyDlgProc);
  4. }   
复制代码




  1. int MiniGUIMain (int argc, const char* argv[])
  2. {
  3.     MSG Msg;
  4.     HWND hMainWnd;
  5. [b]   HWND hwnd1;[/b]
  6.     MAINWINCREATE CreateInfo;

  7. #ifdef _LITE_VERSION
  8.     SetDesktopRect(0, 0, 800, 600);
  9. #endif

  10.    CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER;
  11.     CreateInfo.dwExStyle = WS_EX_NONE;
  12.     CreateInfo.spCaption = "";
  13.     CreateInfo.hMenu = 0;
  14.     CreateInfo.hCursor = GetSystemCursor(0);
  15.     CreateInfo.hIcon = 0;
  16.     CreateInfo.MainWindowProc = WinProc;
  17.     CreateInfo.lx = 0;
  18.     CreateInfo.ty = 0;
  19.     CreateInfo.rx = 640;
  20.     CreateInfo.by = 480;
  21.     CreateInfo.iBkColor = PIXEL_lightwhite;
  22.     CreateInfo.dwAddData = 0;
  23.     CreateInfo.hHosting = HWND_DESKTOP;
  24.    
  25.     hMainWnd = CreateMainWindow (&CreateInfo);
  26. [b]
  27.     MyDlg.controls = CtrlInitData;
  28.     hwnd1 =   CreateMainWindowIndirect(&MyDlg, hMainWnd, MyDlgProc);
  29. [/b]
  30.    
  31.     if (hMainWnd == HWND_INVALID)
  32.         return -1;
  33.     ShowWindow(hMainWnd, SW_SHOWNORMAL);

  34.     while (GetMessage(&Msg, hMainWnd)) {
  35.         TranslateMessage(&Msg);
  36.         
  37.         DispatchMessage(&Msg);
  38.     }

  39.     MainWindowThreadCleanup (hMainWnd);

  40.     return 0;
  41. }
复制代码


这两种方法都能编译成功,但是两种方法运行的结果都是运行到
  1.      case MSG_CREATE:
  2.             hdc = BeginPaint (hWnd);
  3.             FillBoxWithBitmap (hdc, 0, 0, 512, 480, &s_bmp);
  4.             EndPaint(hWnd, hdc);
  5.             printf("this is a test1\n");
  6.             InitDialogBox(hWnd);
  7.             return 0;
复制代码

输出 "this is a test1" 后,就显示 "已放弃"

然后就自动退出运行了。
在qvfb上,整个控件窗口都是没有显示的
资料上说 CreateMainWindowIndirect()虽然可以托管窗口,但是不进入消息循环的,在这里为什么连控件窗口的创建都有问题?

这三个问题都是试的结果。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表