VC ++非mfc中的父子窗口问题

时间:2014-11-10 11:58:30

标签: winapi visual-c++

下面的代码工作正常但是当我将鼠标放在父窗口上并拖动它时,子窗口和父窗口会被分开。但是当我放置鼠标并移动它时,我希望孩子和父窗口一起移动而不会分开。我为子窗口尝试了一些像WS_DISABLED这样的东西,但它没有用。请告诉我需要做哪些修改。我的应用程序是非MFC.Below是我的代码:

void displayProgressBar()
{
HINSTANCE g_hinst;
if( (g_hinst = GetModuleHandle( L"LoadFunc.dll" )) == NULL )
{
    g_hinst = GetModuleHandle( 0 );
}
RECT screenSize;

InitCommonControls();
BOOL rc = SystemParametersInfo( SPI_GETWORKAREA, 0, &screenSize, 0 );
int height = screenSize.bottom / 15;
int width = screenSize.right / 3;
int x = (screenSize.bottom / 2) - (height / 2);
int y = (screenSize.right / 2) - (width / 2);

//  create a static window, display a graphic and attach a progress bar to it.
wchar_t currentDir[MAX_PATH];
_wgetcwd( currentDir, _MAX_PATH );
HANDLE img = LoadImage(g_hinst, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0,  LR_DEFAULTCOLOR );
//MessageBox(0,L"in",L"out",MB_OK);
hwndParent = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_STATICEDGE,
                          WC_STATIC,
                          L"install in progress",
                          WS_POPUP | WS_VISIBLE | WS_CAPTION | SS_BITMAP,
                          x,
                          y,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          hwndParent,
                          NULL,
                          g_hinst,
                          NULL) ;
                          EnableWindow(hwndPB,FALSE);
SendMessage(hwndParent, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)img);
RECT RectControl;
::GetWindowRect( hwndParent, &RectControl );

//MessageBox(0,L"1",L"1",MB_OK);
hwndPB = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_STATICEDGE,
    PROGRESS_CLASS,
    NULL,
    WS_POPUP | WS_VISIBLE,
    x + 10, // x
    RectControl.bottom - 25, // y
    RectControl.right - RectControl.left - 20, // width
    20, // height
    hwndParent,
    (HMENU) 0,
    g_hinst,
    NULL);
    EnableWindow(hwndPB,FALSE);

SendMessage(hwndPB, PBM_SETRANGE, 0,
            MAKELPARAM(0, 25));
SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 2, 0);
}

提前感谢您提供帮助。

2 个答案:

答案 0 :(得分:1)

CreateWindowExhMenu参数已重载,具有两个不同的含义,具体取决于dwStyle参数。以下是文档中的重要信息:

  

对于重叠或弹出窗口, hMenu 标识要与窗口一起使用的菜单。

     

对于子窗口, hMenu 指定子窗口标识符。

如果要使用班级菜单,则允许传递NULL重叠或弹出窗口。另一方面,不允许为子窗口传递0:0不是有效的控件标识符。 (这没有明确说明,但可以从GetDlgCtrlIDGetWindowLongPtr [GWLP_ID]返回0表示错误的事实中轻易推断出来。)

要解决您的问题,您必须应用两项更改:指定WS_CHILD窗口样式,并指定有效的子窗口ID:

hwndPB = CreateWindowEx(WS_EX_STATICEDGE,
    PROGRESS_CLASS,
    NULL,
    WS_CHILD | WS_VISIBLE,
    x + 10, // x
    RectControl.bottom - 25, // y
    RectControl.right - RectControl.left - 20, // width
    20, // height
    hwndParent,
    (HMENU) 1,    // child-window identifier; this is usually defined as a named
                  // constant in Resource.h
    g_hinst,
    NULL);

答案 1 :(得分:-1)

也许你需要为hwndPB设置WS_CHILD样式... WS_POPUP意味着“子”窗口只是禁用父节点,它们不会一起移动。

BTW,“非MFC”也称为Win32应用程序。

相关问题