none
[新手求助]最近刚学windows编程,遇到些困难,望高手支招。。 RRS feed

  • 问题

  • 用了n久的时间,终于学会了用win32api创建窗口。

    我想实现那种对话框的功能,就是说:

    在父窗口中通过某种操作,弹出一个子窗口,此时父窗口会变得无效,就是点击会发出"登"的警报声,只有当子窗口关闭后才可以重新对父窗口进行操作。

    因为只知道用CreatWindow,ShowWindow,EnableWindow之类的简单函数,还不知道有什么更直接的方法,因此自己yy出了一种很奇葩的方式,实现了这个功能。

    不过遇到了一些问题。。先上代码吧:

    #include <windows.h>
    
    /*父窗口类*/
    const TCHAR FatherClassName[20]="simplepro";//类名
    LRESULT CALLBACK FatherWndProc(HWND,UINT,WPARAM,LPARAM);//过程函数
    WNDCLASS FatherWnd={CS_HREDRAW|CS_VREDRAW,
                        FatherWndProc,
                        0,0,NULL,
                        LoadIcon(NULL, IDI_APPLICATION),
                        LoadCursor(NULL, IDC_ARROW),
                       (HBRUSH)GetStockObject(WHITE_BRUSH),
                        NULL,
                        FatherClassName};//初始化父窗口类
    /*子窗口类*/
    const TCHAR ChildClassName[20]="childwin";
    LRESULT CALLBACK ChildWndProc(HWND,UINT,WPARAM,LPARAM);
    WNDCLASS ChildWnd={CS_HREDRAW|CS_VREDRAW,ChildWndProc,
                        0,sizeof(long),NULL,NULL,
                        LoadCursor(NULL, IDC_ARROW),
                       (HBRUSH)GetStockObject(WHITE_BRUSH),
                        NULL,ChildClassName};
    
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        PSTR szCmdLine,
                        int iCmdShow)
    {
        HWND hwnd;
        FatherWnd.hInstance=hInstance;//填充父窗口类hInstance栏位
        RegisterClass(&FatherWnd);//注册
        hwnd = CreateWindow(FatherClassName,
                            TEXT("simpleprogram"),
                            WS_CAPTION|WS_SYSMENU,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            NULL, NULL, hInstance, NULL) ;//创建一个父窗口
        ShowWindow(hwnd,iCmdShow);
        UpdateWindow(hwnd);
    
        MSG msg;
        while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    LRESULT CALLBACK FatherWndProc(HWND hwnd,UINT message,
                               WPARAM wParam,LPARAM lParam)
    {
        switch(message)
        {
        case WM_LBUTTONDOWN://在显示区域内单击左键
            EnableWindow(hwnd,false);//将父窗口禁用
    
            HWND childd;
            ChildWnd.hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);//填充子窗口类hInstance栏位
            RegisterClass(&ChildWnd);//注册子窗口类
            childd = CreateWindow(ChildClassName,
                                  TEXT("..child"),
                                  WS_CAPTION|WS_SYSMENU,
                                  550, 300,
                                  300, 200,
                                  hwnd,0,
                                  (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);//创建一个子窗口
            SetWindowLong(childd,0,(long)hwnd);//将父窗口的句柄存储在附加的空间中
            ShowWindow(childd,SW_SHOWNORMAL);
            UpdateWindow(childd);
            return 0;
        case WM_PAINT://绘图
            HDC hdc;
            PAINTSTRUCT ps;
            hdc=BeginPaint(hwnd,&ps);
            TextOut(hdc,0,0,TEXT("hey"),3);
            EndPaint(hwnd,&ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);//销毁时退出
            return 0;
        }
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    
    LRESULT CALLBACK ChildWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
        case WM_PAINT://绘图
            HDC hdc;
            PAINTSTRUCT ps;
            hdc=BeginPaint(hwnd,&ps);
            TextOut(hdc,0,0,TEXT("cool"),4);
            EndPaint(hwnd,&ps);
            return 0;
        case WM_DESTROY:
            EnableWindow((HWND)GetWindowLong(hwnd,0),true);//销毁时恢复父窗口
            return 0;
        }
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    

    现在这个程序可以实现预期的功能。。不过没有达到预期的效果:

    在关闭子窗口后,本应回到父窗口并且父窗口会被置顶,而现在是父窗口反而会跑到其他窗口后面,也就是说父窗口并没有获得焦点。。

    不知问题出在何处,还望高人指点。。

    如果有更好的方法,也请指导我一下,万分感激。。

    2013年4月29日 9:09

答案

  • case WM_DESTROY:
           
    EnableWindow((HWND)GetWindowLong(hwnd,0),true);//销毁时恢复父窗口
           
    return 0;
    ---->
    case WM_CLOSE:
      EnableWindow((HWND)GetWindowLong(hwnd,0),true);//销毁时恢复父窗口
      DestroyWindow(hwnd);
      return 0;

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 Miles Shen 2013年4月30日 3:10
    2013年4月29日 14:07
    版主

全部回复

  • 没人回复啊。。
    2013年4月29日 9:34
  • case WM_DESTROY:
           
    EnableWindow((HWND)GetWindowLong(hwnd,0),true);//销毁时恢复父窗口
           
    return 0;
    ---->
    case WM_CLOSE:
      EnableWindow((HWND)GetWindowLong(hwnd,0),true);//销毁时恢复父窗口
      DestroyWindow(hwnd);
      return 0;

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 Miles Shen 2013年4月30日 3:10
    2013年4月29日 14:07
    版主
  • DialogBox/DialogBoxIndirect 创建模特对话框窗口

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年4月29日 14:09
    版主
  • 太感谢了啊~
    2013年4月30日 3:10
  • 这样做创建出来的窗口会不会受很多限制啊。。
    2013年4月30日 3:11